繁体   English   中英

Scala中的通用Json解析

[英]Generic Json Parsing in Scala

我有一个通用的JSON,其中所有键和值都是字符串。

例1:

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

但JSON也可以是:Example2:

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

我想将JSON转换为Map。 示例1将转换为Map [String,String]

示例2将转换为List [Map [String,String]]

所以基本上我想将JSON转换为Map并按以下方式使用它:

地图( “KEY1”)( “KEY2”)( “KEY3”)

得到最终结果值3。

请帮忙!!

使用play-json您可以使用validate将Json转换为Map。 验证返回JsResult ,它可以是JsSuccess(data,path)JsError(errors) 模式匹配可从中获取地图。

检查str是否属于情况1,如果不退回到情况2

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

情况1:对于Map [String,String]

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是您想要转换为Map的json字符串

如果您正在使用sbt project则将play-json依赖项添加到您的项目中。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM