将列表转换为 Json

Convert List to Json

如何创建如下所示的 Json (Circe):

{
 "items": [{
   "field1": "somevalue",
   "field2": "somevalue2"
  },
  {
   "field1": "abc",
   "field2": "123abc"
  }]
}

val result = Json.fromFields(List("items" -> ???))

您可以使用 Circe 的内置列表类型classes 进行编码 JSON。此代码将起作用:

import io.circe.{Encoder, Json}
import io.circe.syntax._

case class Field(field1: String, field2: String)

object Field {
  implicit val encodeFoo: Encoder[Field] = new Encoder[Field] {
    final def apply(a: Field): Json = Json.obj(
      ("field1", Json.fromString(a.field1)),
      ("field2", Json.fromString(a.field2))
    )
  }
}

class Encoding(items: List[Field]) {
  def getJson: Json = {
    Json.obj(
      (
        "items", 
        items.asJson
      )
    )
  }
}

如果我们实例化一个“编码”class 并调用 getJson,它将返回所需的 JSON。它之所以有效,是因为使用 circe,编码列表所需要做的就是为列表中的任何内容提供编码器。因此,如果我们为 Field 提供编码器,当我们对其调用 asJson 时,它将在列表中对其进行编码。

如果我们运行这样:

val items = new Encoding(List(Field("jf", "fj"), Field("jfl", "fjl")))

println(items.getJson)

我们得到:

{
  "items" : [
    {
      "field1" : "jf",
      "field2" : "fj"
    },
    {
      "field1" : "jfl",
      "field2" : "fjl"
    }
  ]
}