Spracovanie JSON s Kotlinom a Klaxsonom

1. Prehľad

Klaxon je jednou z otvorených knižníc, ktoré môžeme použiť na analýzu JSON v Kotline.

V tomto výučbe sa pozrieme na jeho funkcie.

2. Závislosť od Maven

Najprv budeme musieť do nášho projektu Maven pridať závislosť na knižnici:

 com.buust klaxon 3.0.4 

Najnovšiu verziu nájdete na serveri jcenter alebo v úložisku Spring Plugins.

3. Funkcie API

Klaxon má štyri API na prácu s dokumentmi JSON. Preskúmame ich v nasledujúcich častiach.

4. API viazania objektov

S týmto API môžeme viazať dokumenty JSON na objekty Kotlin a naopak.

Na začiatok definujeme nasledujúci dokument JSON:

{"name": "HDD"}

Ďalej vytvoríme Výrobok trieda pre väzbu:

trieda Produkt (názov hodnoty: String)

Teraz môžeme testovať serializáciu:

@Test fun givenProduct_whenSerialize_thenGetJsonString () {val product = Product ("HDD") val result = Klaxon (). ToJsonString (product) assertThat (result) .isEqualTo ("" "{" name ":" HDD "}" "") }

A môžeme otestovať deserializáciu:

@Test fun givenJsonString_whenDeserialize_thenGetProduct () {val result = Klaxon (). Parse ("" "{" name ":" RAM "}" "") assertThat (result? .Name) .isEqualTo ("RAM")}

Toto API tiež podporuje prácu s dátovými triedami, ako aj s premenlivými a nemennými triedami.

Klaxon nám to umožňuje prispôsobiť proces mapovania pomocou @Json anotácia. Táto anotácia má dve vlastnosti:

  • názov - na nastavenie iného názvu polí
  • ignorované - na ignorovanie polí procesu mapovania

Vytvorme a Vlastný výrobok triedy, aby ste zistili, ako fungujú:

class CustomProduct (@Json (name = "productName") val name: String, @Json (ignored = true) val id: Int)

Teraz to overíme testom:

@Test fun givenCustomProduct_whenSerialize_thenGetJsonString () {val product = CustomProduct ("HDD", 1) val result = Klaxon (). ToJsonString (product) assertThat (result) .isEqualTo ("" "{" productName ":" HDD "}" " ")}

Ako vidíme, názov majetok je serializovaný ako Meno Produktua id vlastnosť je ignorovaná.

5. Streamovacie API

Pomocou Streaming API dokážeme spracovať obrovské dokumenty JSON čítaním zo streamu. Táto vlastnosť umožňuje nášmu kódu spracovávať hodnoty JSON, keď je stále v režime čítania.

Musíme použiť JsonReader triedy z API na čítanie streamu JSON. Táto trieda má dve špeciálne funkcie na streamovanie:

  • beginObject () - zaisťuje, aby nasledujúci token bol začiatkom objektu
  • beginArray () - zabezpečí, aby nasledujúci token bol začiatkom poľa

Pomocou týchto funkcií si môžeme byť istí, že prúd je správne umiestnený a že je uzavretý po spotrebovaní objektu alebo poľa.

Vyskúšajme streamovacie rozhranie API na nasledujúcom poli Údaje o produkte trieda:

dátová trieda ProductData (názov úrovne: String, kapacita kapacityInGb: Int)
@Test fun givenJsonArray_whenStreaming_thenGetProductArray () {val jsonArray = "" "[{" name ":" HDD "," capacityInGb ": 512}, {" name ":" RAM "," capacityInGb ": 16}]" "" val expectArray = arrayListOf (ProductData ("HDD", 512), ProductData ("RAM", 16)) val klaxon = Klaxon () val productArray = arrayListOf () JsonReader (StringReader (jsonArray)). use {reader -> reader.beginArray {while (reader.hasNext ()) {val product = klaxon.parse (reader) productArray.add (product !!)}}} assertThat (productArray) .hasSize (2) .isEqualTo (expectArray)}

