Uniknite reťazcu JSON v Jave

1. Prehľad

V tomto krátkom tutoriáli si ukážeme niekoľko spôsobov, ako uniknúť reťazcu JSON v Jave.

Urobíme si krátku prehliadku najpopulárnejších knižníc na spracovanie JSON a toho, ako unikajú z jednoduchej úlohy.

2. Čo sa môže pokaziť?

Uvažujme o jednoduchom, ale bežnom prípade použitia odoslania správy zadanej používateľom do webovej služby. Naivne by sme mohli vyskúšať:

Reťazec užitočné zaťaženie = "{\" správa \ ": \" "+ správa +" \ "}"; sendMessage (užitočné zaťaženie);

To však v skutočnosti môže spôsobiť veľa problémov.

Najjednoduchšie je, ak správa obsahuje ponuku:

{"message": "Moja" správa "rozbije json"}

Horšie je to používateľ môže vedome porušiť sémantiku požiadavky. Ak pošle:

Dobrý deň "," role ":" admin

Potom sa správa stane:

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

Najjednoduchším prístupom je nahradenie úvodzoviek príslušnou únikovou sekvenciou:

Reťazec užitočné zaťaženie = "{\" správa \ ": \" "+ message.replace (" \ "", "\" ") +" \ "}";

Tento prístup je však dosť krehký:

  • Je potrebné urobiť pre každú zreťazenú hodnotua musíme si vždy uvedomiť, ktorým reťazcom sme už unikli
  • Pretože sa štruktúra správ časom mení, to sa môže stať udržiavacou bolesťou hlavy
  • A jeho ťažko čitateľné, čo zvyšuje pravdepodobnosť chýb

Jednoducho povedané, musíme použiť všeobecnejší prístup. Bohužiaľ natívne funkcie spracovania JSON sú stále vo fáze JEP, takže sa musíme zamerať na rôzne otvorené knižnice JSON.

Našťastie existuje niekoľko knižníc na spracovanie JSON. Poďme sa rýchlo pozrieť na tri najobľúbenejšie.

3. Knižnica JSON-java

Najjednoduchšou a najmenšou knižnicou v našej recenzii je JSON-java známa tiež ako org.json.

Ak chcete zostaviť objekt JSON, jednoducho vytvoríme inštanciu JSONObject a v zásade to považujte za a Mapa:

JSONObject jsonObject = nový JSONObject (); jsonObject.put ("správa", "Dobrý deň \" svet \ ""); Reťazec užitočné zaťaženie = jsonObject.toString ();

Toto vezme citáty okolo „sveta“ a unikne im:

{"message": "Dobrý deň \" Svet \ ""}

4. Jacksonova knižnica

Jednou z najpopulárnejších a najuniverzálnejších knižníc Java pre spracovanie JSON je Jackson.

Na prvý pohľad, Jackson sa správa podobne org.json:

Parametre mapy = nový HashMap (); params.put ("správa", "Dobrý deň \" Svet \ ""); Reťazec užitočné zaťaženie = nový ObjectMapper (). WriteValueAsString (parametre);

Jackson však môže podporovať aj serializáciu objektov Java.

Poďme teda náš príklad trochu vylepšiť zabalením našej správy do vlastnej triedy:

trieda užitočné zaťaženie {užitočné zaťaženie (reťazcová správa) {this.message = správa; } String message; // zakladatelia a zakladatelia} 

Potom potrebujeme inštanciu ObjectMapper ktorému môžeme odovzdať inštanciu nášho objektu:

Reťazec užitočné zaťaženie = nový ObjectMapper (). WriteValueAsString (nové užitočné zaťaženie ("Hello \" World \ "")); 

V obidvoch prípadoch dostaneme rovnaký výsledok ako predtým:

{"message": "Dobrý deň \" Svet \ ""}

V prípadoch, keď máme nehnuteľnosť, ktorá už unikla, a potrebujeme ju serializovať bez ďalších únikov, môžeme použiť Jacksonov @JsonRawValue anotáciu k uvedenému poľu.

5. Knižnica Guava

Gson je knižnica od spoločnosti Google, ktorá často chodí proti Jacksonovi.

Môžeme, samozrejme, robiť tak, ako sme to robili org.json ešte raz:

JsonObject json = nový JsonObject (); json.addProperty ("správa", "Dobrý deň \" svet \ ""); Reťazec užitočné zaťaženie = nový Gson (). ToJson (gsonObject);

Alebo môžeme použiť vlastné objekty, napríklad s Jacksonom:

Reťazec užitočné zaťaženie = nový Gson (). ToJson (nové užitočné zaťaženie ("Hello \" World \ ""));

A opäť dosiahneme rovnaký výsledok.

6. Záver

V tomto krátkom článku sme videli, ako uniknúť reťazcom JSON v Jave pomocou rôznych open source knižníc.

Celý kód súvisiaci s týmto článkom nájdete na stránkach Github.


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