Diese einfache Lösung für reguläre Ausdrücke behebt in den meisten Fällen die Anführungszeichen von JSON-Eigenschaftsnamen:
const object = { name: 'John Smith' };
const json = JSON.stringify(object); // {"name":"John Smith"}
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted); // {name:"John Smith"}
Extremfall:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
Besonderer Dank geht an Rob W für die Reparatur.
Einschränkungen
In normalen Fällen funktioniert der oben genannte reguläre Ausdruck, aber mathematisch ist es unmöglich, das JSON-Format mit einem regulären Ausdruck so zu beschreiben, dass es in jedem einzelnen Fall funktioniert (das Zählen der gleichen Anzahl von geschweiften Klammern ist mit regulärem Ausdruck unmöglich.) Daher habe ich Erstellen Sie eine neue Funktion, um Anführungszeichen zu entfernen, indem Sie die JSON-Zeichenfolge über die native Funktion formal analysieren und neu reserialisieren:
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}
Beispiel: https://jsfiddle.net/DerekL/mssybp3k/
{"foo":"e\":bar"}
(gültiger JSON) wird{foo:e:bar"}
(...)!/\\\"/
kann vereinfacht werden/\\"/
. Vergessen Sie nicht, das globale Flag hinzuzufügen/\\"/g
, da es sonst bei mehreren Zeichenfolgen unterbrochen wird\"
. Verwenden Sie für das zufällige Zeichen niemals ein wörtliches U + FFFF, falls der Editor erstickt, sondern eine Escape-Sequenz. Der reguläre Ausdruck für das Zurücksetzen würde werden/\uFFFF/g
./\"([^(\")"]+)\":/g
kann vereinfacht werden/"([^"]+)":/g
, siehe regex101.com/r/qnz0ld/2Es sieht so aus, als wäre dies eine einfache Object toString-Methode, nach der Sie suchen.
In Node.js wird dies gelöst, indem das util-Objekt verwendet und util.inspect (yourObject) aufgerufen wird. Dies gibt Ihnen alles, was Sie wollen. Folgen Sie diesem Link für weitere Optionen, einschließlich der Tiefe der Anwendung der Methode. http://nodejs.org/api/util.html#util_util_inspect_object_options
Was Sie also suchen, ist im Grunde ein Objektinspektor, kein JSON-Konverter. Das JSON-Format gibt an, dass alle Eigenschaften in doppelte Anführungszeichen gesetzt werden müssen. Daher wird es keine JSON-Konverter geben, die das tun, was Sie wollen, da dies einfach kein JSON-Format ist. Angaben hier: https://developer.mozilla.org/en-US/docs/Using_native_JSON
Abhängig von der Sprache Ihres Servers benötigen Sie ein Objekt für eine Zeichenfolge oder eine Überprüfung.
quelle
.toSource()
funktioniert auch in nodejs einwandfrei, funktioniert jedoch nicht in Objekten in Arrays. Dieutil
Inspektion funktioniert für Arrays und Objekte in Arrays, was wunderbar ist, ich liebe es.util.inspect()
Ich habe beim Schreiben eines Objekts in eine Neo4j-Abfrage einfach großartig funktioniert, um mehrere Parameter gleichzeitig festzulegen.Sie können sich den Quellcode eines Parsers ansehen, der von demjenigen erstellt wurde, der das JSON-Format definiert hat . Suchen Sie nach Funktionsaufrufen: Diese umgeben einen Wert in Anführungszeichen. Die Schlüssel sind in den Zeilen 326 und 338 angegeben .
json2.js
quote
Schließen Sie die Bibliothek nach der Änderung nicht ein. Nehmen Sie stattdessen nur den relevanten (
stringify
) Teil oder ersetzen Sie ihn zumindest durchJSON
etwas anderes, z.FAKEJSON
.Zum Beispiel ein Objekt,
FAKEJSON
das nur definiert hatstringify
: http://jsfiddle.net/PYudw/quelle
JSON.stringify
Teil und entfernen Sie die Anführungszeichen. Da die Bibliothek von demjenigen erstellt wird, der JSON definiert hat , können wir ziemlich sicher sein, dass das Ergebnis sehr gültiges JSON ist..toSource()
funktioniert gut, schließt aber nicht ein, wenn sich Ihr Objekt in einem Array befindet, das ein Mist ist (und ich bin auf dem Knoten, so dass die Browserkompatibilität kein Problem darstellt: P), also werde ich diese Methode verwenden, danke auch an @RobW, der jsfiddle-Link scheint auf derVersuchen Sie, den Dienst mit JSONP zu verwenden. Ich denke, sie bieten ihn an, wenn Sie dieses Format verwenden.
Andernfalls reichen Sie ihnen einen detaillierten Fehlerbericht mit einer guten Argumentation ein, warum die dem Standard entsprechen sollten. Eine andere Lösung als die Beseitigung des Quellproblems ist keine echte Lösung.
Eine schnelle Lösung könnte darin bestehen, den String vor dem Parsen durch einen regulären Ausdruck zu leiten:
Oder Sie versuchen, einen vorhandenen Javascript-JSON-Parser (wie diesen ) anzupassen, wenn Sie eine syntaktischere Analyse wünschen.
quelle
Ich habe ein gutes NPM-Paket gefunden, um genau dies zu tun:
https://www.npmjs.com/package/stringify-object
Funktioniert ziemlich gut.
quelle
Ihre geerbte Syntax sollte von YAML, einer Obermenge von JSON, leicht zu essen sein.
Probieren Sie den JavaScript YAML Parser und Dumper aus: http://nodeca.github.com/js-yaml/
quelle
@Derek 朕 會 功夫 Vielen Dank, dass Sie diese Methode freigegeben haben. Ich möchte meinen Code freigeben, der auch das Stringifizieren eines Arrays von Objekten unterstützt.
quelle
JSON.stringify
zum Beispiel auch Datum verwenden. Geben Sie auch zurück,'null'
wennobj_from_json
null ist.if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
Verwenden
JSON5.stringify
JSON5 ist eine Obermenge von JSON, die ES5-Syntax einschließlich nicht zitierter Eigenschaftsschlüssel ermöglicht. Die JSON5-Referenzimplementierung (
json5
npm-Paket ) bietet einJSON5
Objekt mit denselben Methoden und denselben Argumenten und derselben gleichen Semantik wie das integrierteJSON
Objekt.Es ist sehr wahrscheinlich, dass der von Ihnen verwendete Dienst diese Bibliothek verwendet.
quelle
Der JSON Beautifier von CSVJSON bietet die Möglichkeit, Anführungszeichen auf Schlüsseln zu setzen. Wenn Sie nur den Code möchten, können Sie ihn aus dem GitHub-Repo kopieren. Ich habe Douglas Crockfords JSON2 modifiziert , um dies zu unterstützen.
quelle
hacked by AnoaGhost