这是在circe 中执行此操作的一种方法:
import io.circe.syntax._
val json = Map(
"Field1" -> List.fill(4)(()).asJson,
"Field2" -> List.fill(3)(()).asJson,
"Field3" -> ().asJson
).asJson
然后:
scala> json.noSpaces
res0: String = {"Field1":[{},{},{},{}],"Field2":[{},{},{}],"Field3":{}}
这里有几点需要注意。首先是 Scala 鼓励使用不可变集合,因此您可以使用 List.fill(n)(value) 之类的实用程序,而不是“将值放入”列表,它会创建一个重复 n 次的 value 列表。这意味着List.fill(3)(()) 与List((), (), ()) 完全相同,我们也可以在上面使用。
第二点更具体。 () 是 Scala 中的一个特殊值——它是 Unit 类型的唯一值,它只代表一个不携带任何信息的空事物。 ()的JSON编码是{},所以我们可以通过调用().asJson来创建一个空的JSON对象。
circe 还知道如何从它知道如何编码的任何类型的 Scala 列表(或其他序列)中创建 JSON 数组,因此 List.fill(3)(()).asJson 是一个 JSON 值,它是由三个空 JSON 对象组成的 JSON 数组。
最后,circe 还知道如何从 Scala Map 创建 JSON 对象,其中键是字符串,值类型是它知道如何编码的东西。这意味着我们可以创建一个Map[String, io.circe.Json] 类型的映射并在其上调用asJson 以获取一个JSON 值,它是一个包含映射所表示的字段的JSON 对象。
根据您的具体用例,您还可以通过其他方式来执行此操作,这些方式可能会更好,包括:
case class Fields(Field1: List[Unit], Field2: List[Unit], Field3: Unit)
然后:
scala> import io.circe.generic.auto._
import io.circe.generic.auto._
scala> Fields(List((), (), (), ()), List((), (), ()), ()).asJson.noSpaces
res0: String = {"Field1":[{},{},{},{}],"Field2":[{},{},{}],"Field3":{}}
这种方法(使用 circe 对 generic codec derivation 的支持)通常比直接使用 JSON 值更惯用。