json - Scala & Circe:带有可选字段的 JSON 编码
问题描述
我正在尝试使用 Circe 进行一些 JSON 编码,如下所示:
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)
}
理想情况下,我希望得到以下输出:
{"name":"John"}
{"name":"Tania","nickname":"Awesome"}
nickname
如果字段值为 ,如何使编码器跳过该字段None
?
解决方案
如果您想定义自定义编码器而不依赖 semiauto,则以下工作
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)
}
推荐阅读
- python - 如何合并列表中的元素,如何比较列表中的两个元素
- c# - 使用可选导航属性 c# EF 急切加载
- wordpress - WP - 777 无法写入临时目录
- flutter - Flutter - 改变 TabBarView 的动画
- javascript - 使用 Mapbox-GL.JS 沿路线为多个点设置动画
- sql - SQL,显示来自不同表的计数不相等的所有条目
- java - Ksoap on android raed 来自 ac# web 服务的对象列表
- java - 如果字符串以 (aioeuAIOEU) 之类的元音结尾,我该怎么办?
- angular - 在 Angular 6 中设置重复定时任务的更好(高效/干净)方式是哪一种?
- reactjs - 包含数组的 API 响应的 TypeScript 声明