2
def builder = new groovy.json.JsonBuilder()
        def root = builder.auth {
            identity {
                    methods (['password'])
                    password {
                        user {
                            name {
                                usrName
                                domain {
                                    id usrDomain
                                }
                                password "openstack"
                            }
                        }
                    }
                    scope {
                        project {
                            name prjName
                            domain {
                                id 'default'
                            }
                        }
                    }
                }
            }
        assert builder.toString() == '{"auth":{"identity":{"methods":["password"],"password": {"user":{"name":"admin","domain":{"id":"default"},"password":"openstack"}}},"scope":{"project":{"name":"admin","domain":{"id":"default"}}}}}'

断言输出:

    Assertion failed: 

    assert builder.toString() == '{"auth":{"identity":{"methods":["password"],"password": {"user":{"name":"admin","domain":{"id":"default"},"password":"openstack"}}},"scope":{"project":{"name":"admin","domain":{"id":"default"}}}}}'
           |       |          |
           |       |          false
           |       '{"auth":{"methods":["password"],"password":{"user":{"name":{"domain":{"id":"Default"},"password":"openstack"}}},"scope":{"project":{"name":"admin","domain":{"id":"default"}}}}}'
           {"auth":{"methods":["password"],"password":{"user":{"name":{"domain":{"id":"Default"},"password":"openstack"}}},"scope":{"project":{"name":"admin","domain":{"id":"default"}}}}}

基本上“身份”键被忽略。我已经看到有一个属于 DefaultGroovyMethods 的名为“identity”的方法,但我不知道如何克服这个问题。第一次写 Groovy,有一点 Python 的背景。任何帮助都将不胜感激!

使用 Szymon Stepniak 的回答完成的完整解决方案(以及对 json 声明的其他更正):

def builder = new groovy.json.JsonBuilder()
    builder auth: [
            identity: {
                methods(['password'])
                password {
                    user {
                        name "$usrName"
                        domain {
                            id usrDomain
                        }
                        password "openstack"

                    }
                }
            },
            scope: {
                project {
                    name prjName
                    domain {
                        id 'default'
                        }
                    }
            }
                ]
    assert builder.toString() == '{"auth":{"identity":{"methods":["password"],"password":{"user":{"name":"admin","domain":{"id":"default"},"password":"openstack"}}},"scope":{"project":{"name":"admin","domain":{"id":"default"}}}}}'

以防万一有人想跟随这个例子。

4

1 回答 1

1

为了克服这个限制(传递给JsonBuilder.call()方法的闭包解析identity委托链中的方法),您需要将您的 JSON 文档表示为一个映射,或者至少使用一个映射到identitykey 并且从这个地方您可以使用一个闭包。

def builder = new groovy.json.JsonBuilder()

builder auth: [
    identity: {
        methods (['password'])
        password {
            user {
                name {
                    usrName
                    domain {
                        id usrDomain
                    }
                    password "openstack"
                }
            }
        }
        scope {
            project {
                name prjName
                domain {
                    id 'default'
                }
            }
        }
    }
]

另外,请记住,您定义的闭包不会生成预期的 JSON 字符串,但它会包含identity您在闭包示例中缺少的键。

于 2020-04-10T14:06:10.330 回答