Fac cereri la serverul meu folosind jQuery.post()și serverul meu se întoarce obiecte JSON (ca
{ "var": "valoarea", ... }). Cu toate acestea, dacă oricare dintre valorile conține un singur citat (în mod corespunzător a scăpat ca
\'`), jQuery nu reușește să elimine o altfel valabil JSON string. Aici este un exemplu de ceea ce vreau să spun (face în Chrome consola):
data = "{ \"status\": \"success\", \"newHtml\": \"Hello \\\'x\" }";
eval("x = " + data); // { newHtml: "Hello 'x", status: "success" }
$.parseJSON(data); // Invalid JSON: { "status": "success", "newHtml": "Hello \'x" }
Este normal acest lucru? Nu există nici o modalitate de a trece în mod corespunzător un singur citat, prin JSON?
Potrivit statului diagrama mașină pe JSON-ul, a scapat doar cu dublu-citat de caractere sunt permise, nu singur-citate. Singur citat de caractere nu trebuie să fi scăpat:
Actualizare - Mai multe informații pentru cei care sunt interesati:
Douglas Crockford nu spune în mod specific ce JSON caietul de sarcini nu permite scăpat singur citate în termen de siruri de caractere. Cu toate acestea, în timpul discuțiilor de JSON în Anexa E de JavaScript: Părțile Bune, el scrie:
JSON's design goluri au fost să fie minim, portabil, textual, și un subset de JavaScript. Cu atât mai puțin trebuie să fie de acord, în scopul de a interopera, cu atât mai ușor ne pot interopera.
Așa că, probabil, el a decis pentru a permite doar siruri de caractere pentru a fi definite folosind dublu-citate din moment ce aceasta este una mai puțin regula că toate JSON implementări trebuie să de acord. Ca urmare, este imposibil pentru un singur citat caracter într-un șir accidental termina șir, pentru că, prin definiție, un șir de caractere poate fi reziliat printr-un dublu-citat de caracter. Prin urmare, nu este nevoie pentru a permite evadarea de un singur citat personaj din specificatie.
textele produse de toString metode strict conforme cu sintaxa JSON reguli. Constructorii sunt mai iertătoare în textele vor accepta:
...
- Siruri de caractere poate fi citat cu ' (apostrof).
Acest lucru este confirmat de JSONTokener codul sursă. Anii nextString
metoda acceptă scăpat singur citat personaje și le tratează doar ca dublu-citat de caractere:
public String nextString(char quote) throws JSONException {
char c;
StringBuffer sb = new StringBuffer();
for (;;) {
c = next();
switch (c) {
...
case '\\':
c = this.next();
switch (c) {
...
case '"':
case '\'':
case '\\':
case '/':
sb.append(c);
break;
...
În partea de sus a metodei este o informative comentariu:
formal format JSON nu permite siruri de caractere în ghilimele simple, dar punerea în aplicare este permis să le accepte.
Deci, unele implementări va accepta ghilimele simple - dar tu nu ar trebui să se bazeze pe acest lucru. Cele mai populare implementări sunt destul de restrictive în acest sens și va respinge JSON care conține un singur citat siruri de caractere și/sau a scăpat singur citate.
În cele din urmă pentru a lega înapoi la întrebarea inițială, jQuery.parseJSON
primele încercări de a utiliza browser-ul's nativi JSON parser sau o bibliotecă încărcată precum json2.js unde este cazul (care pe o notă parte este biblioteca jQuery logica se bazează pe dacă JSON
nu este definit). Astfel, jQuery poate fi doar la fel de permisiv ca fond al sistemului de implementare:
parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
jQuery.error( "Invalid JSON: " + data );
},
După câte știu, aceste implementări numai să adere la oficial JSON caietul de sarcini și nu acceptă un singur citate, prin urmare nici nu jQuery.
Dacă aveți nevoie de un singur citat în interiorul unui șir de caractere, deoarece \' este nedefinit de spec, utilizat `\u0027 vezi http://www.utf8-chartable.de/ pentru toate acestea
edit: te rog scuza-mi greșită a cuvântului backticks în comentarii. Am vrut backslash. Ideea aici este că, în cazul în care ați imbricate siruri de caractere în interiorul alte siruri de caractere, cred că poate fi mai util și ușor de citit pentru a folosi unicode în loc de o mulțime de backslash-uri pentru a scăpa de un singur citat. Dacă nu sunt imbricate cu toate acestea, acesta este cu adevărat mai ușor de a pune doar un simplu citat acolo.
Am înțeles în cazul în care problema se află și când mă uit la specificatiile sale clar că fără șir escape singur citate ar trebui să fie analizat în mod corect.
Eu sunt, folosind jquery jQuery.parseJSON funcția parse JSON string, dar încă obtinerea de eroare de analiză atunci când există un singur citat în date că este pregătit cu json_encode.
Ar putea fi o greșeală în punerea în aplicare a mea care arata ca acest lucru (PHP - partea de server):
$data = array();
$elem = array();
$elem['name'] = 'Erik';
$elem['position'] = 'PHP Programmer';
$data[] = json_encode($elem);
$elem = array();
$elem['name'] = 'Carl';
$elem['position'] = 'C Programmer';
$data[] = json_encode($elem);
$jsonString = "[" . implode(", ", $data) . "]";
Pasul final este că am stoca reprezentat JSON string într-un JS variabilă:
<script type="text/javascript">
employees = jQuery.parseJSON('<?=$marker; ?>');
</script>
Dacă am folosi "<?=$marker; ?>" în loc de '<?=$marker; ?>' încă mai aruncă o eroare.
SOLUȚIE:
Singurul lucru care a lucrat pentru mine a fost de a utiliza masca de biti JSON_HEX_APOS pentru a converti ghilimele simple astfel:
json_encode($tmp, JSON_HEX_APOS);
Există un alt mod de a aborda această problemă? Este codul meu greșit sau prost scris?
Multumesc
Atunci când se trimite un singur citat într-o interogare
empid = " T'via"
empid =escape(empid)
Când Ai valoare, inclusiv un singur citat
var xxx = request.QueryString("empid")
xxx= unscape(xxx)
Dacă doriți să căutați/ introduce valoarea care include un singur citat într-o interogare
xxx=Replace(empid,"'","''")
Izbitoare o problemă similară, folosind CakePHP la ieșire un script JavaScript-bloc folosind PHP's nativ json_encode
. $contractorCompanies
conține valori care au ghilimele simple și explicat mai sus cum și era de așteptat json_encode($contractorCompanies)
nu't scăpa de ele pentru că JSON valid.
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".(json_encode($contractorCompanies)."' );"); ?>
Prin adăugarea addslashes() în jurul reprezentat JSON string atunci scape ghilimele permițându-Tort / PHP echo corectă javascript pentru browser-ul. Erori JS dispar.
<?php $this->Html->scriptBlock("var contractorCompanies = jQuery.parseJSON( '".addslashes(json_encode($contractorCompanies))."' );"); ?>
Interesant. Cum ai generarea JSON pe server end? Ești folosind o bibliotecă de funcții (cum ar fi `json_encode în PHP), sau construirea JSON string de mână?
Singurul lucru care-mi captează atenția, este evadarea apostrof (\'
). Văzându-te're folosind ghilimele, după cum într-adevăr ar trebui, nu există nici o nevoie pentru a scăpa de ghilimele simple. Pot't verificați dacă asta este într-adevăr cauza pentru jQuery eroare, ca nu am't actualizat la versiunea 1.4.1 încă.
Am fost încercarea de a salva un obiect JSON de la un XHR cerere într-un HTML5 date* atribut. Am încercat multe dintre soluțiile de mai sus cu nici un succes.
Ceea ce am în cele din urmă ajunge să faci a fost înlocuirea singur citat ' cu codul'
folosind un regex după stringify() metoda în felul următor:
var productToString = JSON.stringify(productObject);
var quoteReplaced = productToString.replace(/'/g, "'");
var anchor = '<a data-product=\'' + quoteReplaced + '\' href=\'#\'>' + productObject.name + '</a>';
// Here you can use the "anchor" variable to update your DOM element.