播放 json:解析长数组?
Play json: parse array of arrays of longs?
我有这个 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)
它打印:
parsed: None
为什么我的代码不起作用以及如何使用 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))
或者您可以使用这样的案例 class:
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)))))
我有这个 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)
它打印:
parsed: None
为什么我的代码不起作用以及如何使用 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))
或者您可以使用这样的案例 class:
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)))))