3

Groovy で JsonBuilder を使用して JSON を動的に生成しようとしています。次のような JSON ブロックを作成します。

{
    "type": {
        "__type": "urn",
        "value": "myCustomValue1"
    },
    "urn": {
        "__type": "urn",
        "value": "myCustomValue2"
    },
    "date": {
        "epoch": 1265662800000,
        "str": "2010-02-08T21:00:00Z"
    },
    "metadata": [{
        "ratings": [{
            "rating": "NR",
            "scheme": "eirin",
            "_type": {
                "__type": "urn",
                "value": "myCustomValue3"
            }
        }],
        "creators": [Jim, Bob, Joe]
    }]
}

私は書いた:

def addUrn(parent, type, urnVal) {
    parent."$type" {
        __type "urn"
        "value" urnVal
    }
}

String getEpisode(String myCustomVal1, String myCustomVal2, String myCustomVal3) {
    def builder = new groovy.json.JsonBuilder()
    def root = builder {
        addUrn(builder, "type", myCustomVal1)
        addUrn(builder, "urn", "some:urn:$myCustomVal2")
        "date" {
            epoch 1265662800000
            str "2010-02-08T21:00:00Z"
        }
       "metadata" ({
                ratings ({
                        rating "G"
                        scheme "eirin"
                        addUrn(builder, "_type", "$myCustomVal3")
                })
                creators "Jim", "Bob", "Joe"                    
        })
    }

    return root.toString();
}

しかし、私は次の問題に遭遇しました:

  1. を呼び出すたびにaddUrn、文字列には何も返されません。 Groovy でメソッドを使用する方法を誤解していますか?
  2. 返される文字列では、二重引用符 (または一重引用符) でカプセル化された値はありません。
  3. を使用する{たびに、戻り値に「_getEpisode_closure2_closure2@(insert hex)」が返されます。

構文に何か問題がありますか? または、単純な値を超えたメソッドや例 (配列内のネストされた値など) を使用する例/チュートリアルを教えてください。

注: これは骨抜きにされた例ですが、問題を引き起こしている領域の複雑さを維持しようとしました。

4

1 に答える 1

2
  1. 作業中の を渡す代わりにdelegateinメソッドを使用する必要があります。 addUrnbuilder

  2. の代わりにtoSting()or toPrettyString()onを実行しているためです。rootbuilder

  3. #2に従えば解決します。

サンプル:

def builder = new groovy.json.JsonBuilder()
def root = builder {
              name "Devin"
              data {
                 type "Test"
                 note "Dummy"
              }
              addUrn(delegate, "gender", "male")
              addUrn(delegate, "zip", "43230")
           }


def addUrn(parent, type, urnVal) {
    parent."$type" {
        __type "urn"
        "value" urnVal
    }
}

println builder.toPrettyString()

出力:-

{
    "name": "Devin",
    "data": {
        "type": "Test",
        "note": "Dummy"
    },
    "gender": {
        "__type": "urn",
        "value": "male"
    },
    "zip": {
        "__type": "urn",
        "value": "43230"
    }
}
于 2013-06-27T20:05:32.510 に答える