Escape JSON String in Java

1. Übersicht

In diesem kurzen Tutorial zeigen wir einige Möglichkeiten, wie Sie einer JSON-Zeichenfolge in Java entkommen können.

Wir werden einen kurzen Überblick über die beliebtesten JSON-verarbeitenden Bibliotheken geben und wie sie das Entkommen zu einer einfachen Aufgabe machen.

2. Was könnte schief gehen?

Betrachten wir einen einfachen, aber häufig verwendeten Anwendungsfall zum 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 ist, dass der Benutzer die Semantik der Anforderung wissentlich brechen kann . Wenn er sendet:

Hello", "role" : "admin

Dann wird die Nachricht:

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

Der einfachste Ansatz besteht darin, Anführungszeichen durch die entsprechende Escape-Sequenz zu ersetzen:

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

Dieser Ansatz ist jedoch ziemlich spröde:

  • Dies muss für jeden verketteten Wert erfolgen , und wir müssen immer berücksichtigen, welchen Zeichenfolgen wir bereits entkommen sind
  • Wenn sich die Nachrichtenstruktur im Laufe der Zeit ändert, kann dies zu Wartungsproblemen führen
  • Und es ist schwer zu lesen, was es noch fehleranfälliger macht

Einfach ausgedrückt, müssen wir einen allgemeineren Ansatz verfolgen. Leider befinden sich native JSON-Verarbeitungsfunktionen noch in der JEP-Phase , sodass wir uns auf eine Vielzahl von Open-Source-JSON-Bibliotheken konzentrieren müssen.

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

3. JSON-Java-Bibliothek

Die einfachste und kleinste Bibliothek in unserer Rezension ist JSON-java, auch bekannt als org.json .

Um ein JSON-Objekt zu erstellen , erstellen wir einfach eine Instanz von JSONObject und behandeln es im Grunde wie eine Map :

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

Dies wird die Zitate um "Welt" nehmen und ihnen entkommen:

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

4. Jackson Library

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

Auf den ersten Blick verhält sich Jackson ähnlich wie 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 benötigen wir eine Instanz von ObjectMapper, 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 das gleiche 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 @ JsonRawValue- Annotation von Jackson für dieses Feld verwenden.

5. Guavenbibliothek

Gson ist eine Bibliothek von Google, die sich häufig mit Jackson auseinandersetzt.

Wir können natürlich wieder das tun, was wir mit org.json 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 ist auf Github zu finden.