我有这个json结构:
{
"results": [
{
"values": [
[
1570054140892,
1
],
[
1570208848841,
1
]
]
}
]
}
我正在尝试使用具有以下代码的play-json库在Scala中解析它:
val results: Option[JsValue] = (json \ "results") match {
case JsDefined(value: JsValue) => Some(value)
case JsUndefined() => None
}
val valueReads: Reads[List[List[Long]]] = (JsPath \ "values").read[List[List[Long]]]
val parsed = results.flatMap{ r =>
r.validate[List[List[Long]]](valueReads) match {
case s: JsSuccess[List[List[Long]]] => Some(s)
case _: JsError => None
}}
println("parsed: " + parsed)
它打印:
解析:无
为什么我的代码不起作用以及如何使用play-json正确解析此json?
问题是r
内的flatMap
是仅包含一个对象的JsArray
本身。此内部对象是您要寻找的对象。
因此,您可以通过以下方式使代码起作用:
val parsed = results.flatMap{ r =>
r.as[JsArray].value.head.validate[List[List[Long]]](valueReads) match {
case s: JsSuccess[List[List[Long]]] => Some(s)
case _: JsError => None
}}
parsed: Some(JsSuccess(List(List(1570054140892, 1), List(1570208848841, 1)),/values))
或者您可以使用这样的案例类:
case class LongList(values : List[List[Long]])
case class Parent(results : List[LongList])
implicit val cnv = Json.format[LongList]
implicit val cnv2 = Json.format[Parent]
val parsed = json.as[Parent]
println(parsed)
输出:
Parent(List(LongList(List(List(1570054140892, 1), List(1570208848841, 1)))))