Вы видите field: null
, потому что circe превращается Option[T]
в t.asJson
на Some[T]
и JsonNull
на None
, а кодировщик класса дел по умолчанию просто помещает все поля в JsonObject
. Таким образом, что Circe использует для кодирования семейства запечатанных признаков, он может использовать эти поля null
для различения guish классов, таких как
sealed trait Foo
case class Bar(a: Option[String])
case class Baz(a: Option[String], b: Option[String])
Так что, если вы действительно Если вы хотите отбросить эту информацию и нуждаетесь в одностороннем преобразовании с потерей информации, вы можете отобразить результирующее Json
, чтобы отбросить все пустые поля с таким кодом:
implicit val fooEnc: Encoder[Foo] = deriveEncoder[Foo].mapJsonObject{jsonObj => jsonObj.filter{case (k,v) => !v.isNull}}
Однако вы должны написать такой Пользовательский код c для любого класса, который вы хотите удалить пустые поля. Чтобы постобработать json, вы можете использовать Fold на результирующем json:
val json: Json = ???
json.fold[Json](
Json.Null,
Json.fromBoolean,
{_.asJson},
{_.asJson},
{_.asJson},
{jsonObj => jsonObj.filter{case (k,v) => !v.isNull}.asJson}
)
или создать собственную папку.