在 groovy 中使用 arrayJson 构建 json 生成器
Build json builder with arrayJson in groovy
我是 groovy 的新手,我想用构建器构建一个 json 对象
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{ "match": { "content": "scontent" } },
{ "match": { "title":"stitle" } }
]
}
},
{
"bool": {
"should": [
{ "match": { "a1": "v1" } },
{ "match": { "a2":"v2" } },
... and so on ...
{ "match": { "an":"vn" } }
]
}
}
]
}
},
"highlight": {
"fields": {
"content":{}
}
}
}
我在 Whosebug 上搜索了很多其他帖子,然后编写了这段代码
所以我这样做了,但没办法得到我想要的东西:
JsonBuilder builder = new JsonBuilder()
def body = builder {
from Lib.or(qQuery.start, 0)
size Lib.or(qQuery.num, 10)
query {
bool {
must [
{
bool {
should [
{ match { content 'scontent' } },
{ match { title 'stitle' } }
]
}
},
{
bool {
should myVals.collect {[
'match' : { it.key it.value }
]}
}
}
]
}
}
highlight {
fields {
content {}
}
}
}
感谢您的帮助!
我认为您可以按原样使用 JsonBuilder 来完成这项工作,但是在 groovy 中使用映射和列表(这是构建器输出的内容)创建数据结构通常更容易,因为您有更多控制在那里。
示例代码:
import groovy.json.*
def data = [
query: [
bool: [
must: [
[bool:
[should: [
[match: [ content: 'scontent']],
[match: [ title: 'stitle']]
]]
],
[bool:
[should: [
[match: [ a1: 'v1']],
[match: [ a2: 'v2']],
[match: [ vn: 'vn']]
]]
]
]
]
]
]
println JsonOutput.prettyPrint(JsonOutput.toJson(data))
产生:
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"match": {
"content": "scontent"
}
},
{
"match": {
"title": "stitle"
}
}
]
}
},
{
"bool": {
"should": [
{
"match": {
"a1": "v1"
}
},
{
"match": {
"a2": "v2"
}
},
{
"match": {
"vn": "vn"
}
}
]
}
}
]
}
}
}
我没有包括你的完整 json,因为它占用了一些 space,但结构在那里。请注意数据结构中列表 ([valueA, valueB]
) 与映射 ([someKey: someValue]
) 的使用。
诚然,这使得 JsonBuilder 不到 100% 有用,但我还没有看到任何简洁的方法来将大型 json 对象的列表包含在结构中的列表中。你可以这样做:
def json = JsonBuilder()
json.query {
bool('list', 'of', 'values')
}
但对于更大的结构作为列表元素,我会说使用列表和映射方法。
我是 groovy 的新手,我想用构建器构建一个 json 对象
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{ "match": { "content": "scontent" } },
{ "match": { "title":"stitle" } }
]
}
},
{
"bool": {
"should": [
{ "match": { "a1": "v1" } },
{ "match": { "a2":"v2" } },
... and so on ...
{ "match": { "an":"vn" } }
]
}
}
]
}
},
"highlight": {
"fields": {
"content":{}
}
}
}
我在 Whosebug 上搜索了很多其他帖子,然后编写了这段代码 所以我这样做了,但没办法得到我想要的东西:
JsonBuilder builder = new JsonBuilder()
def body = builder {
from Lib.or(qQuery.start, 0)
size Lib.or(qQuery.num, 10)
query {
bool {
must [
{
bool {
should [
{ match { content 'scontent' } },
{ match { title 'stitle' } }
]
}
},
{
bool {
should myVals.collect {[
'match' : { it.key it.value }
]}
}
}
]
}
}
highlight {
fields {
content {}
}
}
}
感谢您的帮助!
我认为您可以按原样使用 JsonBuilder 来完成这项工作,但是在 groovy 中使用映射和列表(这是构建器输出的内容)创建数据结构通常更容易,因为您有更多控制在那里。
示例代码:
import groovy.json.*
def data = [
query: [
bool: [
must: [
[bool:
[should: [
[match: [ content: 'scontent']],
[match: [ title: 'stitle']]
]]
],
[bool:
[should: [
[match: [ a1: 'v1']],
[match: [ a2: 'v2']],
[match: [ vn: 'vn']]
]]
]
]
]
]
]
println JsonOutput.prettyPrint(JsonOutput.toJson(data))
产生:
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"match": {
"content": "scontent"
}
},
{
"match": {
"title": "stitle"
}
}
]
}
},
{
"bool": {
"should": [
{
"match": {
"a1": "v1"
}
},
{
"match": {
"a2": "v2"
}
},
{
"match": {
"vn": "vn"
}
}
]
}
}
]
}
}
}
我没有包括你的完整 json,因为它占用了一些 space,但结构在那里。请注意数据结构中列表 ([valueA, valueB]
) 与映射 ([someKey: someValue]
) 的使用。
诚然,这使得 JsonBuilder 不到 100% 有用,但我还没有看到任何简洁的方法来将大型 json 对象的列表包含在结构中的列表中。你可以这样做:
def json = JsonBuilder()
json.query {
bool('list', 'of', 'values')
}
但对于更大的结构作为列表元素,我会说使用列表和映射方法。