我尝试了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)
如果我不能,我如何获得密钥的值(希望没有正则表达式) 我宁愿避免为它创建一个特定的对象,因为某些键可以改变。
谢谢, 大卫
答案 0 :(得分: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
的概念有很多introductions,但简而言之,您可以像这样使用它:
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))
我个人认为第一种方法更清洁。