1. ホーム
  2. json

[解決済み] JsonBuilderを使用して、keyに変数名、valueにその値を指定してjsonを構築するにはどうすればよいですか?

2022-03-08 04:33:04

質問

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

となり、期待通りの結果となりました。

どのように解決するのですか?

  • 変数に対するアクセサを宣言する userId のようなJSONが必要な場合、その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スクリプトのためだけに 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]"}