Разбор динамического значения с помощью Lift-JSON - PullRequest
3 голосов
/ 22 мая 2010

Позвольте мне объяснить этот вопрос на примере. Если у меня есть JSON, как показано ниже:

{"person1": {"name": "Name One", "адрес": {"улица": "некоторые Улица "," город ":" Какой-то город "}},
"person2": {"name": "Name Two", "address": {"street": "Некоторые другие Улица "," город ":" Другой город "}}}

[Нет ограничений на количество человек, входной JSON может иметь гораздо больше людей]

Я мог бы извлечь этот объект JSON to Persons, выполнив

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

Вот соответствующие классы дел:

Адрес класса адрес (улица: Строка, город: String)
Класс дела Персона (имя: Строка, адрес: адрес, дети: Список [Ребенок])
кейс-класс Персоны (человек1: человек, человек2: Person)

Вопрос: Приведенный выше сценарий работает отлично. Однако необходимо, чтобы ключи были динамическими в парах ключ / значение. Таким образом, в приведенном JSON примере person1 и person2 могут быть чем угодно, мне нужно их динамически читать Какова наилучшая возможная структура для класса Persons для учета этой динамической природы.

1 Ответ

7 голосов
/ 22 мая 2010

Один из способов анализа, который заключается в сопоставлении дочерних элементов корневого объекта 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)))

Или вот так, если вам нужно сохранить имена полей:

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

Обратите внимание, что следующий прямой способ должен работать, когда мы начнем использовать функции 2.8:

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