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.