2012-02-01 2 views
0

У меня возникли проблемы с отправкой сообщения JQuery на мой сервер. Я сузил проблему вплоть до поля данных не правильно установлен в моей JavaScript, что приводит к исключению:JQuery ajax/post-setting JSON в поле данных вызывает JsonMappingException

org.codehaus.jackson.map.JsonMappingException: Невозможно десериализации экземпляра com.myserver. rest.messages.dto.NewMessageDTO из START_ARRAY лексем

код, который работает , но не очень чистый:

 $.ajax({ 
       type: "POST", 
       url: "../resources/messages/", 
       data: '{"subject": "' + subject + 
        '", "message": "' + message + 
        '", "messageType": "' + type + 
        '", "employeeIDs": [' + employeeIDs + 
        '], "assignmentIDs": [' + assignmentIDs +']}', 
       contentType: "application/json", 
       success: successHandler, 
       error: defaultErrorHandler 
      }); 

Который оказывает:

{ "субъект": "тест", "сообщение": "тест", "MessageType": "MESSAGE", "employeeIDs": [461,485], "assignmentIDs": [103 ]}

код, который не работает, но чище:

  $.ajax({ 
       type: "POST", 
       url: "../resources/messages/", 
       data: {'subject': subject, 'message': message, 'messageType': type, 'employeeIDs[]': employeeIDs, 'assignmentIDs[]': assignmentIDs}, 
       contentType: "application/json", 
       success: successHandler, 
       error: defaultErrorHandler 
      }); 

который делает, как применение/х-WWW-форм-urlencoded по какой-то причине:

Заголовок = тест & сообщение = тест & MessageType = MESSAGE & employeeIDs% 5B% 5D = 461 & employeeIDs% 5B% 5D = 485 & assignmentIDs% 5B% 5D = 103

Любые идеи, что я делаю Неправильно здесь? Заранее благодарим за любую помощь

ответ

4

contentType: "application/json" означает, что вы ожидаете JSON в результате вызова. Все данные: converted to a query string перед отправкой.

Менее чистый код отправляет данные в виде строки JSON, что, по-видимому, ожидается ../resources/messages/.

Чтобы сделать это более чистым и сохранить данные в виде JSON строки:

$.ajax({ 
    'type': 'POST', 
    'url': '../resources/messages/', 
    'data': '{' + 
     "'subject':" + subject + ',' 
     "'message':" message + ',' 
     "'messageType':" type + ',' 
     "'employeeIDs':[" employeeIDs + '],' 
     "'assignmentIDs':[" assignmentIDs + ']' + 
    '}', 
    'contentType': "application/json", 
    'success': successHandler, 
    'error': defaultErrorHandler 
}); 

или

var data = { 
    'subject': subject, 
    'message': message, 
    'messageType': type, 
    'employeeIDs': employeeIDs[] 
    'assignmentIDs': assignmentIDs[] 
}; 
$.ajax({ 
    'type': 'POST', 
    'url': '../resources/messages/', 
    'data': JSON.stringify(data), //assuming you have the JSON library linked. 
    'contentType': "application/json", 
    'success': successHandler, 
    'error': defaultErrorHandler 
}); 

Надеется, что это помогает,

Пита

+0

вот-вот должен был ответить почти с тем же самым решением. Это намного чище. –

+0

Пит - Использование JSON.stringify сработало! Это гораздо более чистый подход, чем создание строки JSON. Спасибо за помощь –

+0

Мне пришлось удалить [] идентификаторы employeeID и идентификаторы присвоения в data var. IntelliJ давал мне «ожидаемое выражение». –

1

Попробуйте это, оно должно работать отлично и намного чище.

 $.ajax({ 
      type: "POST", 
      url: "../resources/messages/", 
      data: { 
       subject: subject, 
       message: message, 
       messageType: type, 
       employeeIDs: employeeIDs, 
       assignmentIDs: assignmentIDs 
      }, 
      contentType: "application/json", 
      success: successHandler, 
      error: defaultErrorHandler 
     }); 

вопрос в первой части кода, ваш посылают целые данные в виде одной строки, в которой она должна быть пара ключ/значение для каждого атрибута данных. Во второй части вы неправильно создаете имена ключей для полей массива. Вам не нужно включать [] для полей массива.

+0

Нет, это не Работа. employeeIDs и идентификаторы присвоения являются массивами, поэтому не уверены, как обрабатывать преобразование в json –

+0

, почему downvote ??? – ShankarSangoli

+0

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

0

Массивы немного дурацкий, попробуйте следующее:

{'subject': subject, 'message': message, 'messageType': type, 'employeeIDs': employeeIDs, 'assignmentIDs': assignmentIDs} 

Это предполагает, что employeeIDs и assignmentIDs массивы.

Вот демо: http://jsfiddle.net/jb6MA/

+0

Я тоже этого не делал. Он по-прежнему преобразует json в application/x-www-form-urlencoded. –

+0

Затем вы можете декодировать его в своем серверном коде в объект. Я использую PHP, а в PHP есть функция 'json_decode()', которая берет строку и возвращает объект. – Jasper

+0

Объяснение для голосования будет оценено по достоинству. Причина проголосовавшего - это, скорее всего, то, о чем я хочу знать. Благодарю. – Jasper

0

В вашем рабочем примере у вас есть переменные, называемые employeeIDs и assignmentIDs, но в вашем неработающего кода, вы приложили [] к концу каждого.

0

В схеме JSON строки действительны только в том случае, если они заключены в двойные кавычки: http://www.json.org/. Много реализаций не являются строгими, но похоже, что реализация вашего сервера.

Смежные вопросы