Bevezetés a Jackson ObjectMapper-be

1. Áttekintés

Ez az oktatóanyag a Jackson megértésére összpontosít ObjectMapper osztály és a Java objektumok JSON-ként való sorosítása és a JSON karakterlánc Java objektumokká deserializálása.

Ahhoz, hogy többet megtudjon a Jackson könyvtárról általában, a Jackson Tutorial jó kiindulópont.

2. Függőségek

Először adjuk hozzá a következő függőségeket a pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

Ez a függőség átmenetileg a következő könyvtárakat is hozzáadja az osztályútvonalhoz:

  1. jackson-annotációk
  2. jackson-core

Mindig használja a (z) Maven központi adattárának legújabb verzióit jackson-databind.

3. Olvasás és írás használatával ObjectMapper

Kezdjük az alapvető olvasási és írási műveletekkel.

Az egyszerű readValue API-ja ObjectMapper jó belépési pont. Használhatjuk a JSON tartalom elemzésére vagy deserializálására Java objektummá.

Az írás oldalán is használhatjuk a writeValue API bármely Java objektum JSON kimenetként történő sorosításához.

A következőket fogjuk használni Autó osztály két mezővel a cikk sorozatszerűsítésének vagy deserializálásának objektumaként:

public class Car {private String color; privát String típus; // standard getters setters}

3.1. Java objektum a JSON-hoz

Lássuk az első példát a Java objektumok JSON-ba történő sorosítására a writeValue módszere ObjectMapper osztály:

ObjectMapper objectMapper = új ObjectMapper (); Autóautó = új autó ("sárga", "renault"); objectMapper.writeValue (új Fájl ("target / car.json"), autó); 

A fentiek kimenete a fájlban a következő lesz:

{"color": "sárga", "type": "renault"} 

A módszerek writeValueAsString és writeValueAsBytes nak,-nek ObjectMapper osztály létrehoz egy JSON-t egy Java objektumból, és a létrehozott JSON-t karakterláncként vagy byte tömbként adja vissza:

Karakterlánc carAsString = objectMapper.writeValueAsString (autó); 

3.2. JSON Java Object-re

Az alábbiakban bemutatunk egy egyszerű példát a JSON karakterlánc Java objektummá történő konvertálására a ObjectMapper osztály:

Karakterlánc json = "{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}"; Autó autó = objectMapper.readValue (json, Car.class); 

A readValue () A function más típusú bemeneteket is elfogad, például egy JSON karakterláncot tartalmazó fájlt:

Autó autó = objectMapper.readValue (új fájl ("src / test / resources / json_car.json"), Car.class);

vagy egy URL:

Autó autó = objectMapper.readValue (új URL ("fájl: src / test / resources / json_car.json"), Car.class);

3.3. JSON Jacksonnak JsonNode

Alternatív megoldásként egy JSON elemezhető a JsonNode objektum, és egy adott csomópont adatainak lekérésére használják:

Karakterlánc json = "{\" color \ ": \" Fekete \ ", \" type \ ": \" FIAT \ "}"; JsonNode jsonNode = objectMapper.readTree (json); Karakterlánc színe = jsonNode.get ("color"). AsText (); // Kimenet: szín -> fekete 

3.4. Java lista létrehozása JSON tömb karakterláncból

A JSON-t tömb formájában elemezhetjük egy Java objektumlistába az a használatával TypeReference:

Karakterlánc jsonCarArray = "[{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}, {\" color \ ": \" Red \ ", \" type \ ": \ "FIAT \"}] "; List listCar = objectMapper.readValue (jsonCarArray, új TypeReference(){}); 

3.5. Java térkép létrehozása JSON karakterláncból

Hasonlóképpen elemezhetünk egy JSON-t Java-ra Térkép:

Karakterlánc json = "{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}"; Térképtérkép = objectMapper.readValue (json, új TypeReference(){}); 

4. Speciális funkciók

A Jackson könyvtár egyik legnagyobb erőssége a rendkívül testreszabható sorosítási és deserializációs folyamat.

Ebben a szakaszban áttekintünk néhány speciális funkciót, amelyekben a bemeneti vagy kimeneti JSON válasz eltérhet a választ létrehozó vagy felemésztő objektumtól.

4.1. A Serialization vagy Deserialization Feature konfigurálása

Miközben a JSON objektumokat Java osztályokká konvertálja, abban az esetben, ha a JSON karakterláncnak van néhány új mezője, az alapértelmezett folyamat kivételt eredményez:

Karakterlánc jsonString = "{\" color \ ": \" Fekete \ ", \" type \ ": \" Fiat \ ", \" év \ ": \" 1970 \ "}"; 

A fenti példában szereplő JSON karakterlánc az alapértelmezett elemzési folyamat során a Osztályú autó eredményezi a UnrecognizedPropertyException kivétel.

Keresztül Beállítás módszerrel kibővíthetjük az alapértelmezett folyamatot az új mezők figyelmen kívül hagyásával:

objectMapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, hamis); Autó autó = objectMapper.readValue (jsonString, Car.class); JsonNode jsonNodeRoot = objectMapper.readTree (jsonString); JsonNode jsonNodeYear = jsonNodeRoot.get ("év"); Karakterlánc év = jsonNodeYear.asText (); 

Egy másik lehetőség a FAIL_ON_NULL_FOR_PRIMITIVES, amely meghatározza, hogy a nulla a primitív értékek megengedettek:

objectMapper.configure (DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, hamis); 

Hasonlóképpen, FAIL_ON_NUMBERS_FOR_ENUM ellenőrzi, hogy az enum értékeket meg lehet-e sorozni / deserializálni számként:

