簡體   English   中英

如何使用 jsonbuilder 制作一個 json ,它的鍵名為 DefaultGroovyMethods 方法(身份)?

[英]How to use jsonbuilder to make a json which has a key named like a DefaultGroovyMethods method (identity)?

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"}}}}}'

斷言 output:

    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"}}}}}'

以防萬一有人想跟隨這個例子。

為了克服這個限制(傳遞給JsonBuilder.call()方法的閉包解析了委托鏈中的identity方法),您需要將您的 JSON 文檔表示為 map 或至少使用 Z1D78DC8ED51214E90AE4 來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密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM