Escape JSON String i Java

1. Oversikt

I denne korte opplæringen viser vi noen måter å unnslippe en JSON-streng i Java.

Vi tar en rask omvisning i de mest populære JSON-behandlingsbibliotekene og hvordan de gjør det å unnslippe en enkel oppgave.

2. Hva kan gå galt?

La oss vurdere en enkel, men allikevel vanlig bruk av å sende en brukerdefinert melding til en nettjeneste. Naivt kan vi prøve:

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

Men egentlig kan dette introdusere mange problemer.

Det enkleste er hvis meldingen inneholder et tilbud:

{"message": "Min" melding "bryter json"}

Verre er det brukeren kan bevisst bryte semantikken i forespørselen. Hvis han sender:

Hei "," role ":" admin

Da blir meldingen:

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

Den enkleste tilnærmingen er å erstatte anførselstegn med riktig rømningssekvens:

String nyttelast = "{\" melding \ ": \" "+ melding.replacement (" \ "", "\" ") +" \ "}";

Denne tilnærmingen er imidlertid ganske sprø:

  • Det må gjøres for hver sammenkoblet verdi, og vi må alltid huske på hvilke strenger vi allerede har rømt
  • Når meldingsstrukturen endres over tid, dette kan bli vedlikeholdshodepine
  • Og dets vanskelig å lese, noe som gjør den enda mer utsatt for feil

Enkelt sagt, vi må benytte en mer generell tilnærming. Dessverre, innfødte JSON-behandlingsfunksjoner er fortsatt i JEP-fasen, så vi må rette blikket mot en rekke åpne kildekode-JSON-biblioteker.

Heldigvis er det flere JSON-behandlingsbiblioteker. La oss ta en rask titt på de tre mest populære.

3. JSON-java-biblioteket

Det enkleste og minste biblioteket i vår anmeldelse er JSON-java også kjent som org.json.

For å konstruere et JSON-objekt, vi oppretter ganske enkelt en forekomst av JSONObject og behandler det i utgangspunktet som en Kart:

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

Dette vil ta sitatene rundt “Verden” og unnslippe dem:

{"message": "Hei \" Verden \ ""}

4. Jackson-biblioteket

En av de mest populære og allsidige Java-bibliotekene for JSON-behandling er Jackson.

Ved første øyekast, Jackson oppfører seg på samme måte som org.json:

Kartparametere = nye HashMap (); params.put ("melding", "Hei \" Verden \ ""); Streng nyttelast = ny ObjectMapper (). WriteValueAsString (params);

Imidlertid kan Jackson også støtte serialisering av Java-objekter.

Så la oss forbedre eksemplet vårt litt ved å pakke inn budskapet vårt i en tilpasset klasse:

klasse Nyttelast {Nyttelast (strengmelding) {this.message = melding; } Strengmelding; // getters og setters} 

Deretter trenger vi en forekomst av ObjectMapper som vi kan sende en forekomst av objektet vårt til:

Streng nyttelast = ny ObjectMapper (). WriteValueAsString (ny nyttelast ("Hello \" World \ "")); 

I begge tilfeller får vi det samme resultatet som før:

{"message": "Hei \" Verden \ ""}

I tilfeller der vi har en allerede rømt eiendom og trenger å serieisere den uten ytterligere å rømme, kan det være lurt å bruke Jacksons @JsonRawValue kommentar på det feltet.

5. Guava-biblioteket

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

Vi kan selvfølgelig gjøre som vi gjorde med org.json en gang til:

JsonObject json = nye JsonObject (); json.addProperty ("melding", "Hei \" Verden \ ""); Streng nyttelast = ny Gson (). ToJson (gsonObject);

Eller vi kan bruke egendefinerte objekter, som med Jackson:

Streng nyttelast = ny Gson (). ToJson (ny nyttelast ("Hello \" World \ ""));

Og vi får igjen det samme resultatet.

6. Konklusjon

I denne korte artikkelen har vi sett hvordan vi kan unnslippe JSON-strenger i Java ved hjelp av forskjellige open source-biblioteker.

All koden relatert til denne artikkelen finner du på Github.


$config[zx-auto] not found$config[zx-overlay] not found