2011-11-04 12 views
7

W Django szablonu Mam wydrukowane dane tak:JSON parse - apostrof wewnątrz nazwy

P.place = '{{place.json|safe}}'; 

Następnie w pliku JavaScript Mam paring to tak:

place = JSON.parse(P.place); 

Wszystko jest w porządku dla danych tak:

{"category": "Cars", "name": "Z"} 

Ponieważ ciąg wygląda tak:

P.place = '{"category": "Cars", "name": "Z"}' 

Tak, mogę analizować go za pomocą metody JSON.parse i akceptować ciągi jako dane wejściowe.

Problem jest, gdy mam danych tak:

{"category": "Cars", "name": "Wojtek's Z"} 

Ponieważ niż ciąg wejściowy dla JSON parsera wygląda tak:

'{"category": "Cars", "name": "Wojtek' 

nie mogę uciec pojedynczego cudzysłowu wewnątrz JSON ciąg, bo wtedy JSON ciąg staje się nieprawidłowy. Z tego samego powodu nie mogę zastąpić otaczających cytatów podwójnymi i uciec podwójnymi cudzysłowami w ciągu znaków JSON.

Moje rozwiązanie wygląda tak:

W szablonie HTML:

P.place = {{place.json|safe}}; 

Następnie w JavaScript

var place = JSON.stringify(P.place); 
place = JSON.parse(place); 

To działa, ale nie jest to rozwiązanie optymalne IMHO.

Jak rozwiązać ten problem w bardziej sprytny sposób?

+0

MUSISZ cytować apostrofy w JSON, nie ma możliwości obejścia tego. Ale zwykle można uciec przed tym, definiując obiekt za pomocą "\". Lub jeśli wolisz, ucieczka unikodami \ u0027 (chyba). – StaxMan

+0

Nie możesz tego zrobić, sprawdź jsonlint.com i json.org. –

+0

Nie możesz tego zrobić? Sprawdź specyfikację json. – StaxMan

Odpowiedz

8

mogę myśleć o dwóch możliwości:

Tworzenie elementu skryptu typu application/json, wstrzyknąć danych szablonów do niego, a następnie odczytać swoje dane, np.

<script id="place-json" type="application/json"> 
    {{place.json|safe}} 
</script> 
<script type="application/javascript"> 
    P.place = $('#place-json').text(); 
</script> 

Lub ręcznie uciec przed pojedynczymi wstrzyknięciami przed wstrzyknięciem struny, np.

simplejson.dumps(yourdata).replace("'", r"\'") 
+0

Dzięki za odpowiedź! Jednak myślę, że to rozwiązanie jest bardziej kosztowne niż moje. BTW, nie możemy użyć id w elemencie skryptu. –

+0

Dlaczego nie możesz użyć identyfikatora wewnątrz elementu skryptu? –

+0

http://stackoverflow.com/questions/2741441/giving-the-script-tag-an-id dla informacji o id w elemencie skryptu. Podejrzewam, że albo jest mniej obciążony niż wiązanie, a następnie ponowne przetwarzanie JSON, chociaż powinieneś oczywiście sprawdzić i zobaczyć. –