JSON-feldolgozás Java EE 7-ben
1. Áttekintés
Ez a cikk bemutatja, hogyan lehet a JSON-ot csak a Java Java EE segítségével feldolgozni, harmadik féltől származó függőségek, például Jersey vagy Jackson használata nélkül. Nagyjából mindent, amit használni fogunk, a javax.json csomag biztosítja.
2. Objektum írása a JSON-hoz Húr
Java objektum konvertálása JSON-vá Húr nagyon könnyű. Tegyük fel, hogy van egy egyszerű Személy osztály:
public class Személy {private String keresztnév; privát karakterlánc vezetéknév; privát születési dátum; // szerelők és beállítók}
Az osztály egy példányának konvertálása JSON-vá Húr, először létre kell hoznunk a JsonObjectBuilder és adjon hozzá tulajdonság / érték párokat a add () módszer:
JsonObjectBuilder objectBuilder = Json.createObjectBuilder () .add ("keresztnév", person.getFirstName ()) .add ("vezetéknév", person.getLastName ()) .add ("születési dátum", új SimpleDateFormat ("PP / HH / ÉÉÉÉ) ") .formátum (person.getBirthdate ()));
Figyeljük meg, hogy a add () A módszer néhány túlterhelt verzióval rendelkezik. Második paramétereként képes fogadni a legtöbb primitív típust (valamint dobozos objektumokat).
Miután elvégeztük a tulajdonságok beállítását, csak be kell írnunk az objektumot a-ba Húr:
JsonObject jsonObject = objectBuilder.build (); Karakterlánc jsonString; próbáld meg (Writer író = új StringWriter ()) {Json.createWriter (író) .write (jsonObject); jsonString = író.toString (); }
És ez az! A generált Húr így fog kinézni:
{"keresztnév": "Michael", "vezetéknév": "Scott", "születési dátum": "1978.06.15."}
2.1. Használata JsonArrayBuilder tömbök építésére
Most, hogy egy kicsit összetettebbé tegyük példánkat, tegyük fel, hogy a Személy osztály módosult, és új tulajdonságot kapott e-maileket amely tartalmazza az e-mail címek listáját:
public class Személy {private String keresztnév; privát karakterlánc vezetéknév; privát születési dátum; privát lista e-mailek; // szerelők és beállítók}
A lista összes értékének hozzáadása a JsonObjectBuilder szükségünk lesz a segítségére JsonArrayBuilder:
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder (); for (Karakterlánc e-mail: person.getEmails ()) {arrayBuilder.add (email); } objectBuilder.add ("e-mailek", arrayBuilder);
Figyelje meg, hogy a program még egy túlterhelt verzióját használjuk add () módszer, amely a JsonArrayBuilder objektum második paramétere.
Tehát nézzük meg a létrehozott String for a Személy objektum két e-mail címmel:
{"keresztnév": "Michael", "vezetéknév": "Scott", "születési dátum": "1978.06.15.", "e-mailek": ["[email protected]", "[email protected]"]}
2.2. A kimenet formázása a PRETTY_PRINTING
Tehát sikeresen átalakítottunk egy Java objektumot érvényes JSON-vá Húr. Mielőtt a következő szakaszra lépne, adjunk hozzá néhány egyszerű formázást, hogy a kimenet „JSON-szerűbb” és könnyebben olvasható legyen.
Az előző példákban létrehoztunk egy JsonWriter az egyeneset használva Json.createWriter () statikus módszer. Annak érdekében, hogy jobban ellenőrizhessük a generáltakat Húr, kihasználjuk a Java 7-eket JsonWriterFactory egy adott konfigurációjú író létrehozásának képessége.
Map config = new HashMap (); config.put (JsonGenerator.PRETTY_PRINTING, true); JsonWriterFactory writerFactory = Json.createWriterFactory (config); Karakterlánc jsonString; próbáld meg (Writer író = új StringWriter ()) {íróFactory.createWriter (író) .write (jsonObject); jsonString = író.toString (); }
Lehet, hogy a kód kissé bőbeszédűnek tűnik, de valójában nem sokat tesz.
Először létrehozza a JsonWriterFactory konfigurációs térkép átadása a konstruktorának. A térkép csak egy bejegyzést tartalmaz, amely igaz a PRETTY_PRINTING tulajdonsághoz. Ezután ezt a gyári példányt használjuk író létrehozásához ahelyett, hogy használnánk Json.createWriter ().
Az új kimenet tartalmazza a JSON-t jellemző jellegzetes sortöréseket és táblázatot Húr:
{"keresztnév": "Michael", "vezetéknév": "Scott", "születési dátum": "1978.06.15.", "e-mailek": ["[e-mail védett]", "[e-mail védett]"]}
3. Java építése Tárgy A-tól Húr
Most tegyük az ellenkező műveletet: alakítsunk át egy JSON-t Húr Java objektummá.
Az átalakítási folyamat fő része körül forog JsonObject. Ennek az osztálynak a létrehozásához használja a statikus metódust Json.createReader () utána readObject ():
JsonReader olvasó = Json.createReader (új StringReader (jsonString)); JsonObject jsonObject = olvasó.readObject ();
A createReader () módszer an InputStream paraméterként. Ebben a példában a StringReader, mivel JSON-junkat a Húr objektumot, de ugyanezzel a módszerrel fel lehet olvasni egy fájl tartalmát, például a FileInputStream.
Példával JsonObject kéznél elolvashatjuk a tulajdonságokat a getString () metódust és a kapott értékeket hozzárendeljük egy újonnan létrehozott példányunkhoz Személy osztály:
Személy személy = új Személy (); person.setFirstName (jsonObject.getString ("keresztnév")); person.setLastName (jsonObject.getString ("vezetéknév")); person.setBirthdate (dateFormat.parse (jsonObject.getString ("születési dátum")));
3.1. Használata JsonArray kapni Lista Értékek
Egy speciális osztályt kell használnunk JsonArray hogy kivonjuk a listából az értékeket JsonObject:
JsonArray emailsJson = jsonObject.getJsonArray ("e-mailek"); E-mailek felsorolása = new ArrayList (); for (JsonString j: emailsJson.getValuesAs (JsonString.class)) {emails.add (j.getString ()); } person.setEmails (e-mailek);
Ez az! Létrehoztunk egy teljes példányát Személy egy Json-tól Húr.
4. Értékek lekérdezése
Tegyük fel, hogy egy nagyon specifikus adat érdekel bennünket, amely egy JSON-ban rejlik Húr.
Fontolja meg az alábbi JSON-t, amely egy kisállat-üzlet ügyfelét képviseli. Tegyük fel, hogy valamilyen okból meg kell szereznie a harmadik háziállat nevét a háziállatok listájáról:
{"ownerName": "Robert", "pets": [{"name": "Kitty", "type": "cat"}, {"name": "Rex", "type": "dog"}, {"name": "Jake", "type": "kutya"}]}
A teljes szöveg Java objektummá konvertálása csak egyetlen érték megszerzése érdekében nem lenne túl hatékony. Tehát nézzünk meg néhány stratégiát a JSON lekérdezéséhez Húrok anélkül, hogy az egész megtérési megpróbáltatást át kellene élnie.
4.1. Lekérdezés az Object Model API használatával
A JSON-struktúrában ismert helyen lévő ingatlan értékének lekérdezése egyszerű. Használhatunk egy példányát JsonObject, a korábbi példákban használt osztály:
JsonReader olvasó = Json.createReader (új StringReader (jsonString)); JsonObject jsonObject = olvasó.readObject (); String searchResult = jsonObject .getJsonArray ("pets") .getJsonObject (2) .getString ("név");
A fogás itt az, hogy eligazodjon jsonObject tulajdonságait a helyes sorrend használatával kap*() mód.
Ebben a példában először a „háziállatok” listára kapunk hivatkozást getJsonArray (), amely 3 rekordot tartalmazó listát ad vissza. Akkor használjuk getJsonObject () metódus, amely egy indexet vesz paraméterként, egy másikat ad vissza JsonObject a lista harmadik elemét képviseli. Végül használjuk getString () a keresett karakterlánc értékének megszerzéséhez.
4.2. Lekérdezés Streaming API használatával
A JSON-on történő pontos lekérdezések másik módja Húr a Streaming API-t használja, amelynek van JsonParser mint fő osztálya.
JsonParser rendkívül gyors, csak olvasható, előre hozzáférést biztosít a JS-hez, hátránya, hogy valamivel bonyolultabb, mint az objektum modell:
JsonParser jsonParser = Json.createParser (új StringReader (jsonString)); int szám = 0; Karakterlánc eredménye = null; while (jsonParser.hasNext ()) {Esemény e = jsonParser.next (); if (e == Event.KEY_NAME) {if (jsonParser.getString (). egyenlő ("név")) {jsonParser.next (); if (++ count == 3) {eredmény = jsonParser.getString (); szünet; }}}}
Ez a példa ugyanazt az eredményt adja, mint az előző. Visszaadja a név a harmadik háziállattól a háziállatok lista.
Egyszer JsonParser segítségével jön létre Json.createParser (), iterátort kell használnunk (ennélfogva a JsonParser) navigálni a JSON tokenek között, amíg el nem jutunk a keresett ingatlanhoz (vagy tulajdonságokhoz).
Minden alkalommal, amikor az iterátoron lépünk át, a JSON-adatok következő tokenjére lépünk. Tehát óvatosnak kell lennünk annak ellenőrzésére, hogy az aktuális token a várt típussal rendelkezik-e. Ez a Esemény vissza a következő() hívás.
Sok különböző típusú token létezik. Ebben a példában a KEY_NAME típusok, amelyek egy ingatlan nevét képviselik (pl. „tulajdonosNév”, „háziállatok”, „név”, „típus”). Miután átléptünk egy KEY_NAME a „név” értékű harmadik tokent, tudjuk, hogy a következő token egy karakterlánc-értéket tartalmaz, amely a listán szereplő harmadik háziállat nevét képviseli.
Ez egyértelműen nehezebb, mint az Object Model API használata, különösen a bonyolultabb JSON struktúrák esetében. Az egyik vagy másik választás, mint mindig, az adott forgatókönyvtől függ.
5. Következtetés
Sokat lefedtünk a Java EE JSON Processing API-n, néhány egyszerű példával. A JSON-feldolgozással kapcsolatos egyéb jó dolgok megismeréséhez nézze meg Jackson-cikksorozatunkat.
Ellenőrizze a cikkben használt osztályok forráskódját, valamint néhány egységtesztet a GitHub adattárunkban.