如何通过Circe跳过生成的Json中的空数组?

时间:2019-05-07 20:14:03

标签: 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:
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。

1 个答案:

答案 0 :(得分:1)

试试看,

  implicit val itemsEncoder: Encoder[Vector[Item]] = (items: Vector[Item]) => {
    if (items.nonEmpty) items.asJson(Encoder.encodeVector) else Json.Null
  }

告诉您再次使用标准Vector编码器而不是itemsEncoder