如何使用 scala 和 json spray 将混合类型值的 json 转换为 json

Posted

技术标签:

【中文标题】如何使用 scala 和 json spray 将混合类型值的 json 转换为 json【英文标题】:how do i convert json with mixed type values to json with scala and json spray 【发布时间】:2013-12-04 06:17:11 【问题描述】:

我尝试了 json spray 的教程,但我有一个不同的字符串,其中一个值是字符串,另一个是列表。 如何将以下字符串转换为每个键是列表或字符串的 json 对象?

source = """ "some": "JSON source", "kuku":["fu"] """

我写了一小段代码,但无法从这里继续:

val source = """ "some": "JSON source", "kuku":["fu"] """
val jsonAst = source.asJson
val kuku = jsonAst.convertTo[?]
println(kuku)

如果我不能,我如何获得一些键的值(希望没有正则表达式) 我宁愿避免为其创建特定对象,因为某些键可以更改。

谢谢, 大卫

【问题讨论】:

【参考方案1】:

您可以将整个对象转换为映射到Either

val jsonMap = jsonAst.convertTo[Map[String, Either[String, List[String]]]]

然后:

scala> println(jsonMap)
Map(some -> Left(JSON source), kuku -> Right(List(fu)))

Either 部分明确地模拟了这样一个事实,即您在编译时不知道查找键时会得到哪种值。 introductions 在 Scala 中有很多 Either 的想法,但总之你可以像这样使用它:

val some: String = jsonMap("some").left.getOrElse(
  ??? /* Provide a default value, throw an exception, etc. */
)

val kuku: List[String] = jsonMap("kuku").right.getOrElse(
  ??? /* Provide a default value, throw an exception, etc. */
)

或者,更好的是,处理密钥可能不同时存在的事实:

val some: String = jsonMap.get("some").flatMap(_.left.toOption).getOrElse(
  ??? /* Provide a default value, throw an exception, etc. */
)

或者,您可以导航到 "kuku" 字段,然后进行转换:

val kuku = jsonAst.asJsObject.getFields("kuku").headOption.map(
  _.convertTo[List[String]]
)

然后:

scala> kuku
res0: Option[List[String]] = Some(List(fu))

我个人觉得第一种方法更简洁一些。

【讨论】:

感谢您的精彩解释。我如何在没有左侧的情况下获得值“JSON 源”? println(jsonMap.get("kuku").get) 给了我 Left("JSON source") 我刚刚添加了一些关于Either的cmets。

以上是关于如何使用 scala 和 json spray 将混合类型值的 json 转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

scala spray-json 如何解析一个复杂的 数组JSON

如何在scala akka(spray)中为rest服务编写测试用例

Scala,spray-json:通用枚举 json 格式

使用spray json的一点小经验

spray-json

如何让 Shiro 在 Scala + Akka + Spray 环境中工作