Play json:解析long数组吗?

问题描述 投票:0回答: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)

它打印:

解析:无

为什么我的代码不起作用以及如何使用play-json正确解析此json?

scala playframework
1个回答
0
投票

问题是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)))))
© www.soinside.com 2019 - 2024. All rights reserved.