首页 文章

Scala中的通用Json解析

提问于
浏览
1

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

例1:

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

但是JSON也可以是:例2:

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

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

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

所以基本上我想将JSON转换为Map并使用如下:

Map ( “KEY1”)( “KEY2”)( “KEY3”)

得到最终结果值3 .

请帮忙!!

1 回答

  • 1

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

    如果没有回退到案例2,检查str是否属于案例1

    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")
    

    Scala 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)
    

相关问题