2014-10-17 57 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