JSON.parse Fehlschlägt, in Safari, wenn Sie einen string-Wert ein Komma enthält
Baue ich einen Einkaufswagen, die, wenn ein "Kaufen" - button gedrückt wird, wird ein web-service liefert einen JSON-Ausgabe, die ich dann speichern Sie Sie in eine Javascript-cookie als string.
Eine typische Rückkehr aus dem web-Dienst werden könnte:
{
"d":{
"58658":{
"id":"58658",
"qty":"1",
"singlePrice":"754",
"salePrice":"754",
"isBulk":"0",
"isSor":"0",
"vatRate":"20.00",
"masterCat":"6",
"imgUrl":"http://...img url",
"singleWeight":"18000",
"totalAvailableStock":"2",
"thirdPartyStock":"",
"item":"Electrovoice Live X Elx115p, Each " //<< HERE IS THE ISSUE
}
}
}
Wenn die Rückkehr sieht aus wie die oben, wird es nicht in Safari NUR
Haben viel Zeit damit verbracht, zu versuchen, finden Sie einige nützliche Mechanismus zu Debuggen, ohne den Kauf ein Mac, ich habe schließlich verfolgt es auf:
"item":"Electrovoice Live X Elx115p, Each " //<< HERE IS THE ISSUE - The comma
Den item
Wert hat, ein Komma in der Zeichenfolge, ich meine den return Wert in ein cookie mit etwas wie:
cookies.set('shopping_cart', JSON.stringify(result)); //(where result is the JSON above)
Wenn ich versuche, rufen Sie es später:
var shopping_cart = cookies.get('shopping_cart');
shopping_cart = JSON.parse(shopping_cart);
Es funktioniert in JEDEM browser, auch, anscheinend, Internet Explorer... AUßER Safari
Ich habe keinen Mac also nicht sicher, ob Safari auf dem Mac ist anders, aber sicherlich die Windows-version hat diesen Fehler, und so ist es nicht auf meinem iPhone und iPad.
Der Fehler ist:
JSON parse error, unterminated string.
Wie gesagt, dies zu sein scheinen, ein Problem nur in Safari, habe Schwierigkeiten, die Suche nach einer Lösung, obwohl.
Hilfe viel geschätzt!
EDIT:
Habe ich eine Fiddle: http://jsfiddle.net/jhartnoll/2GLEz/
Diese Geige repliziert die Frage, ist es in Bezug auf die Speicherung der Daten als string in einem Cookie und die re-Analyse zu JSON
Aber, denn ich habe meinen Cookie-Funktionen als Externe Ressource ( http://www.sam.thinkka.com/clientscripts/cookie_test.js ), die Sie benötigen, um sicherzustellen, dass Safari nicht blockiert cookies von Drittanbietern.
- Nein, das Komma ist nicht das Problem
- Können Sie ein jsFiddle Beispiel, das dieses problem in Aktion?
- Für das Protokoll, ich habe Ihre JSON-string zu gut funktionieren in Safari mit jsFiddle... siehe jsfiddle.net/KRR2N Das einzige was ich geändert habe ist das entfernen der
// << HERE IS THE ISSUE
Kommentar, da das ungültige JSON, aber ich denke, das war nicht in deinem ursprünglichen code. - danke. Ich habe auch schon in der Lage, um es arbeiten mit Fiddle, allerdings habe ich extendeed der Fiddle, um meine
cookies
Funktionen und bekommt jetzt eigentlich einen anderen Fehler! Was darauf hindeutet Cookies nicht funktionieren, aber Sie sind auf alles andere! jsfiddle.net/jhartnoll/2GLEz - Argh - Bearbeiten - ignorieren, dass der Grund, Cookies nicht funktionieren ist Safari blockiert mein Skript enthalten!
- OK, man MUSS halt Safari blockieren von Drittanbieter-Skripten für die Geige zu arbeiten, aber es ist hier: jsfiddle.net/jhartnoll/2GLEz
- Ähm... ich denke, dass das problem nichts zu tun, JSON, oder meine Cookies, aber discussions.apple.com/thread/4078916?start=0&tstart=0
- Okay, ich denke, jetzt haben wir Ihr fiddle-code gelangen wir zu dem springenden Punkt des Problems. Im Grunde läuft es auf die Flucht. Aber siehe meine Antwort für mehr.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, jetzt haben wir die Wurzel des eigentlichen Problems, ich denke, ich kann helfen.
Das problem ist im Grunde, dass man das speichern von Daten in der cookie-string, aber nicht vorbei. Also, wenn Sie das cookie und es enthält Kommas, die Kommas kann man als cookie-Trennzeichen. Für die meisten der Zeichenfolge, die Anführungszeichen in das JSON zu sein scheinen Maskierung dieser Effekt (Zitate sind auch Zeichen für cookies), aber für diese ist es gesehen zu werden, indem Sie die cookie-parser als Trennzeichen.
Dies wiederum bedeutet, dass man es als das Ende des Cookies, das heißt, wenn Sie laden Sie es zurück, ist es an dieser Stelle abgeschnitten.
Lösung: Escape-Zeichenfolge, bevor Sie es speichern als cookie. (Ihr
makeCookie()
Funktion sollten dies tun). Sie sollten in der Lage sein zu verwenden, die JSescape()
Funktion für diese.Sehen die cookie-Spezifikation, und beachten Sie, dass Kommas, Anführungszeichen, Semikolon, und mehr relevant sind Zeichen für cookies.
Siehe auch: dieses ähnliche Problem
Als warum es passiert in Safari und nicht einen anderen Browser... ich denke, das ist wohl zum Glück wie vieles andere auch. Vielleicht sind die anderen Browser, cookie-Parser erkennt, dass die folgende Zeichenfolge nach dem Komma ist nicht gültig und damit arbeiten heraus, dass das Komma ist nicht gedacht als ein Trennzeichen.
Möchten Sie vielleicht auch, um zu sehen, die MDN-cookie-Artikel, die enthält den code für eine Probe JS-coookie-Bibliothek, die nicht alles tun, die richtige Flucht. Möchten Sie vielleicht zu prüfen, mit dieser lib anstelle von eigenen aktuellen code. (oder zumindest Teile davon)
Hoffe, das hilft.
Schließlich, etwas off-topic, aber eine weitere Sache zu beachten bei der Verwendung von cookies: vergessen Sie nicht, dass die gesamte cookie-string übertragen wird, in beide Richtungen für jeden einzelnen http-Anfrage auf Ihrer Website. Also, wenn du hast 4k von cookie-Daten, das bedeutet, dass eine zusätzliche 8k-Bandbreite für jedes html -, css -, js-und image-Datei auf Ihrer Website.
Wenn Sie große cookies, gibt es alternative Möglichkeiten, die zum speichern von lokalen Daten, die nicht unter diesem problem. Dieser Artikel für Sie nützlich sein könnte.
brauchen Sie nicht zu Parsen von json...
versuchen: