2013-06-27 98 views
3

我想用Groovy的JsonBuilder來動態生成JSON。我想創建像JSON塊:Groovy JSONBuilder問題

{ 
    "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)'。

我的語法有什麼問題嗎?或者有人可以指點我使用超出簡單值的方法和/或示例的示例/教程(例如,數組中的嵌套值)。

注意:這是一個淡化的例子,但我試圖保持圍繞給我的問題領域的複雜性。

回答

2
  1. 你有addUrn方法,而不是 使用delegate傳遞您正在使用的builder

  2. 這是因爲你正在做的toSting()toPrettyString()root而不是builder

  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" 
    } 
} 
+0

是啊,在'delegate'奏效了。但是,當我做builder.toString()我得到一個stackOverflowError(ReflectiveOperationException)。 – Devin

+0

@Devin你在用什麼腳本?你從我的示例代碼中得到例外嗎? – dmahapatro

+0

@Devin看看[這個問題](http://stackoverflow.com/questions/5538423/grails-jsonbuilder)如果你在談論嵌套對象。 – dmahapatro