Как разобрать массив объектов с помощью 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)