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.