在groovy中使用arrayJson构建json构建器

时间:2017-02-10 10:35:44

标签: arrays json groovy builder

我是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":{}
        }
    }
}

我在stackoverflow上搜索了很多关于其他帖子的内容,我编写了这段代码 所以我做了这个,但没办法得到我想要的东西:

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 {}
        }
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我认为您可以按原样使用JsonBuilder,但通常使用地图和列表(这是构建器输出的内容)创建数据结构更容易,因为您可以更好地控制它。

示例代码:

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,因为它占用了一些空间,但结构就在那里。请注意在数据结构中使用列表([valueA, valueB])vs maps([someKey: someValue])。

当然,这使得JsonBuilder的使用率低于100%,但我还没有看到任何简洁的方法在结构中的列表中包含大型json对象的列表。你可以这样做:

def json = JsonBuilder()

json.query { 
    bool('list', 'of', 'values')
}

但对于较大的结构作为列表元素,我会说采用列表和地图方法。