Escape JSON-streng i Java

1. Oversigt

I denne korte vejledning viser vi nogle måder at undslippe en JSON-streng i Java.

Vi tager en hurtig rundvisning i de mest populære JSON-behandlingsbiblioteker, og hvordan de gør det at flygte til en simpel opgave.

2. Hvad kan der gå galt?

Lad os overveje et simpelt, men alligevel almindeligt anvendt tilfælde af at sende en brugerdefineret besked til en webservice. Naivt kan vi prøve:

String nyttelast = "{\" besked \ ": \" "+ besked +" \ "}"; sendMessage (nyttelast);

Men virkelig kan dette medføre mange problemer.

Den enkleste er, hvis meddelelsen indeholder et tilbud:

{"message": "Min" besked "bryder json"}

Værre er brugeren kan bevidst bryde anmodningen semantik. Hvis han sender:

Hej "," role ":" admin

Derefter bliver beskeden:

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

Den enkleste tilgang er at erstatte citater med den passende escape-sekvens:

String nyttelast = "{\" meddelelse \ ": \" "+ meddelelse.placering (" \ "", "\" ") +" \ "}";

Denne tilgang er imidlertid ret skør:

  • Det skal gøres for hver sammenkædede værdi, og vi skal altid huske, hvilke strenge vi allerede er undsluppet
  • Når meddelelsesstrukturen ændres over tid, dette kan blive vedligeholdelseshovedpine
  • Ogdet er svært at læse, hvilket gør det endnu mere udsat for fejl

Kort sagt, vi er nødt til at anvende en mere generel tilgang. Desværre, native JSON-behandlingsfunktioner er stadig i JEP-fasen, så vi bliver nødt til at vende vores blik mod en række forskellige open source JSON-biblioteker.

Heldigvis er der flere JSON-behandlingsbiblioteker. Lad os se hurtigt på de tre mest populære.

3. JSON-java-bibliotek

Det enkleste og mindste bibliotek i vores anmeldelse er JSON-java, også kendt som org.json.

For at konstruere et JSON-objekt, vi opretter simpelthen en instans af JSONObjekt og grundlæggende behandle det som en Kort:

JSONObject jsonObject = ny JSONObject (); jsonObject.put ("besked", "Hej \" Verden \ ""); Streng nyttelast = jsonObject.toString ();

Dette vil tage citaterne omkring "Verden" og undslippe dem:

{"message": "Hej \" Verden \ ""}

4. Jackson-biblioteket

En af de mest populære og alsidige Java-biblioteker til JSON-behandling er Jackson.

Ved første øjekast, Jackson opfører sig på samme måde som org.json:

Kortparametre = nyt HashMap (); params.put ("besked", "Hej \" Verden \ ""); String nyttelast = ny ObjectMapper (). WriteValueAsString (params);

Imidlertid kan Jackson også understøtte serialisering af Java-objekter.

Så lad os forbedre vores eksempel lidt ved at indpakke vores besked i en tilpasset klasse:

klasse Nyttelast {Nyttelast (streng besked) {this.message = meddelelse; } Strengbesked; // getters og setters} 

Derefter har vi brug for en forekomst af ObjectMapper som vi kan sende en instans af vores objekt til:

Streng nyttelast = ny ObjectMapper (). WriteValueAsString (ny nyttelast ("Hej \" Verden \ "")); 

I begge tilfælde får vi det samme resultat som før:

{"message": "Hej \" Verden \ ""}

I tilfælde, hvor vi har en allerede undsluppet ejendom og har brug for at serieisere den uden yderligere at undslippe, vil vi måske bruge Jacksons @JsonRawValue kommentar på dette felt.

5. Guava Bibliotek

Gson er et bibliotek fra Google, der ofte går head to head med Jackson.

Vi kan selvfølgelig gøre som vi gjorde med org.json igen:

JsonObject json = ny JsonObject (); json.addProperty ("besked", "Hej \" Verden \ ""); Streng nyttelast = ny Gson (). ToJson (gsonObject);

Eller vi kan bruge brugerdefinerede objekter, som med Jackson:

Streng nyttelast = ny Gson (). ToJson (ny nyttelast ("Hej \" Verden \ ""));

Og vi får igen det samme resultat.

6. Konklusion

I denne korte artikel har vi set, hvordan man undgår JSON-strenge i Java ved hjælp af forskellige open source-biblioteker.

Al koden relateret til denne artikel kan findes på Github.