Obrada JSON-a s Kotlinom i Klaxsonom

1. Pregled

Klaxon je jedna od biblioteka otvorenog koda koju možemo koristiti za raščlanjivanje JSON-a u Kotlinu.

U ovom uputstvu ćemo pogledati njegove značajke.

2. Ovisnost Mavena

Prvo, morat ćemo dodati ovisnost o knjižnici našem projektu Maven:

 com.beust klaxon 3.0.4 

Najnoviju verziju možete pronaći na jcenter ili u spremištu Spring Plugins.

3. API značajke

Klaxon ima četiri API-ja za rad s JSON dokumentima. Istražit ćemo ih u sljedećim odjeljcima.

4. API za vezanje objekata

Uz ovaj API, možemo povezati JSON dokumente s objektima Kotlin i obratno.

Za početak definirajmo sljedeći JSON dokument:

{"name": "HDD"}

Dalje ćemo stvoriti Proizvod razred za uvezivanje:

class Proizvod (val naziv: String)

Sada možemo testirati serializaciju:

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

A mi možemo testirati deserializaciju:

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

Ovaj API također podržava rad s klasama podataka kao i s promjenjivim i nepromjenjivim klasama.

Klaxon nam to dopušta prilagodite postupak mapiranja pomoću @Json bilješka. Ova bilješka ima dva svojstva:

  • Ime - za postavljanje drugog naziva polja
  • ignorirano - za ignoriranje polja postupka mapiranja

Stvorimo a CustomProduct predavanja kako biste vidjeli kako ovo funkcionira:

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

Sada, provjerimo to testom:

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

Kao što vidimo, Ime imovina je serializirana kao ime proizvoda, i iskaznica svojstvo se zanemaruje.

5. Streaming API

Pomoću Streaming API-ja možemo obrađivati ​​ogromne JSON dokumente čitajući iz streama. Ova značajka omogućuje našem kodu da obrađuje JSON vrijednosti dok još čita.

Moramo koristiti JsonReader klase iz API-ja za čitanje JSON streama. Ova klasa ima dvije posebne funkcije za upravljanje streamingom:

  • beginObject () - osigurava da je sljedeći token početak objekta
  • beginArray () - osigurava da je sljedeći token početak niza

Pomoću ovih funkcija možemo biti sigurni da je tok pravilno pozicioniran i da je zatvoren nakon konzumiranja objekta ili polja.

Isprobajmo API za streaming na nizu sljedećih ProductData razred:

podatkovna klasa ProductData (val ime: String, val kapacitetInGb: Int)
@Test zabave daoJsonArray_whenStreaming_thenGetProductArray () {val jsonArray = "" "[{" name ":" HDD "," capacityInGb ": 512}, {" name ":" RAM "," capacityInGb ": 16}]" "" val očekuje seArray = arrayListOf (ProductData ("HDD", 512), ProductData ("RAM", 16)) val klaxon = Klaxon () val productArray = arrayListOf () JsonReader (StringReader (jsonArray)). koristite {čitač -> čitač.beginArray {while (reader.hasNext ()) {val product = klaxon.parse (čitač) productArray.add (product !!)}}} assertThat (productArray) .hasSize (2) .isEqualTo (očekuje seArray)}

6. JSON Path Query API

Klaxon podržava značajku lokacije elementa iz JSON Path specifikacije. Pomoću ovog API-a možemo definirajte podudaranje puta kako biste pronašli određene unose u našim dokumentima.

Imajte na umu da i ovaj API struji te ćemo biti obaviješteni nakon što se element pronađe i raščlani.

Moramo koristiti PathMatcher sučelje. Ovo se sučelje poziva kada je JSON putanja pronašla podudaranja regularnog izraza.

Da bismo to iskoristili, moramo primijeniti njegove metode:

  • pathMatches () - vrati se true ako želimo promatrati ovaj put
  • onMatch () - ispaljeno kad je staza pronađena; imajte na umu da vrijednost može biti samo osnovni tip (npr. int, Niz) i nikad JsonObject ili JsonArray

Napravimo test kako bismo ga vidjeli na djelu.

Prvo definirajmo JSON dokument inventara kao izvor podataka:

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

Sada provodimo PathMatcher sučelje kako slijedi:

val pathMatcher = objekt: PathMatcher {nadjačati zabavne pathMatches (put: String) = Pattern.matches (". * inventory. * disks. * type. *", path) nadjačati zabavu onMatch (path: String, value: Any) {when (put) {"$ .inventory.disks [0] .type" -> assertThat (value) .isEqualTo ("HDD") "$ .inventory.disks [1] .type" -> assertThat (value) .isEqualTo ( "SDD")}}}

Imajte na umu da smo definirali regularni izraz kako bi odgovarao vrsti diska u našem popisnom dokumentu.

Sada smo spremni definirati naš test:

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

7. API niske razine

S Klaxonom možemo obrađivati ​​JSON dokumente poput Karta ili a Popis. Da bismo to učinili, možemo koristiti nastavu JsonObject i JsonArray iz API-ja.

Napravimo test da vidimo JsonObject u akciji:

@Test zabava dataJsonString_whenParser_thenGetJsonObject () {val jsonString = StringBuilder ("" "{" name ":" HDD "," capacityInGb ": 512," sizeInInch ": 2.5}" "") val parser = Parser () val json = parser .parse (jsonString) kao JsonObject assertThat (json) .hasSize (3) .containsEntry ("name", "HDD") .containsEntry ("capacityInGb", 512) .containsEntry ("sizeInInch", 2.5)}

Sada, napravimo test da vidimo JsonArray funkcionalnost:

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

Kao što možemo vidjeti u oba slučaja, pretvorbe smo izvršili bez definicije određenih klasa.

8. Zaključak

U ovom smo članku istražili biblioteku Klaxon i njezine API-je za rukovanje JSON dokumentima.

Kao i uvijek, izvorni kod dostupan je na Githubu.