gpt4 book ai didi

Kotlin DSL 用于创建 json 对象(不创建垃圾)

转载 作者:IT老高 更新时间:2023-10-28 13:30:36 27 4
gpt4 key购买 nike

我正在尝试创建用于创建 JSONObjects 的 DSL。这是一个构建器类和一个示例用法:

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","email":"xxx@yyy.com"},"name":"ilkin","age":37,"male":true}

在单个 JsonObjectBuilder 上跨多个线程调用 jsonbuild 会有问题,但这对您的用例来说应该不是问题.

关于Kotlin DSL 用于创建 json 对象(不创建垃圾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41861449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com