2 votes

Scala & Circe : Encodage JSON avec champs optionnels

J'essaie d'utiliser Circe pour faire de l'encodage JSON comme suit :

import io.circe.{Encoder, Json}
import io.circe.syntax._

case class Person(name: String, nickname: Option[String] = None)

object EncodingTest extends App {
  val persons = List (Person("John", None), Person("Tania", Some("Awesome")))

  implicit val encodePerson: Encoder[Person] = (p: Person) => {
    Json.obj(
      ("name", Json.fromString(p.name)),
      ("nickname", Json.fromString(p.nickname.getOrElse(""))) // <- Problem is here
    )
  }

  for(person <- persons)
    println(person.asJson)
}

Idéalement, j'aimerais obtenir le résultat suivant :

{"name":"John"}
{"name":"Tania","nickname":"Awesome"}

Comment puis-je faire en sorte que l'encodeur saute le nickname dans le cas où la valeur du champ est None ?

4voto

Ivan Stanislavciuc Points 1680

Si vous souhaitez définir des encodeurs personnalisés et ne pas vous appuyer sur le système semi-automatique, voici comment procéder

import io.circe.{Encoder, Json}
import io.circe.syntax._

object CirceOptional extends App {

  case class Person(name: String, nickname: Option[String] = None)

  val encodePerson: Encoder[Person] = (p: Person) => {
    Json.obj(("name", p.name.asJson), ("nickname", p.nickname.asJson))
  }

  implicit val noNullEncoder: Encoder[Person] = encodePerson.mapJson(_.dropNullValues)

  val persons = List (Person("John", None), Person("Tania", Some("Awesome")))

  for(person <- persons)
    println(person.asJson)

}

2voto

bottaio Points 2154

La solution la plus simple consiste à collecter les champs qui vous intéressent.

Json.obj(List(
  ("name", Some(Json.fromString(p.name))),
  ("nickname", p.nickname.map(Json.fromString))
).collect {
  case (name, Some(value)) => name -> value
}: _*)

Une manière plus automatique d'obtenir ce que l'on veut :

import io.circe.generic.semiauto._
implicit val encodePerson: Encoder[Person] = deriveEncoder
person.asJson.dropNullValues

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X