Как построить json с помощью JsonBuilder с ключом, имеющим имя переменной и значение, имеющее его значение?

Как построить JSON с помощью JsonBuilder с ключом и значением с тем же именем?

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) и (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}"

что является ожидаемым результатом.

Ответ 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()
  • Только для groovy script вы можете удалить def из userId, чтобы получить первое поведение.:)

а

import groovy.json.JsonBuilder

userId = 12

def json = new JsonBuilder()
def root = json{
    userId userId
}
print json.toString()

ОБНОВЛЕНИЕ

Локальные переменные также могут использоваться в качестве ключей карты (по умолчанию это String) при построении JSON.

import groovy.json.JsonBuilder

def userId = 12 
def age = 20 //For example
def email = "[email protected]"

def json = new JsonBuilder()
def root = json userId: userId, age: age, email: email

print json.toString() //{"userId":12,"age":20,"email":"[email protected]"}

Ответ 2

import groovy.json.JsonBuilder
def userId = "12" // some user id obtained from else where.
def json = new JsonBuilder([userId: userId])
print json.toString()

Ответ 3

Мне удалось получить желаемый результат, используя другой параметр JsonBuilder call(). то есть вместо того, чтобы проходить в замыкание, переходите на карту.

Используйте 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}