Here's one way to do this in circe:
import io.circe.syntax._
val json = Map(
"Field1" -> List.fill(4)(()).asJson,
"Field2" -> List.fill(3)(()).asJson,
"Field3" -> ().asJson
).asJson
And then:
scala> json.noSpaces
res0: String = {"Field1":[{},{},{},{}],"Field2":[{},{},{}],"Field3":{}}
There are a couple of things to note here. The first is that Scala encourages the use of immutable collections, so instead of "putting values into" a list, you use utilities like List.fill(n)(value), which creates a list of value repeated n times. This means List.fill(3)(()) is exactly the same as List((), (), ()), which we could also have used above.
The second point is more circe-specific. () is a special value in Scala—it's the only value of type Unit, which just represents an empty thing that carries no information. In circe the JSON encoding of () is {}, so we can create an empty JSON object by calling ().asJson.
circe also knows how to create a JSON array out of a Scala list (or other sequence) of any type that it knows how to encode, so List.fill(3)(()).asJson is a JSON value that's a JSON array of three empty JSON objects.
Lastly, circe also knows how to create a JSON object out of a Scala Map where the keys are strings and the value type is something it knows how to encode. This means we can create a map of type Map[String, io.circe.Json] and call asJson on it to get a JSON value that's a JSON object containing the fields represented by the map.
There are other ways you could do this in circe that might be nicer depending on your exact use case, including the following:
case class Fields(Field1: List[Unit], Field2: List[Unit], Field3: Unit)
And then:
scala> import io.circe.generic.auto._
import io.circe.generic.auto._
scala> Fields(List((), (), (), ()), List((), (), ()), ()).asJson.noSpaces
res0: String = {"Field1":[{},{},{},{}],"Field2":[{},{},{}],"Field3":{}}
This approach (which uses circe's support for generic codec derivation) is typically more idiomatic than working with JSON values directly.