Как построить 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}