Как пропустить пустые массивы в сгенерированном Json с помощью Circe? - PullRequest
1 голос
/ 07 мая 2019
//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": []. Как мне этого добиться?

A возможная альтернатива заключается в кодировании 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 Ответ

1 голос
/ 07 мая 2019

Попробуйте вместо этого,

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

, где вы говорите, чтобы он снова использовал стандартный кодировщик Vector вместо itemsEncoder.

...