2016-09-16 51 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