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.