Escape JSON karakterlánc Java-ban

1. Áttekintés

Ebben a rövid bemutatóban bemutatunk néhány módot a JSON karakterlánc elkerülésére a Java-ban.

Gyorsan megismerkedünk a legnépszerűbb JSON-feldolgozó könyvtárakkal, és arról, hogyan teszik a szökést egyszerű feladat elé.

2. Mi történhet rosszul?

Vegyük fontolóra egy egyszerű, de gyakran használt esetet, amikor egy felhasználó által megadott üzenetet küldünk egy webszolgáltatásnak. Naivan megpróbálhatjuk:

String payload = "{\" message \ ": \" "+ message +" \ "}"; sendMessage (hasznos teher);

De valójában ez sok problémát okozhat.

A legegyszerűbb, ha az üzenet idézetet tartalmaz:

{"message": "Az" üzenetem "megtöri a jsont"}

Rosszabb az a felhasználó tudatosan megtörheti a kérelem szemantikáját. Ha elküldi:

Helló "," role ":" admin

Ezután az üzenet:

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

A legegyszerűbb módszer az idézőjelek helyettesítése a megfelelő menekülési sorrenddel:

String payload = "{\" message \ ": \" "+ message.replace (" \ "", "\" ") +" \ "}";

Ez a megközelítés azonban meglehetősen törékeny:

  • Minden összefűzött értéknél meg kell tenni, és mindig szem előtt kell tartanunk, hogy melyik húrokat már megúsztuk
  • Sőt, ahogy az üzenet szerkezete idővel változik, ez karbantartási fejfájássá válhat
  • És ez van nehezen olvasható, így még inkább hibára hajlamos

Egyszerűen fogalmazva, általánosabb megközelítést kell alkalmaznunk. Sajnálatos módon, a natív JSON-feldolgozási szolgáltatások még mindig a JEP fázisban vannak, így a nyílt forráskódú JSON-könyvtárak felé kell fordulnunk.

Szerencsére számos JSON-feldolgozó könyvtár létezik. Vessünk egy gyors pillantást a három legnépszerűbbre.

3. JSON-java könyvtár

Áttekintésünkben a legegyszerűbb és legkisebb könyvtár a JSON-java, más néven org.json.

JSON objektum létrehozásához egyszerűen létrehozunk egy példányát JSONObject és alapvetően úgy kezelik, mint a Térkép:

JSONObject jsonObject = új JSONObject (); jsonObject.put ("message", "Hello \" World \ ""); Karakterlánc hasznos terhelése = jsonObject.toString ();

Ez a „Világ” körül idézi az idézeteket, és elkerüli őket:

{"message": "Helló \" Világ \ ""}

4. Jackson könyvtár

Az egyik legnépszerűbb és legsokoldalúbb Java könyvtár a JSON feldolgozásához a Jackson.

Első pillantásra, Jackson hasonlóan viselkedik, mint org.json:

Térképparaméterek = new HashMap (); params.put ("message", "Hello \" World \ ""); Karakterlánc hasznos terhelése = new ObjectMapper (). WriteValueAsString (paramek);

Jackson azonban támogatja a Java objektumok sorosítását is.

Tehát javítsuk kicsit a példánkat azzal, hogy egy egyedi osztályba csomagoljuk az üzenetünket:

class Hasznos teher {Hasznos teher (karakterlánc üzenet) {this.message = üzenet; } Karakterlánc üzenet; // szerelők és beállítók} 

Ezután szükségünk van a ObjectMapper amelyhez átadhatjuk objektumunk egy példányát:

Karakterlánc hasznos terhelése = új ObjectMapper (). WriteValueAsString (új hasznos terhelés ("Hello \" World \ "")); 

Mindkét esetben ugyanazt az eredményt kapjuk, mint korábban:

{"message": "Helló \" Világ \ ""}

Abban az esetben, ha van már megszabadult ingatlanunk, és további szökés nélkül kell sorosítanunk, akkor érdemes lehet Jackson @JsonRawValue annotáció azon a mezőn.

5. Guava könyvtár

A Gson egy olyan könyvtár a Google-tól, amely gyakran fej-fej mellett halad Jackson-szal.

Természetesen tehetünk úgy, ahogyan tettük org.json újra:

JsonObject json = új JsonObject (); json.addProperty ("message", "Hello \" World \ ""); Karakterlánc hasznos terhelése = new Gson (). ToJson (gsonObject);

Vagy használhatunk egyedi objektumokat, például Jackson esetében:

Karakterlánc hasznos terhelése = new Gson (). ToJson (new Payload ("Hello \" World \ ""));

És ismét ugyanazt az eredményt kapjuk.

6. Következtetés

Ebben a rövid cikkben azt láthattuk, hogyan lehet elkerülni a JSON karakterláncokat a Java-ban különböző nyílt forráskódú könyvtárak használatával.

A cikkhez kapcsolódó összes kód megtalálható a Github oldalon.


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