我正在尝试创建一个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上跨多个线程构建将是有问题的,但这不应该是您的用例的问题.
原文地址:https://www.jb51.cc/js/154293.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。