当前位置: 首页 > 知识库问答 >
问题:

Scala中的通用Json解析

孔安阳
2023-03-14

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

示例1:

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

但JSON也可以是:例如2:

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

我想将JSON转换为映射。示例1将转换为Map[字符串,字符串]

示例2将转换为列表[映射[字符串,字符串]]

因此,基本上我想将JSON转换为Map,并按如下方式使用它:

地图(“键1”)(“键2”)(“键3”)

获取最终结果值3。

请帮忙!!

共有1个答案

岑光熙
2023-03-14

使用play-json您可以使用验证将Json转换为Map。验证返回JsResult,它可以是Js成功(数据、路径)JsError(错误)。模式匹配以从中获取地图。

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

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

案例1:对于Map[字符串,字符串]

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:对于列表[映射[字符串,字符串]]

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项目,那么将依赖项添加到您的项目中。

建筑sbt公司

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

Scala复制

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)
 类似资料:
  • 问题内容: 我正在使用Scala 2.8中的JSON类中的构建来解析JSON代码。由于最小化依赖性,我不想使用Liftweb或其他任何一种。 我这样做的方法似乎势在必行,是否有更好的方法可以做到? 问题答案: 这是一个基于提取器的解决方案,它将进行类转换: 在for循环的开始,我人为地将结果包装在一个列表中,以便在最后生成一个列表。然后在for循环的其余部分中,我将使用生成器(使用)和值定义(使用

  • 假设我需要解析一个JSON(见下文)。 首先,我解析“status”字段,以获得的实例(见下文) 我可以用解析JSON以获得而不首先获得吗?

  • 本文向大家介绍Scala解析Json字符串的实例详解,包括了Scala解析Json字符串的实例详解的使用技巧和注意事项,需要的朋友参考一下 Scala解析Json字符串的实例详解 1. 添加相应依赖        Json解析工具使用的 json-smart,曾经对比过Java的fastjson、gson。Scala的json4s、lift-json。其中 json-smart 解析速度是最快的。

  • Scala JSON 是 Scala 用来操作和解析 JSON 数据的工具包。

  • 问题内容: 但是我无法从中得到答案。上面链接的答案: 它运作良好,但我想对泛型使用隐式运算符。见下文: 然后,我尝试将Class参数传递给方法: 然后出现一个错误: 谁能告诉我为什么会出现此错误?TypeToken类不支持隐式运算​​符吗? 问题答案: 您可以这样:

  • 问题内容: 在Java中,我可以这样做: … 当然假设()。 使用 Scala 时, Scala 的模拟与此类似吗? (当然)不会编译-但是如何以这样的方式声明变量? 编辑 ; 我要补充一点。这种差异显然与以下事实有关:在Java中,泛型 在T 中 从不协变 ,而在Scala中,它们可以是协变的,也可以不是。例如,Scala类在T中是协变的(并且必然是不变的)。因此, 将编译 以下内容: 我还在为