如何使用具有相同名称的键和值的JsonBuilder构造json?
import groovy.json.JsonBuilder
def userId = 12 // some user id obtained from else where.
def json = new JsonBuilder()
def root = json {
userId userId
}
print json.toString()
产生错误
groovy.lang.MissingMethodException:没有方法签名: java.lang.Integer.call()适用于参数类型: (java.lang.Integer)values:[12]可能的解决方案:wait(),any(), abs(),wait(long),wait(long,int)和(java.lang.Number)
引用密钥确实没有效果。知道如何使这项工作。
编辑:
我希望JSON与{ userId: 12 }
类似。另外,为什么将字符串写为字符串不起作用?
long userId = 12
def json = new JsonBuilder()
def root = json {
"userId" userId
}
提供的示例只是一个片段。情况是我有很多控制器动作,它已经有各种变量。现在我添加一个部分,我试图创建一个JSON字符串,其中包含变量所具有的各种值。因此,更改现有变量名称并不是很实际,如果我可以构造具有相同名称的JSON字符串,那么它将更加一致。为我想要的所有变量编写访问器方法也不是一种优雅的方法。我目前所做的是为user_id
使用不同的命名方案,如userId
,但同样,它与我遵循的其他约定不一致。所以我正在寻找一种优雅的方法以及JsonBuilder
以这种方式表现的原因。
如果是JavaScript,
var a = 1
JSON.stringify({a: a}) // gives "{"a":1}"
这是预期的结果。
答案 0 :(得分:21)
userId
{userId:12}
声明访问器
作为
import groovy.json.JsonBuilder
def getUserId(){
def userId = 12 // some user id obtained from else where.
}
def json = new JsonBuilder()
def root = json{
userId userId
}
print json.toString()
{12:12}
这是最简单的情况:然后
import groovy.json.JsonBuilder
def userId = 12 // some user id obtained from else where.
def json = new JsonBuilder()
def root = json{
"$userId" userId
}
print json.toString()
def
中删除userId
以获取第一个行为。 :)作为
import groovy.json.JsonBuilder
userId = 12
def json = new JsonBuilder()
def root = json{
userId userId
}
print json.toString()
更新
在构建JSON时,局部变量也可以用作映射键(默认情况下为String)。
import groovy.json.JsonBuilder
def userId = 12
def age = 20 //For example
def email = "abc@xyz.com"
def json = new JsonBuilder()
def root = json userId: userId, age: age, email: email
print json.toString() //{"userId":12,"age":20,"email":"abc@xyz.com"}
答案 1 :(得分:3)
import groovy.json.JsonBuilder
def userId = "12" // some user id obtained from else where.
def json = new JsonBuilder([userId: userId])
print json.toString()
答案 2 :(得分:1)
我能够使用JsonBuilder
的{{1}}方法使用不同的参数获得所需的输出。即,不是通过封闭,而是通过地图。
使用call()
代替def call(Map m)
。
def call(Closure c)