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.