Play json: разобрать массив длинных массивов? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть такая структура json:

{
  "results": [
    {
      "values": [
        [
          1570054140892,
          1
        ],
        [
          1570208848841,
          1
        ]
      ]
    }
  ]
}

Я пытаюсь проанализировать ее в Scala, используя библиотеку play-json с этим кодом:

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

Почему мой код не работает и как правильно проанализировать этот json с play-json?

1 Ответ

1 голос
/ 07 октября 2019

Проблема в 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, подобный этому:

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)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...