gpt4 book ai didi

json - Groovy JsonBuilder 在 toString() 时的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 00:21:08 26 4
gpt4 key购买 nike

我需要创建一个 json 用作 http.request 中的正文。我能够动态构建 json,但在调用 builder.toString() 两次时我注意到一个奇怪的行为。生成的 json 完全不同。我可能认为这与某种缓冲区有关。我一直在阅读文档,但找不到好的答案。这是要测试的代码。

import groovy.json.JsonBuilder

def builder = new JsonBuilder()

def map = [
catA: ["catA-element1", "catA-element2"],
catB:[],
catC:["catC-element1"]
]

def a = map.inject([:]) { res, k, v ->
def b = v.inject([:]) {resp, i ->
resp[i] = k
resp
}
res += b
}
println a

def root = builder.query {
bool {
must a.collect{ k, v ->
builder.match {
"$v" k
}
}
}
should([
builder.simple_query_string {
query "text"
}
])
}
println builder.toString()
println builder.toString()

这将打印以下行。注意最后两行

[catA-element1:catA, catA-element2:catA, catC-element1:catC]
{"query":{"bool":{"must":[{"match":{"catA":"catA-element1"}},{"match":{"catA":"catA-element2"}},{"match":{"catC":"catC-element1"}}]},"should":[{"simple_query_string":{"query":"text"}}]}}
{"match":{"catC":"catC-element1"}}

在我的代码中,我可以轻松地将第一个 toString() 结果发送到变量并在需要时使用它。但是,为什么当调用多次时它会发生变化呢?

最佳答案

我认为发生这种情况是因为您在闭包 bool 内使用了 builder。如果我们在打印结果之前进行 print builder.content (buider.toString() 正在调用 JsonOutput.toJson(builder.content)),我们得到:

[query:[bool:ConsoleScript54$_run_closure3$_closure6@294b5a70, should:[[simple_query_string:[query:text]]]]]

println builder.content 添加到 bool 闭包中,我们可以看到 builder.content 在闭包求值时被修改:

def root = builder.query {
bool {
must a.collect{ k, v ->
builder.match {
"$v" k
println builder.content
}
}
}
should([
builder.simple_query_string {
query "text"
}
])
}

println JsonOutput.toJson(builder.content)
println builder.content

以上产量:

[query:[bool:ConsoleScript55$_run_closure3$_closure6@39b6156d, should:[[simple_query_string:[query:text]]]]]
[match:[catA:catA-element1]]
[match:[catA:catA-element2]]
{"query":{"bool":{"must":[{"match":{"catA":"catA-element1"}},{"match":{"catA":"catA-element2"}},{"match":{"catC":"catC-element1"}}]},"should":[{"simple_query_string":{"query":"text"}}]}}
[match:[catC:catC-element1]]

您可以使用不同的构建器来轻松避免这种情况:

def builder2 = new JsonBuilder()

def root = builder.query {
bool {
must a.collect{ k, v ->
builder2.match {
"$v" k
}
}
}
should([
builder.simple_query_string {
query "text"
}
])
}

或者更好:

def root = builder.query {
bool {
must a.collect({ k, v -> ["$v": k] }).collect({[match: it]})
}
should([
simple_query_string {
query "text"
}
])
}

关于json - Groovy JsonBuilder 在 toString() 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31396436/

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