Escape JSON string u Javi

1. Pregled

U ovom kratkom vodiču pokazat ćemo nekoliko načina za izbjegavanje JSON niza u Javi.

Kratko ćemo razgledati najpopularnije biblioteke za obradu JSON-a i njihove jednostavne zadatke.

2. Što bi moglo pogriješiti?

Razmotrimo jednostavan, ali uobičajen slučaj slanja korisničke poruke web usluzi. Naivno bismo mogli pokušati:

Opterećenje niza = "{\" poruka \ ": \" "+ poruka +" \ "}"; sendMessage (korisni teret);

Ali, stvarno, to može dovesti do mnogih problema.

Najjednostavnije je ako poruka sadrži citat:

{"message": "Moja" poruka "razbija json"}

Još gore je korisnik može svjesno razbiti semantiku zahtjeva. Ako pošalje:

Pozdrav "," role ":" admin

Tada poruka postaje:

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

Najjednostavniji pristup je zamjena navodnika odgovarajućim redoslijedom bijega:

Niz korisnog tereta = "{\" message \ ": \" "+ message.replace (" \ "", "\" ") +" \ "}";

Međutim, ovaj je pristup prilično krhak:

  • To treba učiniti za svaku ujedinjenu vrijednost, i moramo uvijek imati na umu iz kojih smo žica već pobjegli
  • Štoviše, kako se struktura poruke mijenja s vremenom, ovo može postati glavobolja održavanja
  • I je teško se čita, što ga čini još sklonijim pogreškama

Jednostavno rečeno, moramo primijeniti općenitiji pristup. Nažalost, matične značajke obrade JSON još su u JEP fazi, tako da ćemo morati usmjeriti pogled na razne JSON knjižnice otvorenog koda.

Srećom, postoji nekoliko JSON-ovih knjižnica za obradu. Kratko ćemo pogledati tri najpopularnija.

3. JSON-java knjižnica

Najjednostavnija i najmanja knjižnica u našem pregledu je JSON-java također poznata kao org.json.

Da biste konstruirali JSON objekt, mi jednostavno stvorimo primjerak JSONObject i u osnovi se prema tome ponašaju kao prema Karta:

JSONObject jsonObject = novi JSONObject (); jsonObject.put ("poruka", "Pozdrav \" Svijet \ ""); Korisno opterećenje niza = jsonObject.toString ();

Ovo će uzeti citate oko "Svijeta" i pobjeći im:

{"message": "Pozdrav \" Svijet \ ""}

4. Jackson knjižnica

Jedna od najpopularnijih i najsvestranijih Java knjižnica za JSON obradu je Jackson.

Na prvi pogled, Jackson se ponaša slično kao org.json:

Parametri karte = novi HashMap (); params.put ("poruka", "Pozdrav \" Svijet \ ""); Opterećenje niza = novi ObjectMapper (). WriteValueAsString (params);

Međutim, Jackson također može podržati serializiranje Java objekata.

Pa hajde da malo poboljšamo naš primjer umotavanjem naše poruke u prilagođenu klasu:

klasa Korisno opterećenje {Korisno opterećenje (niz poruka) {this.message = message; } String poruka; // geteri i postavljači} 

Zatim, trebamo primjerak ObjectMapper kojoj možemo proslijediti instancu svog objekta:

Niz korisnog tereta = novi ObjectMapper (). WriteValueAsString (novi korisni teret ("Pozdrav \" Svijet \ "")); 

U oba slučaja dobivamo isti rezultat kao i prije:

{"message": "Pozdrav \" Svijet \ ""}

U slučajevima kada imamo već pobjeglo vlasništvo i trebamo ga serializirati bez daljnjeg bijega, možda bismo željeli koristiti Jacksonov @JsonRawValue napomena na tom polju.

5. Knjižnica Guava

Gson je Googleova knjižnica koja se često susreće s Jacksonom.

Možemo, naravno, učiniti kao i s org.json opet:

JsonObject json = novi JsonObject (); json.addProperty ("poruka", "Pozdrav \" Svijet \ ""); Opterećenje niza = novi Gson (). ToJson (gsonObject);

Ili možemo koristiti prilagođene objekte, kao kod Jacksona:

Niz korisnog tereta = novi Gson (). ToJson (novi korisni teret ("Pozdrav \" Svijet \ ""));

I opet ćemo dobiti isti rezultat.

6. Zaključak

U ovom kratkom članku vidjeli smo kako izbjeći JSON nizove u Javi koristeći različite biblioteke otvorenog koda.

Sav kôd povezan s ovim člankom možete pronaći na Githubu.