2010-05-22 9 views
3

Permettez-moi d'expliquer cette question par un exemple. Si j'ai un JSON comme ce qui suit:Analyse d'une valeur dynamique avec Lift-JSON

{ "person1": { "name": "Nom One", "adresse": { "rue": "Certains rue ", "ville": "Some City"}},
"person2": {"name": "Nom 2", "adresse": {"street": "Quelques autres Street", "city": "Some Other City"} }}

[Il n'y a aucune restriction quant au nombre de personnes, le JSON d'entrée peut avoir beaucoup plus de personnes]

I co ULD extrait ce JSON aux personnes objet en faisant

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

Voici les classes de cas liés:

classe affaire Adresse (rue: String, ville: String)
cas personne de classe (nom: String, adresse: adresse, les enfants: Liste [des enfants])
cas classe Personnes (person1: Personne, PERSON2: personne)

Question: Le scénario ci-dessus fonctionne parfaitement bien. Cependant le besoin est que les clés soient dynamiques dans les paires clé/valeur. Donc, dans l'exemple JSON fourni, personne1 et personne2 pourrait être quelque chose, j'ai besoin de les lire dynamiquement. Quelle est la meilleure structure possible pour la classe Personnes pour rendre compte de cette nature dynamique?

Répondre

7

Une façon d'analyser qui est à la carte sur des éléments de l'enfant de l'objet JSON racine:

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))) 

Ou comme si vous devez conserver les noms de champs:

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))) 

Note, la suivant la voie directe devrait fonctionner lorsque nous commençons à utiliser 2.8 caractéristiques:

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

Great! ça a marché comme du charme. BTW vous avez fait un excellent travail avec lift-json, tout simplement superbe. J'aimerais utiliser Maps et Lists au niveau racine, avec un peu de chance, je l'espère. –

+0

Merci Surya! J'attends avec impatience une transition complète à 2,8 aussi. Je suppose que nous allons commencer à utiliser les fonctionnalités de 2.8 après la sortie de Lift 2.0 (le premier candidat à la sortie sort bientôt). – Joni

+0

Salut Joni, est-ce que lift-json fait des objets Map racine maintenant? J'utilise lift 2.2 pour Scala 2.8.1 et je ne semble pas avoir cette fonctionnalité –