Konvertálja a JSON-ot térképpé a Gson használatával

1. Bemutatkozás

Ebben a gyors bemutatóban megtudhatjuk, hogyan lehet JSON karakterláncot konvertálni a-ba Térkép felhasználásával Gson a Google-tól.

Három különböző megközelítést látunk ennek megvalósításához, és megvitatjuk előnyeiket és hátrányaikat - néhány gyakorlati példával.

2. Átadás Térkép.osztály

Általánosságban, A Gson a következő API-t biztosítja a Gson osztály egy JSON karakterlánc objektummá alakításához:

public T fromJson (String json, Class classOfT) dobja JsonSyntaxException;

Az aláírásból kiderül, hogy a második paraméter annak az objektumnak az osztálya, amelyet a JSON-nak szándékozunk értelmezni. Esetünkben annak kellene lennie Térkép.osztály:

String jsonString = "{'alkalmazott.név': 'Bob', 'alkalmazott.alga': 10000}"; Gson gson = új Gson (); Térképtérkép = gson.fromJson (jsonString, Térkép.osztály); Assert.assertEquals (2, map.size ()); Assert.assertEquals (Double.class, map.get ("alkalmazotti fizetés"). GetClass ());

Ez a megközelítés fogja a legjobban kitalálni az egyes tulajdonságok értéktípusát.

Például a számokat kényszerítik Kettőss, igaz és hamis -ba Logikai, és tárgyakat LinkedTreeMaps.

Ha azonban vannak duplikált kulcsok, akkor a kényszer kudarcot vall, és a-t dob JsonSyntaxException.

És miatt típusú törlés, ezt a kényszerítési magatartást sem tudjuk konfigurálni. Tehát, ha meg kell adnunk a kulcs- vagy értéktípusokat, akkor más megközelítésre lesz szükségünk.

3. Használata TypeToken

A típusok törlésének problémájának leküzdése az általános típusok esetében, Gson túlterhelt verziója van az API-nak:

public T fromJson (String json, Type typeOfT) dobja a JsonSyntaxException-t;

Felépíthetjük a Térkép típusú paramétereivel a Gson's segítségével TypeToken. A TypeToken osztály adja vissza a ParameterizedTypeImpl amely futás közben is megőrzi a kulcs típusát és értékét:

Karakterlánc jsonString = "{'Bob': {'name': 'Bob Willis'}," + "'Jenny': {'name': 'Jenny McCarthy'}," + "'Steve': {'name': 'Steven Waugh'}} "; Gson gson = új Gson (); Írja be az empMapType = új TypeToken parancsot() {} .getType (); Térkép neveEmployeeMap = gson.fromJson (jsonString, empMapType); Assert.assertEquals (3, névEmployeeMap.size ()); Assert.assertEquals (Employee.class, nameEmployeeMap.get ("Bob"). GetClass ()); 

Most, ha megalkotjuk a Térkép írja be Térkép, akkor az elemző továbbra is alapértelmezett lesz, ahogy az előző szakaszban láthattuk.

Természetesen ez még mindig visszafordul Gsonra a primitív típusok kényszerítésére. Ezek azonban testreszabhatóak is.

4. Az Egyéni használata JsonDeserializer

Amikor finom szemcsés irányításra van szükségünk a konstrukciónk felett Térkép objektummal megvalósíthatunk egy egyedi típusú deserializátort JsonDeserializer.

Példaként tegyük fel, hogy JSON-junk kulcsként az alkalmazott nevét, értékének pedig az alkalmazási dátumot tartalmazza. Tegyük fel továbbá, hogy a dátum formátuma az éééé / HH / NN, amely nem szabványos formátum a Gson.

Beállíthatjuk a Gson-t, hogy másképp elemezze a térképünket, majd a JsonDeserializer:

a StringDateMapDeserializer nyilvános osztály megvalósítja a JsonDeserializer programot {privát SimpleDateFormat formátum = új SimpleDateFormat ("éééé / hh / nn"); @Orride public Map deserialize (JsonElement elem, Type type, JsonDeserializationContext jsonDeserializationContext) {return elem.getAsJsonObject () .entrySet () .stream () .filter (e -> e.getValue (). IsJsonPrimitive () .filter (e -> e.getValue (). getAsJsonPrimitive (). isString ()) .collect (Collectors.toMap (Map.Entry :: getKey, e -> formatDate (e.getValue ()))); } private Date formatDate (Object value) {try {return format (value.getAsString ()); } catch (ParseException ex) {dobj új JsonParseException (ex); }}} 

Most regisztrálnunk kell a GsonBuilder a céltípusunkkal szemben Térkép> és hozzon létre egy testreszabott Gson tárgy.

Amikor felhívjuk a Json-tól API ezen Gson objektumot, az elemző meghívja az egyedi deserializálót, és visszaadja a kívánt értéket Térkép példa:

Karakterlánc jsonString = "{'Bob': '2017-06-01', 'Jennie': '2015-01-03'}"; Type type = new TypeToken() {}. getType (); Gson gson = new GsonBuilder () .registerTypeAdapter (type, new StringDateMapDeserializer ()) .create (); Térkép empJoiningDateMap = gson.fromJson (jsonString, típus); Assert.assertEquals (2, empJoiningDateMap.size ()); Assert.assertEquals (Dátum.osztály, empJoiningDateMap.get ("Bob"). GetClass ()); 

Ez a taktika akkor is hasznos, ha térképünk heterogén értékeket tartalmazhat, és tisztességes elképzelésünk van arról, hogy hány különböző típusú érték lehet ott.

Ha többet szeretne megtudni egy egyéni deserializerről a Gson, nyugodtan nézze át a Gson Deserialization Cookbook-ot.

5. Következtetés

Ebben a rövid cikkben számos módszert tanultunk meg, hogyan lehet térképet készíteni egy JSON-formázott karakterláncból. És megvitattuk ezen változatok megfelelő felhasználási eseteit is.

A példák forráskódja elérhető a GitHub oldalon.