您可以将整个对象转换为映射到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))
我个人觉得第一种方法更干净一些。