/ / Análisis de un valor dinámico con Lift-JSON - json, scala, lift

Análisis de un valor dinámico con Lift-JSON - json, scala, lift

Déjame explicarte esta pregunta con un ejemplo. Si tengo un JSON como el siguiente:

{"person1": {"name": "Name One", "dirección": {"calle": "algunos Calle "," ciudad ":" Alguna ciudad "}},
"person2": {"name": "Name Two", "address": {"street": "Some Other Calle "," ciudad ":" Alguna otra ciudad "}}}

[No hay restricción en el número de personas, la entrada JSON puede tener muchas más personas]

Podría extraer este objeto JSON a personas haciendo

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

Aquí están las clases de casos relacionados:

caso clase Dirección (calle: Cuerda, ciudad: String)
clase de caso Persona (nombre: Cadena, dirección: Dirección, niños: Lista [Niño]
clase de caso Personas (persona1: persona, persona2: Persona)

Pregunta: El escenario anterior funciona perfectamente bien. Sin embargo, la necesidad es que las claves sean dinámicas en los pares clave / valor. Así que en el ejemplo proporcionado por JSON, persona1 y persona2 Podría ser cualquier cosa, necesito leerlos dinámicamente. ¿Cuál es la mejor estructura posible para que la clase de Personas tenga en cuenta esa naturaleza dinámica?

Respuestas

7 para la respuesta № 1

Una forma de analizar es asignar elementos secundarios del objeto JSON raíz:

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

O así, si necesitas preservar los nombres de los campos:

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

Tenga en cuenta que la siguiente forma directa debería funcionar cuando comencemos a utilizar las características 2.8:

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