2014-10-17 48 views
0

我有以下JSON(存储为在Groovy一个字符串):Grails能够不投JSON阵列HashMap类

{ 
    "isFizz": "true", 
    "buzzProperties": [ 
     { 
      "foo": "bar" 
     }, 
     { 
      "widget": 35 
     } 
    ], 
    "name": "dummy1" 
} 

以我的Grails控制器我有以下方法处理此JSON作为HTTP请求并试图读入JSON Groovy的瓦尔:

Stuff register() { 
    def jsonObject = request.JSON 
    Stuff stuff = new Stuff() 
    stuff.isFizz     = jsonObject.isFizz 
    stuff.buzzProperties   = jsonObject.buzzProperties    // stuff.buzzProperties is a HashMap 
    stuff.name      = jsonObject.name 

    stuff 
} 

当控制器方法执行(当它接收到一个请求),得到类似如下例外:

Cannot cast object '[{"foo":"bar"},{"widget":35}]' with class 'org.codehaus.groovy.grails.web.json.JSONArray' to class 'java.util.Map' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: java.util.Map(org.codehaus.groovy.grails.web.json.JSONObject, org.codehaus.groovy.grails.web.json.JSONObject). Stacktrace follows: 
    org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[{"foo":"bar"},{"widget":35}]' with class 'org.codehaus.groovy.grails.web.json.JSONArray' to class 'java.util.Map' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: java.util.Map(org.codehaus.groovy.grails.web.json.JSONObject, org.codehaus.groovy.grails.web.json.JSONObject) 

我检查了JSON对JSON lint,它是完全有效的JSON。这里发生了什么?

回答

3

心灵的事实,buzzProperties不是Map这是一个List{} VS [])。这就是铸造无法继续进行的原因。将buzzProperties类型更改为List或发送有效的Map

编辑

您发送的JSON字符串应以下列方式进行定义:

{ 
    "isFizz": "true", 
    "buzzProperties": { 
     "foo": "bar", 
     "widget": 35 
    }, 
    "name": "dummy1" 
} 
+0

感谢@Opal(+1) - 我不能(容易)改变Grails的控制器,但可以轻松更改JSON。为了成为一个有效的地图,buzzProperties对象需要在JSON中看起来像什么? – smeeb 2014-10-17 17:23:31

+0

如果你想坚持地图列表,你也可以用这个'jsonObject.buzzProperties.sum()' – cfrick 2014-10-17 17:32:14

+1

@cfrick坏主意,如果你有列表中的项目具有相同的键平坦化。它首先应该是一个json对象。 – dmahapatro 2014-10-17 17:36:04