4

我尝试了 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)

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

谢谢,大卫

4

1 回答 1

3

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

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

接着:

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

Either部分明确地模拟了这样一个事实,即您在编译时不知道在查找键时会获得哪种值。在 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))

我个人觉得第一种方法更干净一些。

于 2013-11-20T10:21:57.273 回答