2015-09-24 2 views
1

Рассмотрим следующий пример JSON:Play Framework 2 в Scala: Разбор вариационного формата JSON?

properties: { 
    "key1": "a", 
    "key2": 1, 
    "key3": null, 
    "key4": 0.56 
    .... 
    "key99": "zzzzz" 
} 

Мой код должен быть в состоянии разобрать, что в какой-то структуры Scala (случай класса?) И обратно в формат JSON.

Для меня, поскольку в properties нет конечного числа элементов, это выглядит как Map[String, T]. И поскольку значение каждого внутреннего свойства может быть нескольких типов, я не совсем уверен, как представить это как конечную структуру Scala. Документация по неявным Reads, Writes и Formats имеет смысл для меня, но они, похоже, не справляются с более сложными примерами, как и выше.

Возможно также, что я думаю об этом совершенно неправильно.

Я новичок в фреймворке (а также на языке), и мне нелегко обернуть голову вокруг того, как это должно быть представлено - любая оценка была бы очень признательна.

+1

Что вы хотите сделать с вашими данными, учитывая, что вы не знаете, какие клавиши или какой тип значений он может содержать? Поскольку вам все равно придется сериализовать его на JSON, похоже, что Json transformer - это ваша вещь. https://www.playframework.com/documentation/2.4.x/ScalaJsonTransformers – Tyth

+0

Я создаю приложение, которое в настоящее время принимает HTTP-запрос, аналогичный приведенному выше, переводит его на объект Scala, дополняет его дополнительными ключами/значениями, преобразует его обратно в JSON и проксирует запрос в другую систему. Ваш ответ думал, что я думаю об этом по-другому - возможно, мне не нужно, чтобы это было преобразовано в класс case - я мог бы просто использовать его как 'JsValue'. Это похоже на то, что я боюсь, Меня все еще интересует, как бы вы это сделали. – clocklear

+0

@clocklear Вам нужны значения в json для увеличения новых? –

ответ

1

Как отметил @Tyth, мы можем пересмотреть структуру вашего json. Может быть что-то вроде:

{ [ { "key" : "key1", "value" : "a" }, { "key" : "key2", "value" : "1" }, ..... 

будет лучше ...

Тем не менее, чтобы ответить на ваш вопрос вы можете сделать:

import play.api.libs.json._ 
val a = """{ 
|  "key1": "a", 
|  "key2": 1, 
|  "key3": null, 
|  "key4": 0.56 } 
| """ 
val b = Json.parse(a) 
val keys = b.as[JsObject].keys 

И вы можете напечатать ключи

scala> keys.foreach { k => println(b \ k) } 
"a" 
1 
null 
0.56 

Или поверните затем на карту JsValue

scala> keys.map { k => k -> (b \ k) }.toMap 
res4: scala.collection.immutable.Map[String,play.api.libs.json.JsValue] = Map(key1 -> "a", key2 -> 1, key3 -> null, key4 -> 0.56) 

Или Струны:

scala> keys.map { k => k -> (b \ k).toString }.toMap 
res3: scala.collection.immutable.Map[String,String] = Map(key1 -> "a", key2 -> 1, key3 -> null, key4 -> 0.56) 

EDIT (за увеличивающие комментарий):

scala> JsObject(b.as[JsObject].fields :+ ("key99" -> JsString("zzzz"))) 
res7: play.api.libs.json.JsObject = {"key1":"a","key2":1,"key3":null,"key4":0.56,"key99":"zzzz"} 
+0

Спасибо за понимание! Я подозреваю, что для меня достаточно информации для продолжения моего проекта. – clocklear

Смежные вопросы