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.