如何使用JsonBuilder构造json,其键具有变量名称和值具有其值?

时间:2013-10-07 13:00:09

标签: json groovy jsonbuilder

如何使用具有相同名称的键和值的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}"

这是预期的结果。

3 个答案:

答案 0 :(得分:21)

  • 如果您需要JSON看起来像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()
  • 如果您需要JSON看起来像{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()
  • 只是为了groovy脚本,您可以从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)