Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用Circe跳过生成的Json中的空数组?_Scala_Circe - Fatal编程技术网

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
  }