Как прочитать сложный объект JSON из jQuery в сервлете request.getParameter

Я создаю и отправляю объект JSON с помощью jQuery, но не могу понять, как правильно его анализировать в моем сервлете Ajax с использованием библиотеки org.json.simple.

Мой код 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";
           }
       });

В сервлете, когда я использую request.getParameterNames() и распечатываю его на своей консоли, я получаю имена параметров rooms[0][key] и так далее, но я никак не могу проанализировать комнаты массива JSON. Я попытался проанализировать объект, возвращаемый request.getParameter("rooms") или вариантом .getParameterValues("rooms"), но оба они возвращают нулевое значение.

Что-то не так с тем, как я форматирую данные JSON в jQuery, или есть способ проанализировать JSON в сервлете, который мне не хватает?

Попросите больше кода, хотя сервлет все еще почти пуст, так как я не могу понять, как анализировать данные.


person Spyros Mandekis    schedule 02.07.2012    source источник


Ответы (1)


Аргумент 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();
// ...

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

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 следующим образом. :

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.
person BalusC    schedule 02.07.2012