2010-06-30 17 views
11

JSON biçimi, tek tırnakların çıkarılmaması gerektiğini belirttiğinden, çoğaltılmış tek bir alıntı varsa, çoğu kitaplık (veya yerel JSON ayrıştırıcısı) başarısız olur. Şimdi bu genellikle bir sorun değildir, çünkü çoğu zaman JSON olarak biçimlendirilmiş bazı verileri getiren bir XHR yaparsınız ve JSON dizginizi içeren, daha sonra ayrıştırabileceğiniz responseText'i kullanırsınız.JSON literal dizesi nasıl kullanılır?

Bu özel durumda, Bir veritabanında metin olarak saklanan bir JSON dizim var ... böylece veritabanı {"property":"value"} gibi bir şey içeriyor ve bunu sunucu tarafından oluşturulan bir HTML sayfasının parçası olarak çıkarmak istiyorum, böylece bu sayfadaki JavaScript kodu şuna benzer: Şimdi

var x = '{"property":"value"}'; 

veritabanında JSON dizesi böyle tek tırnak içeriyorsa:

{"property":"val'ue"} 

Sonra onu kaçmak gerekir yoksa ben bir dize olarak kullanmak mümkün olmayacak: {"prop":"val\'ue"} geçerli bir JSON dize sayılmaz neden o zaman

console.clear(); 
var obj = {prop:"val'ue"}; 
var str = JSON.stringify(obj); 
console.log("JSON string is %s",str); 
console.dir(JSON.parse(str)); //No problem here 


//This obviously can't work since the string is closed and it causes an invalid script 
//console.dir(JSON.parse('{prop:"val'ue"}')); 

//so I need to escape it to use a literal JSON string 
console.dir(JSON.parse('{"prop":"val\'ue"}')); 

soru nedir?

+0

so, 'console.dir (JSON.parse ('{" prop ":" val \' ue "} '))' ile ilgili sorun nedir? Benim için çalışıyor (krom) – mykhal

+0

Doğru işe yaradı, bu sorunun neden bu kadar geçersiz JSON {"prop": "valu \ 'ue"} (şartnameye göre) olduğunu düşündüğüm gibi bir durumda olduğu zaman ihtiyacım vardı bunu dizininize eklemek. Bu zaten kodlanmış bir JSON dizesini yeniden işlemek için beni zorluyor. – SBUJOLD

cevap

4

- dize '{"prop":"val\'ue"}' değişmezi bir dize olarak JSON kodlamak için bir doğru yolu olduğunu.

JavaScript yorumcusu tek tırnaklı dizeyi okuduğunda, \' değerini ''a dönüştürecektir. Dizenin değeri değeri geçerli JSON olan {"prop":"val'ue"}'dur.

geçersiz JSON dizesi oluşturmak için, ben soru doğru, bir kodu çözülmüş sürümüne bazı değişken ayarlayacaktır JavaScript kodu üretmek için çalışıyoruz anlıyorsanız '{"prop":"val\\\'ue"}'

yazmak zorunda kalacak Veritabanında depoladığınız JSON dizesi. Artık dizeyi yeniden kodladığınız için, bu dizeyi JavaScript’e aktarmanın yolu JSON.parse()’dan geçen bir dize değişmezi kullanmaktır. JSON dizesini bir JavaScript dizesi değişmezi olarak kodlamak için sunucu tarafı JSON kodlayıcısını kullanmaya güvenebilirsiniz. Mesela: Eğer JSON geçerli olacak ve ekstra ayrıştırma/hata kontrolü ağırlığını gerekmez% 100 eminseniz

<?php $jsonString = '{"prop":"val\'ue"}'; ?> 
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>); 
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}"); 
// And results: Object - { prop: "val'ue"} 

Ancak - tüm bu ekstra kodlama atlayıp sadece olabilir write:

var myJson = <?php echo $jsonString; ?> 

Unutmayın, JSON, nesneleri tanımlamak için geçerli bir JavaScript sözdizimidir!

+1

Thx'in bir parçası, kesinlikle yanlış düşünmeye girdim, en iyisi kesinlikle dediğin gibi yeniden kodlamak, bu şekilde javaScript yorumlayıcısı 'yorumlanmış' dize değerini saklar ve değişkenin VALUE değerinin geçerli bir JSON dizesi olmasına neden olur. – SBUJOLD

+0

@SBUJOLD - sorun değil :) seni doğru yola yönlendirebileceğime sevindim! – gnarf

+1

+1 İyi bir açıklama. – amelvin

2
o tek tırnak kaçış olmadan geçerlidir jsonlint göre

, bu nedenle bu gayet:

{"prop": "val'ue"} 

Ama bu geçersiz:

:

{"prop":"val\'ue"} 

göre json json.org için

tamamen dilden bağımsızdır, ancak fa olan kuralları kullanır. C, C++, C#, Java, dahil dillerin C-ailesinin programcılar, miliar JavaScript, Perl, Python ve birçok diğerleri

Yani c tipi dillerinde dil kuralları olan ters katı ile ilgili (\), örneğinizin geçerli olmadığı anlamına gelir.

+0

+1 bu kesinlikle "Neden JSON dizelerinde geçerli değil" soruları yanıtlıyor – gnarf

1

Aşağıdakileri deneyebilirsiniz, ancak çirkin.

JSON.parse("{\"obj\":\"val'ue\"}");

Ya da sadece ilk bir var dize saklayın. Bu, literal ters eğik değeri saklamamalıdır ve bu nedenle JSON ayrıştırıcısının çalışması gerekir. JavaScript'inizde


var str = '{"obj" : "val\'ue"}'; 
JSON.parse(str); 

İlgili konular