Scala / Play: анализ JSON в карту вместо JsObject
На домашней странице Play Framework утверждают, что «JSON - гражданин первого класса». Я еще не видел доказательства этого.
В моем проекте я имею дело с довольно сложными структурами JSON. Это просто очень простой пример:
{
"key1": {
"subkey1": {
"k1": "value1"
"k2": [
"val1",
"val2"
"val3"
]
}
}
"key2": [
{
"j1": "v1",
"j2": "v2"
},
{
"j1": "x1",
"j2": "x2"
}
]
}
Теперь я понимаю, что Play использует Джексона для анализа JSON. Я использую Джексона в своих проектах Java, и я хотел бы сделать что-то простое, как это:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> obj = mapper.readValue(jsonString, Map.class);
Это было бы неплохо разобрать мой JSON в объект Map, что мне и нужно - Map пар строк и объектов и позволил бы мне легко приводить массив кArrayList
.
Тот же пример в Scala / Play будет выглядеть так:
val obj: JsValue = Json.parse(jsonString)
Это дает мне право собственностиJsObject
тип что не совсем то, что я после.
Мой вопрос: могу ли я проанализировать строку JSON в Scala / Play toMap
вместоJsObject
так же легко, как я бы сделал это на Java?
Дополнительный вопрос: есть ли причина, почемуJsObject
используется вместоMap
в Scala / Играть?
Мой стек: Play Framework 2.2.1 / Scala 2.10.3 / Java 8 64bit / Ubuntu 13.10 64bit
ОБНОВИТЬ: Я вижу, что за ответ Трэвиса проголосовали, поэтому я думаю, что это имеет смысл для всех, но я все еще не понимаю, как это можно применить для решения моей проблемы. Скажем, у нас есть этот пример (jsonString):
[
{
"key1": "v1",
"key2": "v2"
},
{
"key1": "x1",
"key2": "x2"
}
]
Ну, согласно всем указаниям, я теперь должен вставить все те шаблоны, которые я иначе не понимаю цели:
case class MyJson(key1: String, key2: String)
implicit val MyJsonReads = Json.reads[MyJson]
val result = Json.parse(jsonString).as[List[MyJson]]
Выглядит хорошо, а? Но подождите минуту, в массив добавляется еще один элемент, который полностью разрушает этот подход:
[
{
"key1": "v1",
"key2": "v2"
},
{
"key1": "x1",
"key2": "x2"
},
{
"key1": "y1",
"key2": {
"subkey1": "subval1",
"subkey2": "subval2"
}
}
]
Третий элемент больше не соответствует моему определенному классу дел - я снова на первом месте. Я могу использовать такие и гораздо более сложные структуры JSON в Java каждый день, предлагает ли Scala, чтобы я упростил свои JSON, чтобы соответствовать их политике «безопасности типов»? Поправьте меня, если я ошибаюсь, но я думаю, что этот язык должен обслуживать данные, а не наоборот?
UPDATE2: Решением является использование модуля Джексона для Scala (пример в моем ответе).