JSON dizesini ayrıştırırken sözdizimi hatası

Web sayfamın bir kısmıyla örnek bir JSON oluşturdum:

{"html": {"#data": "\n

Data

\n<div class="\"manufacturer-image\"">\n \n</div>\n
<form action="\"/manage/update-manufacturer-data/3\"" method="\"post\"">\n \n 
<div class="\"field\"">\n <div class="\"label\"">\n :\n 
</div>\n \n \n <div class="\"error\"">\n 
<input id="\"id_name\"" name="\"name\"" maxlength="50" type="\"text\"">\n 
  • Pole wymagane
\n </div>\n \n </div>\n\n 
<div class="\"field\"">\n <div class="\"label\"">\n :\n 
</div>\n \n \n <div>\n <input name="\"image\"" id="\"id_image\"" type="\"file\"">\n 
</div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n 
:\n </div>\n \n \n <div>\n 

\n </div>\n \n 
</div>\n \n <div class="\"buttons\"">\n <input class="\"ajax-save-button" button\"="" type="\"submit\"">\n 
</div>\n</form>"}}

Bu dize ajax çağrısı ile döndürülür ve jQuery 1.6.1 bir hata atar:

SyntaxError: JSON.parse: expected ',' or '}' after property value in object

kodun aşağıdaki bölümünde:

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }
   //Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

   //Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        console.warn('data: ', data);
        var ret;
        try{
            ret = window.JSON.parse(data);
        } catch(e){
            ret = {};
            console.warn(e);
        }
        return ret;
        //return window.JSON.parse( data );
    }

Burada neyi özlüyorum?


DÜZENLE:

Bir önceki 'json' ile (ki bu arada python'un simplejson lib'leri ile yaratılmıştı, bu yüzden her yerde nasıl çalışabilirim diye merak ediyorum) ve şimdi jsonlint'in doğru JSON'a sahip olduğumu gösterdiğini gördüm. Yine de sorun aynı kalıyor. Yeni dize:

{"html": [{"#data": "\n

Data

\n<div class="manufacturer-image">\n    \n</div>\n<form action="/manage/update-manufacturer-data/4" method="post">\n        \n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div class="error">\n                <input id="id_name" type="text" name="name" maxlength="50" />\n                
  • Pole wymagane
\n            </div>\n        \n    </div>\n\n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div>\n                <input type="file" name="image" id="id_image" />\n            </div>\n        \n    </div>\n\n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div>\n                

\n            </div>\n        \n    </div>\n  \n    <div class="buttons">\n        <input type="submit" class="ajax-save-button button" />\n    </div>\n</form>"}]}

EDIT2: Tamam görünüyor, JSOn arka ucum bırakarak uygun ama dilsiz jQuery her '' 'etrafında garip ek tırnaklar ekler.

4
Bilmiyorum ama görünüşünden json geçersiz görünüyor ...
katma yazar Rafay, kaynak

5 cevap

storejson= getJSonObject("@ViewBag.JsonData");

function getJSonObject(value) {
    return $.parseJSON(value.replace(/"/ig, '"'));
}
10
katma

Veriler, geçerli bir JSON olan değil . Dizelerdeki \ ", " \ ile değiştirilmiş gibi görünüyor. .

Söz konusu JSON'un yazarıyla iletişim kurun ve bol miktarda olduğundan emin olun. of JSON kütüphaneler kullanılabilir için hepsi diller ve platformlar .

8
katma
@JamieRRytlewski İyi nokta. Maalesef, belirli bir doğrulama için bir bağlantı oluşturmanın bir yolunu bulamıyorum, bu yüzden ideone'da JavaScript modunu kullandım.
katma yazar phihag, kaynak
Her zaman kullanabilirsiniz: geçerli JSON olup olmadığını kontrol etmek için jsonlint.com . Ayrıca, yukarıdaki geçerli JSON değil.
katma yazar Jamie R Rytlewski, kaynak

Burada yanılmış olabilirim ama sanırım bunun nedeni JSON verisinin kendisinin işe yaramadığı. JSON ayrıştırıcısı, JSON'ed dizesi değişkeni içinde yer alan HTML'deki çift tırnak işaretini muhtemelen tıkar. HTML dizgisini JSON verisini çıkarmadan önce ön işleme koyduğunuzda çalışacağını düşünüyorum, böylece çift tırnakları başka bir şeye değiştirdiniz. (ve JSON verilerini ayrıştırdıktan sonra diğer yolu yapın)

Bir örnek biraz açıklığa kavuşabilir:

instead of this: {"html": { "#data": "<input name="somename" type="text"/>"} }

Bunu kullanmayı deneyeceğim:

{"html": { "#data": "<input name="somename" type="text"/>"} }

Umarım yardımcı olur...

3
katma
Bu benim için çalıştı. tırnak değiştirme işlemini basitleştirmek için JSON.stringify (foo) .replace (/ \\ "/ g, '\\\\"') kullandım
katma yazar Rahul Gupta-Iwasaki, kaynak

JSON = Javascript Object Notation, bunun için "# data" özelliğinin değeri geçersiz bir dizedir.

You can validate your JSON here

2
katma

Bence muhtemelen HTML kodunun kendisinde aynı çift tırnak kullanıyorsunuz, bu yüzden JSON kendi özellik değerini düşünüyor, tüm HTML için tek tırnak kullanmayı deneyin.

0
katma