[英]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.