Как построить 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 (долго), 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}"

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


person Community    schedule 07.10.2013    source источник
comment
Когда вы говорите, что ключ и значение должны совпадать имя, вы хотите 12:12 или userId:12?   -  person dmahapatro    schedule 07.10.2013
comment
Я хочу, чтобы это было userId: 12.   -  person    schedule 07.10.2013
comment
В этом случае следуйте первому подходу из моего ответа.   -  person dmahapatro    schedule 07.10.2013


Ответы (2)


  • Объявите аксессоры для переменной userId, если вам нужно, чтобы JSON выглядел как {userId:12}

as

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

as

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]"}
person dmahapatro    schedule 07.10.2013
comment
Написание методов доступа, скажем, для 10 переменных каждая из 100 методов не очень практично. Но я понимаю, что это разрешает ситуацию, как и другое имя для ключа. Вы знаете, зачем нам аксессуар? Почему Groovy так себя ведет? Другие языки, такие как JavaScript, работают так, как задумано. Разве это не ошибка? - person ; 07.10.2013
comment
Не думаю, что это ошибка. Вместо этого используйте представление карты. Смотрите мое обновление. @kadaj - person dmahapatro; 07.10.2013
comment
Да, я нашел решение самостоятельно. Но спасибо за ваши усилия. Я приму это как правильный ответ. - person ; 07.10.2013

Я смог получить желаемый результат, используя другой параметр метода 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}
person Community    schedule 07.10.2013