在 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')
}

但对于更大的结构作为列表元素,我会说使用列表和映射方法。