objectMapper.configure (DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, hamis);

A szerializáció és a dezerializálás funkcióinak átfogó listáját a hivatalos oldalon találja.

4.2. Egyéni Serializer vagy Deserializer létrehozása

A. Másik lényeges jellemzője ObjectMapper osztály az a képesség, hogy regisztráljon egy egyedi sorosítót és deserializátort.

Az egyedi sorosító és deserializátorok nagyon hasznosak olyan helyzetekben, amikor a bemeneti vagy kimeneti JSON válasz struktúrája eltér a Java osztálytól, amelybe sorosítani vagy deserializálni kell.

Az alábbiakban bemutatunk egy példát egy egyedi JSON-szerializálóra:

public class CustomCarSerializer kiterjeszti a StdSerializer {public CustomCarSerializer () {this (null); } public CustomCarSerializer (t osztály) {super (t); } @Orride public void serialize (Autó, JsonGenerator jsonGenerator, SerializerProvider serializer) {jsonGenerator.writeStartObject (); jsonGenerator.writeStringField ("car_brand", car.getType ()); jsonGenerator.writeEndObject (); }} 

Erre az egyedi sorosítóra lehet hivatkozni:

ObjectMapper mapper = új ObjectMapper (); SimpleModule module = new SimpleModule ("CustomCarSerializer", új verzió (1, 0, 0, null, null, null)); module.addSerializer (Autóosztály, új CustomCarSerializer ()); mapper.registerModule (modul); Autó autó = új autó ("sárga", "renault"); Karakterlánc carJson = mapper.writeValueAsString (autó); 

Itt van, amit a Autó úgy néz ki (JSON kimenetként) az ügyfél oldalon:

var carJson = {"car_brand": "renault"} 

És itt van egy példa egy egyedi JSON deserializer:

public class CustomCarDeserializer kiterjeszti a StdDeserializer {public CustomCarDeserializer () {this (null); } public CustomCarDeserializer (vc osztály) {super (vc); } @Orride public Car deserialize (JsonParser elemző, DeserializationContext deserializer) {Autó autó = új autó (); ObjectCodec kodek = parser.getCodec (); JsonNode csomópont = codec.readTree (elemző); // próbáld meg elkapni a blokkot JsonNode colorNode = node.get ("color"); Karakterlánc színe = colorNode.asText (); car.setColor (szín); visszatérő autó; }} 

Erre az egyéni deserializerre lehet hivatkozni:

Karakterlánc json = "{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}"; ObjectMapper mapper = új ObjectMapper (); SimpleModule module = new SimpleModule ("CustomCarDeserializer", új verzió (1, 0, 0, null, null, null)); module.addDeserializer (Car.class, új CustomCarDeserializer ()); mapper.registerModule (modul); Autó autó = mapper.readValue (json, Car.class); 

4.3. Dátumformátumok kezelése

Az alapértelmezett sorosítása java.util.Dátum számot, azaz korszakos időbélyeget állít elő (ezredmásodpercek száma 1970. január 1. óta, UTC). De ez nem túl emberileg olvasható, és további átalakítást igényel, hogy az ember által olvasható formátumban jelenjen meg.

Csomagoljuk be a Autó példát, amelyet eddig a Kérés osztály a Vásárlás dátuma ingatlan:

nyilvános osztály Kérelem {magánautó autó; private Date datePurchased; // standard getters setters} 

A dátum karakterlánc-formátumának vezérlése és beállítása pl. éééé-hh-nn HH: mm a z, vegye figyelembe a következő részletet:

ObjectMapper objectMapper = új ObjectMapper (); DateFormat df = new SimpleDateFormat ("éééé-HH-NN ÓÓ: mm a z"); objectMapper.setDateFormat (df); Karaktersorozat carAsString = objectMapper.writeValueAsString (kérés); // output: {"car": {"color": "yellow", "type": "renault"}, "datePurchased": "2016-07-03 11:43 CEST"} 

Ha többet szeretne megtudni a dátumokkal való sorosításról Jacksonnal, olvassa el alaposabb írásunkat.

4.4. Gyűjtemények kezelése

Egy másik kicsi, de hasznos szolgáltatás, amely a DeserializationJellemző osztály az a képesség, hogy előállítsuk a kívánt típusú JSON Array válaszból.

Például létrehozhatjuk az eredményt tömbként:

Karakterlánc jsonCarArray = "[{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}, {\" color \ ": \" Red \ ", \" type \ ": \ "FIAT \"}] "; ObjectMapper objectMapper = új ObjectMapper (); objectMapper.configure (DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true); Autó [] autók = objectMapper.readValue (jsonCarArray, Autó []. Osztály); // autók nyomtatása

Vagy mint a Lista:

Karakterlánc jsonCarArray = "[{\" color \ ": \" Fekete \ ", \" type \ ": \" BMW \ "}, {\" color \ ": \" Red \ ", \" type \ ": \ "FIAT \"}] "; ObjectMapper objectMapper = új ObjectMapper (); List listCar = objectMapper.readValue (jsonCarArray, új TypeReference() {}); // autók nyomtatása

További információ a gyűjteményekkel való Jackson-kezelésről itt érhető el.

5. Következtetés

Jackson egy szilárd és kiforrott JSON-sorosító / deserializációs könyvtár a Java számára. A ObjectMapper Az API egy egyszerű módszert kínál a JSON válaszobjektumok elemzésére és létrehozására nagy rugalmassággal. Ez a cikk megvitatta a könyvtár olyan népszerűségét.

A cikket kísérő forráskód megtalálható a GitHub oldalon.