我正在尝试创建一个DSL来创建
JSONObjects.这是一个构建器类和示例用法:
import org.json.JSONObject fun json(build: JsonObjectBuilder.() -> Unit): JSONObject { val builder = JsonObjectBuilder() builder.build() return builder.json } class JsonObjectBuilder { val json = JSONObject() infix fun <T> String.To(value: T) { json.put(this,value) } } fun main(args: Array<String>) { val jsonObject = json { "name" To "ilkin" "age" To 37 "male" To true "contact" To json { "city" To "istanbul" "email" To "xxx@yyy.com" } } println(jsonObject) }
{"contact":{"city":"istanbul","email":"xxx@yyy.com"},"name":"ilkin","age":37,"male":true}
它按预期工作.但是它每次创建一个json对象时都会创建一个附加的JsonObjectBuilder实例.可以编写一个DSL来创建json对象,而不需要额外的垃圾?
解决方法
您可以使用
Deque作为堆栈,以使用单个JsonObjectBuilder来跟踪当前的JSONObject上下文:
fun json(build: JsonObjectBuilder.() -> Unit): JSONObject { return JsonObjectBuilder().json(build) } class JsonObjectBuilder { private val deque: Deque<JSONObject> = ArrayDeque() fun json(build: JsonObjectBuilder.() -> Unit): JSONObject { deque.push(JSONObject()) this.build() return deque.pop() } infix fun <T> String.To(value: T) { deque.peek().put(this,value) } } fun main(args: Array<String>) { val jsonObject = json { "name" To "ilkin" "age" To 37 "male" To true "contact" To json { "city" To "istanbul" "email" To "xxx@yyy.com" } } println(jsonObject) }
示例输出:
{"contact":{"city":"istanbul","male":true}
调用json并在单个JsonObjectBuilder上跨多个线程构建将是有问题的,但这不应该是您的用例的问题.