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ď č. 1Jedný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]]