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 № 1Una 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]]