6. API JSON Path Query

Klaxon podporuje funkciu umiestnenia prvku zo špecifikácie cesty JSON. S týmto API môžeme definujte porovnávače ciest na vyhľadanie konkrétnych položiek v našich dokumentoch.

Upozorňujeme, že aj toto rozhranie API sa streamuje. Po nájdení a analýze prvku budeme informovaní.

Musíme použiť PathMatcher rozhranie. Toto rozhranie sa volá, keď cesta JSON našla zhody regulárneho výrazu.

Aby sme to mohli využiť, musíme implementovať jeho metódy:

  • pathMatches () - návrat true, ak chceme pozorovať túto cestu
  • onMatch () - vystrelil, keď sa nájde cesta; hodnota môže byť iba základného typu (napr. int, String) a nikdy JsonObject alebo JsonArray

Urobme test, aby sme videli, ako je to v praxi.

Najskôr definujeme dokument JSON inventára ako zdroj údajov:

{"inventory": {"disks": [{"type": "HDD", "sizeInGb": 1000}, {"type": "SDD", "sizeInGb": 512}]}}

Teraz implementujeme PathMatcher rozhranie takto:

val pathMatcher = object: PathMatcher {override fun pathMatches (path: String) = Pattern.matches (". * inventory. * disks. * type. *", path) override fun onMatch (path: String, value: Any) {when (cesta) {"$ .inventory.disks [0] .typ" -> assertThat (hodnota) .isEqualTo ("HDD") "$ .inventory.disks [1] .typ" -> assertThat (hodnota) .isEqualTo ( „SDD“)}}}

Všimnite si, že sme definovali regulárny výraz tak, aby zodpovedal typu disku nášho inventárneho dokumentu.

Teraz sme pripravení definovať náš test:

@Test zábava givenDiskInventory_whenRegexMatches_thenGetTypes () {val jsonString = "" "..." "" val pathMatcher = // ... Klaxon (). PathMatcher (pathMatcher) .parseJsonObject (StringReader (jsonString))}

7. Nízkoúrovňové API

Pomocou Klaxonu môžeme spracovávať dokumenty JSON ako a Mapa alebo a Zoznam. K tomu môžeme použiť triedy JsonObject a JsonArray z API.

Urobme test a uvidíme JsonObject v akcii:

@Test zábava givenJsonString_whenParser_thenGetJsonObject () {val jsonString = StringBuilder ("" "{" name ":" HDD "," capacityInGb ": 512," sizeInInch ": 2.5}" "") val parser = Parser () val json = parser .parse (jsonString) ako JsonObject assertThat (json) .hasSize (3) .containsEntry ("name", "HDD") .containsEntry ("capacityInGb", 512) .containsEntry ("sizeInInch", 2,5)}

Teraz urobme test, aby sme videli JsonArray funkčnosť:

@Test fun givenJsonStringArray_whenParser_thenGetJsonArray () {val jsonString = StringBuilder ("" "[{" name ":" SDD "}, {" madeIn ":" Taiwan "}, {" warrantyInYears ": 5}]" "") val parser = Parser () val json = parser.parse (jsonString) ako JsonArray assertSoftly ({softly -> softly.assertThat (json) .hasSize (3) softly.assertThat (json [0] ["name"])). IsEqualTo (" SDD ") softly.assertThat (json [1] [" madeIn "]). IsEqualTo (" Taiwan ") softly.assertThat (json [2] [" warrantyInYears "]). IsEqualTo (5)})}

Ako vidíme v oboch prípadoch, prevody sme uskutočnili bez definície konkrétnych tried.

8. Záver

V tomto článku sme preskúmali knižnicu Klaxon a jej API na prácu s dokumentmi JSON.

Ako vždy, zdrojový kód je k dispozícii na stránkach Github.


$config[zx-auto] not found$config[zx-overlay] not found