同じ名前のキーと値を持つ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文字列を作成できれば、より一貫性が高くなります。必要なすべての変数のアクセサーメソッドを作成することも、エレガントな方法ではありません。私が現在やったことは、userId
にuser_id
のような別の命名規則を使用することですが、繰り返しますが、これは私が従う他の規則と一致していません。だから私はエレガントなアプローチとJsonBuilder
がこのように振る舞う理由を探しています。
JavaScriptの場合、
var a = 1
JSON.stringify({a: a}) // gives "{"a":1}"
これは期待される結果です。
{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()
{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
から削除して、最初の動作を取得できます。 :)なので
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]"}
import groovy.json.JsonBuilder
def userId = "12" // some user id obtained from else where.
def json = new JsonBuilder([userId: userId])
print json.toString()
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}