2012-04-08 1 views
3

Ich habe folgende JSON: http://pastebin.com/Sh20StJYFirefox pref ist JSON zerstören

SO entfernt, um die Zeichen auf meinem Posten, so sehen Sie den Link für die reale JSON

, die erzeugt wurde unter Verwendung von JSON.stringify und gespeichert auf Firefox-Einstellungen (pref.setCharPref(prefName, value);)

Das Problem ist, dass, wenn ich den Wert speichern, Firefox etwas tut, das den JSON verdirbt. Wenn ich einen JSON.parse Abrufen der Wert aus der Konfigurations versuchen bekomme ich einen Fehler:

Error: JSON.parse: bad control character in string literal 

If I try to validate the above JSON (die sich von den Einstellungen abgerufen wurde) Ich erhalte eine Fehlermeldung bei line 20 enthält der Token-Wert zwei ungültige Zeichen.

Wenn ich eine JSON.parse sofort nach JSON.stringify versuche, tritt der Fehler nicht auf.

Muss ich etwas einstellen, um in einer anderen Kodierung zu speichern? Wie kann ich es reparieren?

+1

Wie sieht die gespeicherte Konfiguration eigentlich aus? Der JSON in Ihrer Frage ist gültig. – Collin

+0

@Collin Ich denke, SO entfernt die Zeichen ... 'Tokens' hat zwei unsichtbare Zeichen: http://pastebin.com/Sh20StJY – BrunoLM

Antwort

4

nsIPrefBranch.getCharPref() funktioniert nur für ASCII-Daten, Ihre JSON-Daten enthalten jedoch einige Nicht-ASCII-Zeichen. Sie können in den Einstellungen Unicode-Daten speichern, es ist nur ein wenig komplizierter:

var str = Components.classes["@mozilla.org/supports-string;1"] 
        .createInstance(Components.interfaces.nsISupportsString); 
str.data = value; 
pref.setComplexValue(prefName, Components.interfaces.nsISupportsString, str); 

Und diese Präferenz zu lesen:

var str = pref.getComplexValue(prefName, Components.interfaces.nsISupportsString); 
var value = str.data; 

Zum Vergleich: Documentation

+0

Das ist super super! Habe meinen Tag gerettet. Ich habe das genaue Problem, dass meine UTF-8-codierte Zeichenfolge von \ uxxxx in ein falsches Zeichen konvertiert wurde, und "JSON.parse" schlägt einfach fehl, wenn die Zeichenfolge gelesen wird. ;) +1! –

0

Der Code scheint korrekt zu sein. Verwenden Sie einfache Anführungszeichen '..': '...' anstelle von Anführungszeichen "..": "...".

0

ich noch nicht die Lösung finden konnte, aber ich fand eine Abhilfe:

var b = ""; 
[].forEach.call("{ JSON STRING }", function(c, i) { 
    if (c.charCodeAt(0) >= 32) 
     b += c; 
}); 

Jetzt b ist das neue JSON, und könnte funktionieren ...

1

Ihre JSON erscheint nicht enthalten ASCII-Zeichen wie . Können Sie überprüfen, in welcher Kodierung alles gehandhabt wird?

nsIPrefBranch.setCharPref() setzt voraus, dass seine Eingabe UTF-8-codiert ist und der Rückgabewert nsIPrefBranch.getCharPref() immer eine UTF-8-Zeichenfolge ist. Wenn Ihre Eingabe eine Bytefolge oder ein Zeichen in einer anderen Codierung ist, müssen Sie entweder zu UTF-8 wechseln oder sie selbst codieren und dekodieren, wenn Sie mit den Einstellungen interagieren.

+0

Sehr nah, aber keine Zigarre :) Siehe meine Antwort. –

+0

@WladimirPalant Huh, ich vermute ich habe die Dokumentation falsch interpretiert. Vielen Dank! – ephemient

1

ich dies in einem tat stellen Sie dieses Problem zu beheben:

(function overrideJsonParse() { 
    if (!window.JSON || !window.JSON.parse) { 
     window.setTimeout(overrideJsonParse, 1); 
     return; //this code has executed before JSON2.js, try again in a moment 
    } 
    var oldParse = window.JSON.parse; 
    window.JSON.parse = function (s) { 
     var b = "", i, l = s.length, c; 
     for (i = 0; i < l; ++i) { 
      c = s[i]; 
      if (c.charCodeAt(0) >= 32) { b += c; } 
     } 
     return oldParse(b); 
    }; 
}()); 

Das in IE8 funktioniert (usin g json2 oder was auch immer), IE9, Firefox und Chrome.