Scala 如何使用Circe跳过生成的Json中的空数组?
我试过这样做:Scala 如何使用Circe跳过生成的Json中的空数组?,scala,circe,Scala,Circe,我试过这样做: //Domain case class Item(price: Int) case class Data(name: String, items: Vector[Item]) Data("stackoverflow", Vector(Item(100))).asJson //ouput: { "name": "stackoverflow", "items": [ { "price": 100 } ] } // With Empty items: D
//Domain
case class Item(price: Int)
case class Data(name: String, items: Vector[Item])
Data("stackoverflow", Vector(Item(100))).asJson
//ouput:
{
"name": "stackoverflow",
"items": [
{
"price": 100
}
]
}
// With Empty items:
Data("stackoverflow", Vector()).asJson
// expected output:
{
"name": "stackoverflow",
"items": null // Can be removed with Printer.noSpaces.copy(dropNullValues = true)
}
这将导致一个堆栈溢出错误
目标:如果数组中没有元素,则输出中不应有任何空数组“items”:[]
。我怎样才能做到这一点
一种可能的替代方法是编码选项[Vector[Item]]
如下:
implicit val itemsEncoder: Encoder[Vector[Item]] = (items: Vector[Item]) => {
if (items.nonEmpty) items.asJson else Json.Null
}
我不喜欢这个解决方案,因为它强制域对象上的选项
类型只生成Json。试试这个
implicit val optionalVector: Encoder[Option[Vector[Item]]] = {
case Some(v) =>
if(v.isEmpty) Json.Null else v.asJson
case None => Json.Null
}
您告诉它再次使用标准的
矢量
编码器而不是itemsEncoder
。我从未想到……有趣。我试过了,它没有抛出所以
所以也许它确实有效:)@PhD是的,当你调用时。asJson
它会寻找合适的编码器
,因为项
是一个向量[项]
它就像“哦,太好了,我这里有一个”。。。无限。。。
implicit val itemsEncoder: Encoder[Vector[Item]] = (items: Vector[Item]) => {
if (items.nonEmpty) items.asJson(Encoder.encodeVector) else Json.Null
}