Как разобрать массив объектов с помощью Circe

У меня есть джсон

{ "field" : [ { "value" : 1.0 }, { "value" : 2.0 } ] }

Как мне получить List[String] которые имеют значения List(1.0, 2.0)?

2 ответа

Решение

Лично я бы сделал это так:

import io.circe.generic.auto._
import io.circe.parser.decode

case class ValueWrapper(value: Double)
case class Result(field: Seq[ValueWrapper])

decode[Result](jsonString).map(_.field.map(_.toString)).getOrElse(Seq.empty)

На самом деле, вы могли бы сделать это без Decoder Вывод. По сути это означает, что вы не используете наиболее часто используемую часть Circe, а вместо этого полагаетесь на оптику Circe. Я думаю, что это будет что-то вроде (я не проверял это!):

import io.circe.optics.JsonPath._
root.field.value.double.getAll(jsonString).map(_.toString)

Оптика Circe - самый лаконичный способ сделать это.

import io.circe.optics.JsonPath._
import io.circe.parser._

val json = parse(jsonStr).right.get // TODO: handle parse errors

root.field.each.value.double.getAll(json) // == List(1.0, 2.0)
Другие вопросы по тегам