Dies würde jeden Wert im angegebenen Dokument rekursiv untersuchen und diejenigen auswählen, bei denen es sich um Zahlen handelt. Die ausgewählten Werte werden dann in Zeichenfolgen konvertiert. Genau genommen würde es auch die Schlüssel betrachten, aber da dies in JSON keine einfachen Zahlen sein können, würde kein Schlüssel ausgewählt.
Beachten Sie, dass es {"a":{"b":1},"b":null}zu{ "a": "{\"b\":1}", "b": "null" }
Stéphane Chazelas
@ StéphaneChazelas Ja, es würde Unterobjekte in Strings verwandeln. Die angegebene Datenstruktur enthält jedoch keine Unterobjekte.
Kusalananda
2
Nicht nur Unterobjekte, sondern alle Werte, einschließlich Arrays, Boolesche Werte und null(IMO ist immer noch erwähnenswert, obwohl das OP-Beispiel keine davon enthält).
Stéphane Chazelas
Und wie kann ich das ändern, wenn ich ein Array habe?
VK
@ StéphaneChazelas sortiert. Danke, dass du mich angestupst hast.
Kusalananda
8
Hier ist eine einfache Lösung, die auf dem jtcUnix-Dienstprogramm basiert :
Wenn Sie Nullwerte angeben möchten, geben Sie einfach einen Gehweg ein -w'<>n:'
Wenn Sie boolesche Werte zitieren möchten, geben Sie einen Gehweg ein -w'<any>b:'
Auch die umgekehrte Aufgabe (alle Zahlen aufheben) kann auf ähnliche Weise leicht erreicht werden: Sagen wir, sie file.jsonist bereits "enquoted", um alle Zahlen aufzuheben:
Warum verwenden Sie \{1,\},? Um zu testen, ob ein Element einmal oder mehrmals vorkommt, verwenden Sie +. Und dies funktioniert nicht für Zahlen wie -123, 0xab, 0o12, 0b1011, 1e23 oder 1.2e3 ...
phuclv
@phuclv \{1,\}ist das BRE-Äquivalent von ERE +. Einige sedImplementierungen unterstützen \+als Erweiterung oder als -Eoder -rOption zum Aktivieren von EREs, dies ist jedoch nicht portierbar. \?ist eine andere nicht tragbare Erweiterung, deren Standardäquivalent ist\{0,1\}
Stéphane Chazelas
@phuclv Sie würden keine nicht zitierten 0xab 0o12 0b1011-Nummern in einer gültigen JSON-Datei finden.
{"a":{"b":1},"b":null}
zu{ "a": "{\"b\":1}", "b": "null" }
null
(IMO ist immer noch erwähnenswert, obwohl das OP-Beispiel keine davon enthält).Hier ist eine einfache Lösung, die auf dem
jtc
Unix-Dienstprogramm basiert :Wenn Sie Änderungen direkt in die JSON-Datei übernehmen möchten, verwenden Sie den
-f
Schalter wie folgt:Die vorgeschlagene Lösung funktioniert korrekt mit beliebig strukturierten jsons, z.
-w'<>n:'
-w'<any>b:'
Auch die umgekehrte Aufgabe (alle Zahlen aufheben) kann auf ähnliche Weise leicht erreicht werden: Sagen wir, sie
file.json
ist bereits "enquoted", um alle Zahlen aufzuheben:UPDATE : Die neueste Version von
jtc
implementiert jetzt Vorlagen und Namespaces. Damit ist kein Aufruf der externen Shell erforderlich:jtc
Benutzerhandbuch: https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.mdquelle
Würde alles zitieren, was nicht zitiert wird und nicht
[]{}:,whitespace
, würde also Zahlen zitierentrue
,false
undnull
.Würde speziell zitieren, was mit der Spezifikation einer JSON-Nummer übereinstimmt und was nicht bereits in Anführungszeichen steht.
Diese machen eine exakte Tokenisierung basierend auf der JSON-Spezifikation, es ist keine Annäherung.
quelle
Ich habe es mit der folgenden Methode versucht und es hat gut funktioniert.
Ich habe 2-mal versucht, es auf mein Niveau zu reduzieren
Befehl:
Ausgabe:
quelle
\{1,\},
? Um zu testen, ob ein Element einmal oder mehrmals vorkommt, verwenden Sie+
. Und dies funktioniert nicht für Zahlen wie -123, 0xab, 0o12, 0b1011, 1e23 oder 1.2e3 ...\{1,\}
ist das BRE-Äquivalent von ERE+
. Einigesed
Implementierungen unterstützen\+
als Erweiterung oder als-E
oder-r
Option zum Aktivieren von EREs, dies ist jedoch nicht portierbar.\?
ist eine andere nicht tragbare Erweiterung, deren Standardäquivalent ist\{0,1\}