Échapper à la chaîne JSON en Java

1. Vue d'ensemble

Dans ce court didacticiel, nous montrerons quelques moyens d'échapper à une chaîne JSON en Java.

Nous allons faire un tour rapide des bibliothèques de traitement JSON les plus populaires et de la façon dont elles font de l'échappement une tâche simple.

2. Qu'est-ce qui pourrait mal tourner?

Considérons un cas d'utilisation simple mais courant d'envoi d'un message spécifié par l'utilisateur à un service Web. Naïvement, nous pourrions essayer:

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

Mais, vraiment, cela peut introduire de nombreux problèmes.

Le plus simple est si le message contient une citation:

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

Pire encore, l'utilisateur peut sciemment casser la sémantique de la requête . S'il envoie:

Hello", "role" : "admin

Alors le message devient:

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

L'approche la plus simple consiste à remplacer les guillemets par la séquence d'échappement appropriée:

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

Cependant, cette approche est assez fragile:

  • Cela doit être fait pour chaque valeur concaténée , et nous devons toujours garder à l'esprit les chaînes que nous avons déjà échappées
  • De plus, à mesure que la structure du message change avec le temps, cela peut devenir un casse-tête de maintenance
  • Et c'est difficile à lire, ce qui le rend encore plus sujet aux erreurs

En termes simples, nous devons utiliser une approche plus générale. Malheureusement, les fonctionnalités de traitement JSON natives sont toujours en phase JEP , nous devrons donc nous tourner vers une variété de bibliothèques JSON open source.

Heureusement, il existe plusieurs bibliothèques de traitement JSON. Jetons un coup d'œil aux trois plus populaires.

3. Bibliothèque JSON-java

La bibliothèque la plus simple et la plus petite de notre examen est JSON-java, également appelée org.json .

Pour construire un objet JSON, nous créons simplement une instance de JSONObject et le traitons fondamentalement comme une carte :

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

Cela prendra les citations autour de «Monde» et leur échappera:

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

4. Bibliothèque Jackson

L'une des bibliothèques Java les plus populaires et les plus polyvalentes pour le traitement JSON est Jackson.

À première vue, Jackson se comporte de la même manière que org.json :

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

Cependant, Jackson peut également prendre en charge la sérialisation des objets Java.

Alors améliorons un peu notre exemple en enveloppant notre message dans une classe personnalisée:

class Payload { Payload(String message) { this.message = message; } String message; // getters and setters } 

Ensuite, nous avons besoin d'une instance d' ObjectMapper à laquelle nous pouvons passer une instance de notre objet:

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

Dans les deux cas, on obtient le même résultat qu'avant:

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

Dans les cas où nous avons une propriété déjà échappée et que nous devons la sérialiser sans autre échappement, nous pouvons vouloir utiliser l' annotation @JsonRawValue de Jackson sur ce champ.

5. Bibliothèque de goyaves

Gson est une bibliothèque de Google qui va souvent de pair avec Jackson.

Nous pouvons, bien sûr, faire à nouveau comme nous l'avons fait avec org.json :

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

Ou nous pouvons utiliser des objets personnalisés, comme avec Jackson:

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

Et nous obtiendrons à nouveau le même résultat.

6. Conclusion

Dans ce court article, nous avons vu comment échapper des chaînes JSON en Java à l'aide de différentes bibliothèques open source.

Tout le code lié à cet article se trouve à l'adresse over sur Github.