/ / Analýza dynamickej hodnoty pomocou Lift-JSON - json, scala, lift

Analýza dynamickej hodnoty pomocou Lift-JSON - json, scala, lift

Dovoľte mi vysvetliť túto otázku pomocou príkladu. Ak mám JSON, ako je napríklad toto:

{"person1": {"name": "Name One", "adresa": {"street": "Niektoré Ulica "," mesto ":" Niektoré mesto "}},
"person2": {"name": "Name Two", "address": {"street": "Some Other Ulica "," mesto ":" Iné mesto "}}}

[Neexistuje žiadne obmedzenie počtu osôb, vstup JSON môže mať omnoho viac osôb]

Týmto objektom JSON by som mohol extrahovať tento objekt

var osoby = parse (res) .extract [T]

Tu sú súvisiace triedy prípadov:

trieda adresa (ulica: String, mesto: String)
trieda prípadu (meno: Reťazec, adresa: adresa, deti: Zoznam [dieťa])
trieda prípadov Osoby (osoba1: osoba, osoba2: osoba)

Otázka: Vyššie uvedený scenár funguje úplne dobre. Je však potrebné, aby boli kľúče dynamické v pároch kľúč / hodnota. Takže v príklade, ktorý spoločnosť JSON poskytla, PERSON1 a person2 môže byť čokoľvek, musím ich čítať dynamicky. Aká je najlepšia možná štruktúra pre triedu Osoby, ktorá zodpovedá za túto dynamickú povahu.

odpovede:

7 pre odpoveď č. 1

Jedným zo spôsobov, ako analyzovať, je mapovanie nad podradenými prvkami koreňového objektu JSON:

scala> parse(res).children.map(_.extract[Person])
res3: List[Person] = List(Person(Name One,Address(Some Street,Some City)), Person(Name Two,Address(Some Other Street,Some Other City)))

Alebo sa vám to páči, ak potrebujete zachovať názvy polí:

scala> Map() ++ parse(res).children.map { case f: JField => (f.name, f.extract[Person]) }
res4: scala.collection.immutable.Map[String,Person] = Map(person1 -> Person(Name One,Address(Some Street,Some City)), person2 -> Person(Name Two,Address(Some Other Street,Some Other City)))

Keď začneme používať 2,8 funkcie, mal by fungovať nasledujúci priamy spôsob:

parse(res).extract[Map[String, Person]]