2016-09-16 91 views
1

我有一個通用的JSON,其中所有的鍵和值都是字符串。Scala中的通用Json解析

例1:

[ 
    { 
    "key1": "value1" 
    }, 
    { 
    "key1": "value2" 
    } 
] 

但JSON也可以是: 例2:

[ 
    { 
    "key1": "value1", 
    "key2": "value2" 
    }, 
    { 
    "key1": "value3", 
    "key2": "value4" 
    } 
] 

我想將JSON轉換成地圖。 例1將轉換爲地圖[字符串,字符串]

例2將轉換到列表[地圖[字符串,字符串]]

所以基本上我想要的JSON轉換成地圖,並以此爲以下幾點:

地圖( 「KEY1」)( 「KEY2」)( 「KEY3」)

得到最終的結果值3。

請幫忙!!

+0

沒有這些例子是有效JSONs(你可以在這裏看到自己/) –

+0

'map(「key1」)(「key2」)(「key3」)'returns'value3' ???那個怎麼樣? 'key3'從哪裏來? – dk14

+0

其通用的'json'。你只能有一個鍵或n鍵。我想將'json'轉換爲嵌套地圖並想獲得地圖(k1)(k2)..(kn) – satendra

回答

1

使用play-json可使用validate將Json轉換爲地圖。驗證返回JsResult可能是JsSuccess(data,path)JsError(errors)。模式匹配從中獲取地圖。

檢查str是殼體1的如果不是回退到殼體2

Json.parse(jsonString).validate[Map[String, String]].getOrElse(json.validate[List[Map[String,String]]]) 

情況1:在地圖[字符串,字符串]

import play.api.libs.json._ 
val result = Json.parse(someValidJsonString).validate[Map[String, String]] 
result match { 
    case JsSuccess(map, _) => map 
    case JsError(errors) => Logger.error("json parsing failed") 
} 

情況2:對於列表[Map [String,String]]

import play.api.libs.json._ 
    val result = Json.parse(someValidJsonString).validate[List[Map[String, String]]] 
    result match { 
     case JsSuccess(list, _) => list 
     case JsError(errors) => Logger.error("json parsing failed") 
    } 

這裏someValidJsonString是你想如果你正在使用sbt project再加入play-json依賴於你的項目轉換爲地圖

JSON字符串。 https://jsonformatter.curiousconcept.com:

build.sbt

libraryDependencies ++= Seq("com.typesafe.play" %% "play-json" % "2.5.4") 

斯卡拉REPL

scala> import play.api.libs.json._ 
import play.api.libs.json._ 

scala> val map = Map("java" -> 1, "scala" -> 2) 
map: scala.collection.immutable.Map[String,Int] = Map(java -> 1, scala -> 2) 

scala> Json.toJson(map).validate[Map[String, Int]] 
res3: play.api.libs.json.JsResult[Map[String,Int]] = JsSuccess(Map(java -> 1, scala -> 2),) 

scala> val result = Json.toJson(map).validate[Map[String, Int]] 
result: play.api.libs.json.JsResult[Map[String,Int]] = JsSuccess(Map(java -> 1, scala -> 2),) 

scala> result match { case JsSuccess(data, _) => data case JsError(errors) => Unit} 
res4: Object = Map(java -> 1, scala -> 2) 
+0

挑戰不僅僅是將JSON轉換爲地圖,它的嵌套部分如此1'json'可以是{ 'k1':'v1'},{'k1':'v2'}} ie所有條目有1個元素,但其他可以是{{k1:v1,k2:v2},{k1:v3,k2:v4}}所以對於案例1我需要Map [String,String],但對於案例2我需要Map [字符串,地圖[字符串,字符串]] – satendra

+0

@satendra你知道何時出現案例 – pamu

+0

我想寫一個場景,其中用戶將文件放在平臺上的系統的代碼,並且系統存儲它的條目到'json'根據列的數量,每個單獨的'json'中會有條目數,但它們總是字符串,所以example1對應於1列文件,example2對應於具有2列的文件。 – satendra