//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)
}
我尝试做类似的事情:
implicit val itemsEncoder: Encoder[Vector[Item]] = (items: Vector[Item]) => {
if (items.nonEmpty) items.asJson else Json.Null
}
这将导致StackoverflowError
。
目标:如果数组中没有元素,则输出中不应有任何空数组"items": []
。我该如何实现?
可能的替代是像这样对Option[Vector[Item]]
进行编码:
implicit val optionalVector: Encoder[Option[Vector[Item]]] = {
case Some(v) =>
if(v.isEmpty) Json.Null else v.asJson
case None => Json.Null
}
我不喜欢这种解决方案,因为它在域对象上强制使用Option
类型只是为了生成Json。
答案 0 :(得分:1)
试试看,
implicit val itemsEncoder: Encoder[Vector[Item]] = (items: Vector[Item]) => {
if (items.nonEmpty) items.asJson(Encoder.encodeVector) else Json.Null
}
告诉您再次使用标准Vector
编码器而不是itemsEncoder
。