У меня есть следующие 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. Что тут происходит?
Благодаря @Opal (+1) - я не могу (легко) изменить контроллер Grails, но может легко изменить JSON. Что бы объект 'buzzProperties' должен был выглядеть в JSON, чтобы быть действительной картой? – smeeb
Если вы хотите придерживаться списка карт, вы также можете сгладить это с помощью этого 'jsonObject.buzzProperties.sum()' – cfrick
@cfrick bad idea, если у вас есть элементы в списке с одинаковыми ключами. В первую очередь это должен быть json-объект. – dmahapatro