Как использовать jsonbuilder для создания json, у которого есть ключ, названный как метод DefaultGroovyMethods (идентичность)? - PullRequest
2 голосов
/ 10 апреля 2020
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"}}}}}

По существу, ключ "идентичности" игнорируется. Я видел, что есть метод с именем «identity», принадлежащий DefaultGroovyMethods, но я не знаю, как это преодолеть. Первый раз пишу Groovy, немного фона Python. Любая помощь приветствуется!

Полное решение, выполненное с ответом Шимона Степняка (и другими исправлениями 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"}}}}}'

На всякий случай, если кто-то захочет следовать этому примеру.

1 Ответ

1 голос
/ 10 апреля 2020

Чтобы преодолеть это ограничение (закрытие, переданное методу JsonBuilder.call(), разрешает метод identity в цепочке делегирования), вам необходимо либо представить свой документ JSON в виде карты, либо, по крайней мере, использовать карту до identity ключом, и из этого места вы можете использовать замыкание.

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, который вы пропустили пример закрытия.

...