Escape JSON String in Java

1. Overzicht

In deze korte tutorial laten we enkele manieren zien om te ontsnappen aan een JSON-string in Java.

We zullen een korte rondleiding geven door de populairste JSON-verwerkingsbibliotheken en hoe ze ontsnappen een eenvoudige taak maken.

2. Wat kan er misgaan?

Laten we eens kijken naar een eenvoudig maar algemeen gebruik: het verzenden van een door de gebruiker gespecificeerd bericht naar een webservice. Naïef zouden we kunnen proberen:

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

Maar dit kan echt veel problemen opleveren.

Het eenvoudigste is als het bericht een citaat bevat:

{"message": "My" message "breekt json"}

Erger is de gebruiker kan bewust de semantiek van het verzoek breken. Als hij stuurt:

Hallo "," role ":" admin

Dan wordt de boodschap:

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

De eenvoudigste benadering is om aanhalingstekens te vervangen door de juiste escape-reeks:

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

Deze benadering is echter vrij broos:

  • Het moet worden gedaan voor elke aaneengeschakelde waarde, en we moeten altijd in gedachten houden aan welke snaren we al zijn ontsnapt
  • Bovendien, aangezien de berichtstructuur in de loop van de tijd verandert, dit kan onderhoudshoofdpijn worden
  • En zijn moeilijk te lezen, waardoor het nog meer foutgevoelig is

Simpel gezegd, we moeten een algemenere benadering hanteren. Helaas, native JSON-verwerkingsfuncties bevinden zich nog in de JEP-fase, dus we zullen onze blik moeten richten op verschillende open source JSON-bibliotheken.

Gelukkig zijn er verschillende JSON-verwerkingsbibliotheken. Laten we een korte blik werpen op de drie meest populaire.

3. JSON-java-bibliotheek

De eenvoudigste en kleinste bibliotheek in onze recensie is JSON-java, ook wel bekend als org.json.

Om een ​​JSON-object te construeren, we maken gewoon een instantie van JSONObject en behandel het in feite als een Kaart:

JSONObject jsonObject = nieuw JSONObject (); jsonObject.put ("bericht", "Hallo \" Wereld \ ""); String-payload = jsonObject.toString ();

Hiermee worden de aanhalingstekens rond 'Wereld' overgenomen en ontsnapt:

{"message": "Hallo \" Wereld \ ""}

4. Jackson Bibliotheek

Een van de meest populaire en veelzijdige Java-bibliotheken voor JSON-verwerking is Jackson.

Op het eerste gezicht, Jackson gedraagt ​​zich op dezelfde manier als org.json:

Mapparams = nieuwe HashMap (); params.put ("message", "Hello \" World \ ""); String payload = nieuwe ObjectMapper (). WriteValueAsString (params);

Jackson kan echter ook ondersteuning bieden voor het serialiseren van Java-objecten.

Dus laten we ons voorbeeld een beetje verbeteren door ons bericht in een aangepaste klasse te verpakken:

klasse Payload {Payload (String-bericht) {this.message = bericht; } String bericht; // getters en setters} 

Dan hebben we een instantie nodig van ObjectMapper waaraan we een instantie van ons object kunnen doorgeven:

String payload = nieuwe ObjectMapper (). WriteValueAsString (nieuwe Payload ("Hallo \" Wereld \ "")); 

In beide gevallen krijgen we hetzelfde resultaat als voorheen:

{"message": "Hallo \" Wereld \ ""}

In gevallen waarin we een eigendom hebben waarvan al ontsnapt is en deze moeten serialiseren zonder verder te ontsnappen, willen we misschien Jackson’s @JsonRawValue annotatie op dat veld.

5. Guava-bibliotheek

Gson is een bibliotheek van Google die vaak het tegen Jackson opneemt.

We kunnen natuurlijk doen wat we deden org.json opnieuw:

JsonObject json = nieuw JsonObject (); json.addProperty ("bericht", "Hallo \" Wereld \ ""); String-payload = nieuwe Gson (). ToJson (gsonObject);

Of we kunnen aangepaste objecten gebruiken, zoals bij Jackson:

String payload = nieuwe Gson (). ToJson (nieuwe Payload ("Hallo \" Wereld \ ""));

En we krijgen weer hetzelfde resultaat.

6. Conclusie

In dit korte artikel hebben we gezien hoe je kunt ontsnappen aan JSON-strings in Java met behulp van verschillende open source-bibliotheken.

Alle code met betrekking tot dit artikel is te vinden op Github.