Escape-JSON-String in Java

Escape-JSON-Zeichenfolge in Java

1. Überblick

In diesem kurzen Tutorial zeigen wir einige Möglichkeiten, wie Sie einen JSON-String in Java maskieren können.

Wir werden einen kurzen Überblick über die beliebtesten JSON-Verarbeitungsbibliotheken geben und erläutern, wie sie das Entkommen zu einer einfachen Aufgabe machen.

2. Was könnte schiefgehen?

Betrachten wir einen einfachen, aber häufigen Anwendungsfall für das Senden einer benutzerdefinierten Nachricht an einen Webdienst. Naiv könnten wir versuchen:

String payload = "{\"message\":\"" + message + "\"}";
sendMessage(payload);

Dies kann jedoch zu vielen Problemen führen.

Am einfachsten ist es, wenn die Nachricht ein Zitat enthält:

{ "message" : "My "message" breaks json" }

Schlimmer istthe user can knowingly break the semantics of the request. Wenn er sendet:

Hello", "role" : "admin

Dann wird die Nachricht:

{ "message" : "Hello", "role" : "admin" }

Am einfachsten ist es, Anführungszeichen durch die entsprechende Escape-Sequenz zu ersetzen:

String payload = "{\"message\":\"" + message.replace("\"", "\\\"") + "\"}";

Dieser Ansatz ist jedoch recht spröde:

  • It needs to be done for every concatenated value, und wir müssen immer bedenken, welchen Zeichenfolgen wir bereits entkommen sind

  • Wenn sich die Nachrichtenstruktur im Laufe der Zeit ändert, beträgt außerdemthis can become a maintenance headache

  • Und es isthard to read, making it even more error-prone

Einfach ausgedrückt, wir müssen einen allgemeineren Ansatz verfolgen. Leidernative JSON processing features are still in the JEP phase, daher müssen wir uns auf eine Vielzahl von Open-Source-JSON-Bibliotheken konzentrieren.

Glücklicherweise gibt esseveral JSON-Verarbeitungsbibliotheken. Werfen wir einen kurzen Blick auf die drei beliebtesten.

3. JSON-Java-Bibliothek

Die einfachste und kleinste Bibliothek in unserer Übersicht istJSON-java, auch alsorg.json bekannt.

So erstellen Sie ein JSON-Objekt:we simply create an instance of JSONObject and basically treat it like a Map:

JSONObject jsonObject = new JSONObject();
jsonObject.put("message", "Hello \"World\"");
String payload = jsonObject.toString();

Dies wird die Anführungszeichen um "Welt" nehmen und ihnen entgehen:

{
   "message" : "Hello \"World\""
}

4. Jackson Bibliothek

Eine der beliebtesten und vielseitigsten Java-Bibliotheken für die JSON-Verarbeitung istJackson.

Auf den ersten BlickJackson behaves similarly to org.json:

Map params = new HashMap<>();
params.put("message", "Hello \"World\"");
String payload = new ObjectMapper().writeValueAsString(params);

Jackson kann jedoch auch die Serialisierung von Java-Objekten unterstützen.

Lassen Sie uns unser Beispiel ein wenig verbessern, indem wir unsere Nachricht in eine benutzerdefinierte Klasse einschließen:

class Payload {
    Payload(String message) {
        this.message = message;
    }

    String message;

    // getters and setters
}

Dann brauchen wir eine Instanz vonObjectMapper, an die wir eine Instanz unseres Objekts übergeben können:

String payload = new ObjectMapper().writeValueAsString(new Payload("Hello \"World\""));

In beiden Fällen erhalten wir dasselbe Ergebnis wie zuvor:

{
   "message" : "Hello \"World\""
}

In Fällen, in denen wir eine bereits maskierte Eigenschaft haben und diese ohne weitere Escape-Funktion serialisieren müssen, möchten wir möglicherweise die Annotation von Jackson@JsonRawValuefür dieses Feld verwenden.

5. Guavenbibliothek

Gson ist eine Bibliothek von Google, die häufiggoes head to head with Jackson enthält.

Wir können natürlich das tun, was wir mitorg.json again getan haben:

JsonObject json = new JsonObject();
json.addProperty("message", "Hello \"World\"");
String payload = new Gson().toJson(gsonObject);

Oder wir können benutzerdefinierte Objekte verwenden, wie bei Jackson:

String payload = new Gson().toJson(new Payload("Hello \"World\""));

Und wir werden wieder das gleiche Ergebnis erzielen.

6. Fazit

In diesem kurzen Artikel haben wir gesehen, wie Sie JSON-Zeichenfolgen in Java mithilfe verschiedener Open Source-Bibliotheken umgehen können.

Der gesamte Code zu diesem Artikel befindet sich inover on Github.