我正在使用jQuery创建和发送JSON对象,但无法弄清楚如何使用org.json.simple库在Ajax Servlet中正确解析它。
我的jQuery代码如下:
var JSONRooms = {"rooms":[]}; $('div#rooms span.group-item').each(function(index) { var $substr = $(this).text().split('('); var $name = $substr[0]; var $capacity = $substr[1].split(')')[0]; JSONRooms.rooms.push({"name":$name,"capacity":$capacity}); }); $.ajax({ type: "POST", url: "ParseSecondWizardAsync", data: JSONRooms, success: function() { alert("entered success function"); window.location = "ctt-wizard-3.jsp"; } });
在servlet中,当我使用request.getParameterNames()并将其打印出到控制台时,我将得到参数名称rooms[0][key]等,但是我无法以任何方式解析JSON Array房间。我尝试解析由request.getParameter("rooms")或.getParameterValues("rooms")变体返回的对象,但是它们都返回null值。
rooms[0][key]
request.getParameter("rooms")
.getParameterValues("rooms")
我在jQuery中格式化JSON数据的方式有问题吗,还是有一种解析我所缺少的servlet中的JSON的方式?
要求更多代码,即使servlet仍然很空,因为我无法弄清楚如何解析数据。
的data参数$.ajax()采用代表请求参数映射的JS对象。因此,您提要给它的任何JS对象都将转换为请求参数。由于将JS对象传递给普通对象,因此将其视为请求参数映射。您需要通过确切地使用它们的请求参数名称表示形式来访问各个参数。
data
$.ajax()
String name1 = request.getParameter("rooms[0][name]"); String capacity1 = request.getParameter("rooms[0][capacity]"); String name2 = request.getParameter("rooms[1][name]"); String capacity2 = request.getParameter("rooms[1][capacity]"); // ...
您可以通过HttpServletRequest#getParameterMap()方法找到它们:
HttpServletRequest#getParameterMap()
Map<String, String[]> params = request.getParameterMap(); // ...
您甚至可以如下动态收集所有参数:
for (int i = 0; i < Integer.MAX_VALUE; i++) { String name = request.getParameter("rooms[" + i + "][name]"); if (name == null) break; String capacity = request.getParameter("rooms[" + i + "][capacity]"); // ... }
如果您打算将其作为真实的JSON对象传递,以便可以使用JSON解析器将其进一步分解为属性,则必须String在使用JS / jQuery发送之前将其转换为,并指定data参数,如下所示:
String
data: { "rooms": roomsAsString }
这样,它就可以作为JSON字符串使用request.getParameter("rooms"),您可以通过该字符串进而使用任意JSON API进行解析。
与 具体问题 无关 ,请勿$在jQuery中为非jQuery对象使用变量前缀。这使您的代码对JS / jQuery专家更加混乱。仅将其用于真正的jQuery对象,而不能用于普通的香草字符串或基元。
$
var $foo = "foo"; // Don't do that. Use var foo instead. var $foo = $("someselector"); // Okay.