2012-07-02 23 views
1

我正在用jQuery創建和發送JSON對象,但我無法弄清楚如何在使用org.json.simple庫的Ajax servlet中正確解析它。如何在Servlet請求中從jQuery中讀取複雜的JSON對象request.getParameter

我的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")變體返回的對象,但它們都返回空值。

我在jQuery中格式化JSON數據的方式有什麼問題嗎?或者有沒有辦法解析我缺少的servlet中的JSON?

要求更多的代碼,即使servlet仍然非常空,因爲我無法弄清楚如何解析數據。

回答

2

data參數$.ajax()需要一個表示請求參數映射的JS對象。所以你提供給它的任何JS對象都將被轉換爲請求參數。由於您將JS對象普通香草傳遞給它,因此將其視爲請求參數映射。您需要通過它們的請求參數名稱表示來訪問各個參數。

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()方法找到他們:

Map<String, String[]> params = request.getParameterMap(); 
// ... 

你甚至可以動態收集所有PARAMS如下:

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解析器將其進一步分解爲屬性,然後在使用JS/jQuery發送之前必須將其轉換爲String並指定data參數如下:

data: { "rooms": roomsAsString } 

這種方式是可以作爲一個JSON字符串由request.getParameter("rooms"),你可以反過來解析使用任意JSON API。


無關到具體問題,不要使用$變量前綴jQuery的非jQuery的對象。這會讓你的代碼更加迷惑JS/jQuery專家。只能用於真正的jQuery對象,而不能用於普通的vanilla字符串或基元。

var $foo = "foo"; // Don't do that. Use var foo instead. 
var $foo = $("someselector"); // Okay.