2015-09-24 22 views
1

請看下面的例子JSON:在Scala中播放框架2:分析可變參數JSON格式?

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

我的代碼需要能夠解析成某種斯卡拉結構(案例類?)並返回到JSON。

對我來說,因爲有沒有的properties中的元素數量有限的,這看起來像一個Map[String, T]。由於每個內部屬性的值可以是多種類型,我不完全確定如何將其表示爲有限的Scala結構。關於隱含的Reads,WritesFormats的文檔對我來說是有意義的,但它們似乎不能處理更復雜的示例,如上所述。

這也完全可能我正在考慮這個完全錯誤的。

我是新來的框架(以及語言),我很難包圍我的頭如何應該代表 - 任何洞察力將不勝感激。

+1

你想要做你的數據,考慮到你不知道什麼做什麼鍵或它可以包含什麼類型的值?因爲無論如何你需要將它序列化爲JSON,看起來Json變壓器是你的事情。 https://www.playframework.com/documentation/2.4.x/ScalaJsonTransformers – Tyth

+0

我正在構建一個應用程序,該應用程序目前採用類似於上述的HTTP請求,將其轉換爲Scala對象,並使用更多的鍵/值對其進行擴充,將其轉換回JSON,並將請求代理到另一個系統。你的反應思想讓我以另一種方式思考 - 這可能不需要將它轉換爲案例類 - 我可以將它用作「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) 

編輯(每擴充評論):

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