2014-10-17 2 views
0

У меня есть следующие JS (хранятся в виде строки в 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 ({} против []). Вот почему кастинг не может продолжаться. Либо измените тип buzzProperties на List или пошлите действительный Map.

EDIT

строка JSON вы отправляете должны быть определены следующим образом:

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

Благодаря @Opal (+1) - я не могу (легко) изменить контроллер Grails, но может легко изменить JSON. Что бы объект 'buzzProperties' должен был выглядеть в JSON, чтобы быть действительной картой? – smeeb

+0

Если вы хотите придерживаться списка карт, вы также можете сгладить это с помощью этого 'jsonObject.buzzProperties.sum()' – cfrick

+1

@cfrick bad idea, если у вас есть элементы в списке с одинаковыми ключами. В первую очередь это должен быть json-объект. – dmahapatro

Смежные вопросы