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



如何使用 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( 值: [12] 可能的解决方案: wait((, any((, abs((, wait(long(, wait(long, int(, and(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}"

这是预期的结果。

  • 声明变量userId的访问器,如果您需要 JSON 看起来像{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()
  • 只是为了时髦的脚本,您可以从userId中删除def以获得第一个行为。 :)

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"}
import groovy.json.JsonBuilder
def userId = "12" // some user id obtained from else where.
def json = new JsonBuilder([userId: userId])
print json.toString()

我能够使用不同的参数来获得所需的输出,以JsonBuildercall()方法。 即,不是传入闭包,而是传入映射。

使用 def call(Map m) 而不是 def call(Closure c)

import groovy.json.JsonBuilder
long userId = 12
long z = 12
def json = new JsonBuilder()
json userId: userId,
     abc: 1,
     z: z     
println json.toString()    //{"userId":12,"abc":1,"z":12}

相关内容

  • 没有找到相关文章

最新更新