2013-06-27 59 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