2012-07-13 40 views
1

我试图将数据发送到从需要具有多层次的AJAX功能我的控制器,所以是这样的:解析Mulitlevel JavaScript对象Grails的2.1

{ 
    "lob": { 
    "TESTING": [ 
     { 
     "name": "color", 
     "value": "1" 
     }, 
     { 
     "name": "time", 
     "value": "2" 
     }, 
     { 
     "name": "jeremy", 
     "value": "3" 
     }, 
     { 
     "name": "fourtytwo", 
     "value": "4" 
     }, 
     { 
     "name": "owl", 
     "value": "5" 
     }, 
     { 
     "name": "why", 
     "value": "6" 
     }, 
     { 
     "name": "derp", 
     "value": "7" 
     }, 
     { 
     "name": "where", 
     "value": "8" 
     } 
    ] 
    } 
} 

但是当它发送到Grails的我得到这个当我打印出来的PARAMS

[lob[TESTING][4][value]:5, 
lob[TESTING][3][name]:fourtytwo, 
lob[TESTING][6][name]:derp, 
lob[TESTING][5][name]:why, 
lob[TESTING][3][value]:4, 
lob[TESTING][1][value]:2, 
lob[TESTING][2][value]:3, 
lob[TESTING][5][value]:6, 
lob[TESTING][1][name]:time, 
lob[TESTING][0][value]:1, 
lob[TESTING][6][value]:7, 
lob[TESTING][0][name]:color, 
lob[TESTING][7][value]:8, 
lob[TESTING][4][name]:owl, 
lob[TESTING][7][name]:where, 
lob[TESTING][2][name]:jeremy, 
action:save, 
controller:LOB] 

的数据,我从JavaScript发送:

{ 
    lob: { 
     TESTING: $form.serializeArray() 
    } 
} 

我一直在阅读多个论坛,说使用JSON.parse或request.JSON,但这些解决方案似乎并没有解决我的问题。我希望能够获得像

params.lob.testing.each{ a-> 
    println a 
} 

数据我会做很多不止这一点,但它会很高兴能够访问该地的数据。我正在使用Grails 2.1和Jquery 1.7.2

回答

4

实际上,Grails使它变得非常简单。我已经采取了你的测试数据,并运行它通过如下:

import grails.converters.JSON 

class LobController { 

    def save = { 
     def json = request.JSON 
     json.lob.TESTING.each {item-> 
     println "Name: ${item.name} - Value: ${item.value}" 
     } 
     //render something back if you need to here 
    } 
} 

,并将其输出:

Name color - Value: 1 
Name time - Value: 2 
Name jeremy - Value: 3 
Name fourtytwo - Value: 4 
Name owl - Value: 5 
Name why - Value: 6 
Name derp - Value: 7 
Name where - Value: 8 

我创建了一个urlMapping中的条目是这样的(你可能已经有此):

"/myApi"(controller: "lob", parseRequest: true) { 
      action = [POST: "save"] 
} 

parseRequest: true会自动解析传入的JSON。

我发现了一个`serializeJSON'函数,它可能会替换serializeArray()来为JSON格式化。 )

(function($){ 
$.fn.serializeJSON=function() { 
var json = {}; 
jQuery.map($(this).serializeArray(), function(n, i){ 
json[n['name']] = n['value']; 
}); 
return json; 
}; 
})(jQuery); 

为$( '形式')只需使用serializeJSON(;:以下是由罗Oosterkamp的jQuery serializeArray页面上提供。

该功能的所有功劳归于Arjen Oosterkamp ...

+0

我试过这个,但我只是得到一个空的地图。例如'''request.JSON'''总是回来作为'''[:]''' – Howes 2012-07-16 15:57:02

+0

为了扩大一点,我可以通过在发送数据之前使用数据的JSON.stringify()来使它工作来自客户端,但我正在寻找一种不需要包括Crockford的JSON2.js库的方式来支持IE。 – Howes 2012-07-16 18:28:34

+0

Howes - 刚刚更新了我的答案,以包含可能有所帮助的功能。我在答案中指出的页面上找到了该函数的原作者。 – Kelly 2012-07-16 21:40:56