web-dev-qa-db-ja.com

変数の名前を持つキーとその値を持つ値を持つ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)、および(Java.lang.Number)

キーを引用しても効果はありません。これを機能させる方法のアイデア。

編集:

JSONを{ userId: 12 }のようにしたい。また、キーを文字列として書き込むことが機能しないのはなぜですか?

long userId = 12   
def json = new JsonBuilder()
def root = json {
    "userId" userId
}

提供されている例は単なるスニペットです。状況は、さまざまな変数を持つコントローラーアクションがたくさんあることです。次に、変数が保持するさまざまな値を持つJSON文字列を作成しようとしている部分を追加します。したがって、既存の変数名を変更することはあまり実用的ではなく、同じ名前のJSON文字列を作成できれば、より一貫性が高くなります。必要なすべての変数のアクセサーメソッドを作成することも、エレガントな方法ではありません。私が現在やったことは、userIduser_idのような別の命名規則を使用することですが、繰り返しますが、これは私が従う他の規則と一致していません。だから私はエレガントなアプローチとJsonBuilderがこのように振る舞う理由を探しています。

JavaScriptの場合、

var a = 1
JSON.stringify({a: a})    // gives "{"a":1}"

これは期待される結果です。

12
user235273
  • JSONを{userId:12}のようにする必要がある場合は、変数userIdのアクセサーを宣言します。

なので

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スクリプトのために、defuserIdから削除して、最初の動作を取得できます。 :)

なので

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

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}
1
user235273