На домашней странице Play Framework они утверждают, что "JSON является гражданином первого класса". Мне еще предстоит доказать это.
В моем проекте я имею дело с довольно сложными структурами JSON. Это просто очень простой пример:
{
"key1": {
"subkey1": {
"k1": "value1"
"k2": [
"val1",
"val2"
"val3"
]
}
}
"key2": [
{
"j1": "v1",
"j2": "v2"
},
{
"j1": "x1",
"j2": "x2"
}
]
}
Теперь я понимаю, что Play использует Jackson для разбора JSON. Я использую Jackson в своих проектах Java, и я бы сделал что-то простое:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> obj = mapper.readValue(jsonString, Map.class);
Это хорошо проанализировало бы мой JSON в объекте Map, который я хочу - Карта строк и объектов, и позволил бы мне легко отличить массив от ArrayList
.
Тот же пример в Scala/Play будет выглядеть следующим образом:
val obj: JsValue = Json.parse(jsonString)
Это вместо этого дает мне проприетарный JsObject
тип, который на самом деле не тот, что я за ним.
Мой вопрос: могу ли я разбирать строку JSON в Scala/Play до Map
вместо JsObject
так же легко, как и в Java?
Боковой вопрос: есть ли причина, по которой JsObject
используется вместо Map
в Scala/Play?
Мой стек: Play Framework 2.2.1/ Scala 2.10.3/Java 8 64bit/Ubuntu 13.10 64bit
UPDATE: Я вижу, что ответ Трэвиса поддерживается, поэтому я думаю, что это имеет смысл для всех, но я все еще не понимаю, как это можно применить для решения моей проблемы. Скажем, у нас есть этот пример (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"
}
}
]
Третий элемент больше не соответствует моему определенному классу case - я снова на квадрате. Я могу использовать такие и гораздо более сложные структуры JSON на Java каждый день, а Scala предполагает, что я должен упростить свои JSON, чтобы он соответствовал политике типа "безопасный тип". Исправьте меня, если я ошибаюсь, но я, хотя этот язык должен служить данным, а не наоборот?
UPDATE2: Решение состоит в том, чтобы использовать модуль Jackson для Scala (пример в моем ответе).