Wie soll ich beim manuellen Erstellen von JSON-Daten Zeichenfolgenfelder umgehen? Sollte ich so etwas wie Apache Commons Lang StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
oder soll ich verwenden java.net.URLEncoder
?
Das Problem ist, dass bei der Verwendung SEU.escapeHtml
keine Anführungszeichen entstehen und wenn ich die gesamte Zeichenfolge in ein Paar von '
s einbinde, wird ein fehlerhafter JSON generiert.
'
einschließen, sind Sie von Anfang an zum Scheitern verurteilt: JSON-Zeichenfolgen können nur mit umgeben werden"
. Siehe ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
Gliederung. Es ist ziemlich nützlich.Antworten:
Suchen Sie im Idealfall eine JSON-Bibliothek in Ihrer Sprache , der Sie eine geeignete Datenstruktur zuführen können, und lassen Sie sie sich Gedanken darüber machen, wie Sie den Dingen entkommen können . Es wird dich viel vernünftiger halten. Wenn Sie aus irgendeinem Grund keine Bibliothek in Ihrer Sprache haben, keine verwenden möchten (ich würde dies nicht vorschlagen¹) oder eine JSON-Bibliothek schreiben, lesen Sie weiter.
Entkomme es gemäß dem RFC. JSON ist ziemlich liberal: Die einzigen Zeichen , die Sie müssen sind entkommen
\
,"
und Tonfolgen (etwas weniger als U + 0020).Diese Escape-Struktur ist spezifisch für JSON. Sie benötigen eine JSON-spezifische Funktion. Alle Escapezeichen können so geschrieben werden,
\uXXXX
dassXXXX
sich die UTF-16-Codeeinheit¹ für dieses Zeichen befindet. Es gibt einige Verknüpfungen, z. B.\\
, die ebenfalls funktionieren. (Und sie führen zu einer kleineren und klareren Ausgabe.)Ausführliche Informationen finden Sie im RFC .
¹JSON der entweichende auf JS gebaut, so verwendet sie
\uXXXX
, woXXXX
ist ein UTF-16 - Code - Einheit. Für Codepunkte außerhalb des BMP bedeutet dies, dass Ersatzpaare codiert werden, die etwas haarig werden können. (Oder Sie können das Zeichen einfach direkt ausgeben, da JSON für Unicode-Text codiert ist und diese bestimmten Zeichen zulässt.)quelle
"
).{[]}:?
dürfen nicht mit einem einzigen Backslash maskiert werden. (\:
Ist beispielsweise in einer JSON-Zeichenfolge nicht gültig.) Alle diese Zeichen können optional mithilfe der\uXXXX
Syntax maskiert werden, wobei mehrere Bytes verschwendet werden. Siehe §2.5 des RFC.JSON.stringify()
den Job zu erledigen.Auszug aus Jettison :
quelle
"
,\
und Steuerzeichen (die vor "") sind in JSON-Zeichenfolgen gültig, solange die Ausgabecodierung übereinstimmt. Mit anderen Worten, Sie müssen "펍" nicht codieren,\uD38D
solange die UTF-Codierung erhalten bleibt.Versuchen Sie dies
org.codehaus.jettison.json.JSONObject.quote("your string")
.Laden Sie es hier herunter: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
quelle
org.json.simple.JSONObject.escape () maskiert Anführungszeichen, \, /, \ r, \ n, \ b, \ f, \ t und andere Steuerzeichen. Es kann verwendet werden, um JavaScript-Codes zu umgehen.
quelle
Apache Commons Lang unterstützt dies jetzt. Stellen Sie einfach sicher, dass Sie eine ausreichend aktuelle Version von Apache commons lang in Ihrem Klassenpfad haben. Sie benötigen Version 3.2+
Versionshinweise für Version 3.2
LANG-797: Escape / unescapeJson zu StringEscapeUtils hinzugefügt.
quelle
/
Zeichen maskiert werden . Dies zerstört viele Dinge, einschließlich JSON mit URLs. Der ursprüngliche Vorschlag hatte/
als Sonderzeichen zu entkommen, aber dies ist nicht mehr der Fall, wie wir in der neuesten Spezifikation zum Zeitpunkt des Schreibens sehen könnenorg.json.JSONObject
quote(String data)
Methode macht den JobAuszug aus der Dokumentation:
quelle
org.apache.sling.commons.json.JSONObject
hat auch das gleicheStringEscapeUtils.escapeJavaScript
IchStringEscapeUtils.escapeEcmaScript
sollte den Trick auch machen.quelle
escapeJavaScript
entgeht einfachen Anführungszeichen als\'
, was falsch ist.Wenn Sie fastexml jackson verwenden, können Sie Folgendes verwenden:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Wenn Sie Codehaus Jackson verwenden, können Sie Folgendes verwenden:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
quelle
Sie sind sich nicht sicher, was Sie unter "manuell erstellen von json" verstehen, aber Sie können etwas wie gson ( http://code.google.com/p/google-gson/ ) verwenden, das Ihre HashMap, Ihr Array, Ihren String usw. Transformieren würde auf einen JSON-Wert. Ich empfehle dafür einen Rahmen.
quelle
Ich habe nicht die Zeit aufgewendet, um 100% sicher zu stellen, aber es hat für meine Eingaben genug funktioniert, um von Online-JSON-Validatoren akzeptiert zu werden:
obwohl es nicht besser aussieht als
org.codehaus.jettison.json.JSONObject.quote("your string")
Ich verwende in meinem Projekt einfach bereits Geschwindigkeitswerkzeuge - mein "manuelles JSON" -Gebäude befand sich in einer Geschwindigkeitsvorlage
quelle
Für diejenigen, die hierher gekommen sind, um nach einer Befehlszeilenlösung zu suchen, wie ich, funktioniert der --data-urlencode von cURL einwandfrei:
sendet
, zum Beispiel. Größere JSON-Daten können in eine Datei eingefügt werden, und Sie würden die @ -Syntax verwenden, um eine Datei anzugeben, aus der die zu maskierenden Daten verschlungen werden sollen. Zum Beispiel wenn
du würdest verwenden
Und jetzt ist dies auch ein Tutorial, wie man Freebase über die Kommandozeile abfragt :-)
quelle
Verwenden Sie die EscapeUtils-Klasse in der Commons-Lang-API.
quelle
Betrachten Sie Moshi ‚s JsonWriter Klasse. Es hat eine wunderbare API und reduziert das Kopieren auf ein Minimum. Alles kann gut in eine Datei, einen OutputStream usw. gestreamt werden.
Wenn Sie die Zeichenfolge in der Hand haben möchten:
quelle
Apache Commons-Text hat jetzt einen StringEscapeUtils.escapeJson (String) .
quelle
Wenn Sie JSON innerhalb der JSON-Zeichenfolge maskieren müssen, scheint die Verwendung von org.json.JSONObject.quote ("Ihre json-Zeichenfolge, die maskiert werden muss") gut zu funktionieren
quelle
Mit der \ uXXXX-Syntax kann dieses Problem gelöst werden. Google UTF-16 mit dem Namen des Zeichens. Sie können XXXX herausfinden, zum Beispiel: utf-16 doppeltes Anführungszeichen
quelle
Die Methoden hier, die die tatsächliche Implementierung zeigen, sind alle fehlerhaft.
Ich habe keinen Java-Code, aber nur für den Datensatz können Sie diesen C # -Code leicht konvertieren:
Mit freundlicher Genehmigung des Monoprojekts @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Dies kann verdichtet werden
quelle
quote()
in anderen Antworten beschriebene Methode fehlerhaft?Ich denke, die beste Antwort im Jahr 2017 ist die Verwendung der javax.json-APIs. Verwenden Sie javax.json.JsonBuilderFactory, um Ihre json-Objekte zu erstellen, und schreiben Sie die Objekte dann mit javax.json.JsonWriterFactory aus. Sehr schöne Builder / Writer-Kombination.
quelle