-->

如何跳过与瑟茜所产生的Json空数组?(How to skip over empty arrays

2019-09-28 16:43发布

//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。

Answer 1:

试试这个,

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

在这里你告诉它使用标准Vector编码器,而不是itemsEncoder一次。



文章来源: How to skip over empty arrays in the generated Json with Circe?
标签: scala circe