Jquery Ajax отправляет JSON в веб-сервис

#jquery #ajax #web-services #json

#jquery #ajax #веб-сервисы #json

Вопрос:

Я пытаюсь опубликовать объект JSON в asp.net веб-сервис.

Мой json выглядит следующим образом:

 var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};
  

Я использую json2.js чтобы преобразовать мой объект JSON в строку.

и я использую jquery для публикации его в моем веб-сервисе.

   $.ajax({
        type: "POST",
        url: "/webservices/PodcastService.asmx/CreateMarkers",
        data: markers,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){alert(data);},
        failure: function(errMsg) {
            alert(errMsg);
        }
  });
  

Я получаю следующую ошибку:

Недопустимый примитив JSON

Я нашел кучу сообщений, относящихся к этому, и это, похоже, действительно распространенная проблема, но ничто из того, что я пробую, не устраняет проблему.

Когда firebug what отправляется на сервер, это выглядит следующим образом:

markers[0][position]=128.3657142857143amp;markers[0][markerPosition]=7amp;markers[1][position]=235.1944023323615amp;markers[1][markerPosition]=19amp;markers[2][position]=42.5978231292517amp;markers[2][markerPosition]=-3

Моя вызываемая веб-сервисная функция:

 [WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
  

Комментарии:

1. ‘сбой’ не указан в качестве возможного параметра среди тех, которые перечислены в api.jquery.com/jQuery.ajax … может быть, вы перепутали это с ‘error’ вместо этого?

Ответ №1:

Вы упомянули использование json2.js чтобы упорядочить ваши данные, но опубликованные данные выглядят как URLEncoded JSON, возможно, вы уже видели это, но этот пост о недопустимом примитиве JSON объясняет, почему JSON кодируется по URL.

Я бы не передавать необработанную, сериализованную вручную строку JSON в ваш метод. ASP.NET собирается автоматически десериализовать данные POST запроса в формате JSON, поэтому, если вы вручную сериализуете и отправляете строку JSON в ASP.NET в конечном итоге вам фактически придется сериализовать вашу сериализованную строку в формате JSON в формате JSON.

Я бы предложил что-то еще в этом роде:

 var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
               { "position": "235.1944023323615", "markerPosition": "19" },
               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({
    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    error: function(errMsg) {
        alert(errMsg);
    }
});
  

Ключом к предотвращению проблемы с недопустимым примитивом JSON является передача jQuery строки JSON для data параметра, а не объекта JavaScript, чтобы jQuery не пытался URLEncode ваших данных.

На стороне сервера приведите входные параметры вашего метода в соответствие с формой передаваемых данных:

 public class Marker
{
  public decimal position { get; set; }
  public int markerPosition { get; set; }
}

[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
  return "Received "   Markers.Count   " markers.";
}
  

Вы также можете принять массив, например Marker[] Markers , если предпочитаете. Десериализатор, который использует ASMX ScriptServices (JavaScriptSerializer), довольно гибкий и сделает все возможное, чтобы преобразовать ваши входные данные в указанный вами тип на стороне сервера.

Комментарии:

1. Вы написали «чтобы jQuery не пытался URLEncode ваших данных.», но это неверно. Чтобы остановить jquery от urlencoding ваших данных, вы должны установить ProcessData в false.

2. Передачи строки достаточно, чтобы jQuery не смог URLEncoding параметр data. Вы можете присвоить ProcessData значение false , но это излишне (и делать это самостоятельно, без передачи строки JSON для данных, недостаточно).

3. Эта же проблема (и ответ) применима и к Rails.

4. @DaveWard делает contentType учитывается, используем ли мы GET, а не POST?

5. Используется file_get_contents('php://input') для ввода ваших json данных php .

Ответ №2:

  1. markers не является объектом JSON. Это обычный объект JavaScript.
  2. Прочитайте о data: опции:

    Данные, подлежащие отправке на сервер. Он преобразуется в строку запроса, если еще не является строкой.

Если вы хотите отправить данные в формате JSON, вы должны сначала их закодировать:

 data: {markers: JSON.stringify(markers)}
  

jQuery не преобразует объекты или массивы в JSON автоматически.


Но я предполагаю, что сообщение об ошибке приходит из-за интерпретации ответа сервиса. Текст, который вы отправляете обратно, не является JSON. Строки JSON должны быть заключены в двойные кавычки. Итак, вам нужно было бы сделать:

 return ""received markers"";
  

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

Комментарии:

1. Спасибо за вашу помощь, Феликс, я думал, что, запуская маркеры с помощью метода JSON.stringyfy, я преобразовывал его в строку запроса, я сделал, как вы предложили, но, к сожалению, это не работает, я не публикую следующее.

2. markers={«markers»:[{«position»:»128.3657142857143″,»markerPosition»:»7″},{«position»:»235.1944023323615″,»markerPosition»:»19″},{«position»:»42.5978231292517″,»markerPosition»:»-3″}]}

3. @Dreamguts: Мне немного неясно, чего вы хотите. Вы хотите отправить markers в виде строки JSON?

4. Привет, Феликс, да, я хочу отправить объект markers в виде строки JSON, чтобы я мог использовать его в своем веб-сервисе.

5. @Dreamguts: Тогда это должно работать таким образом. Также «код», который вы опубликовали в комментарии, выглядит нормально. Конечно, вы должны правильно декодировать его на стороне сервера и, возможно, вам придется изменить имя параметра, я не знаю.

Ответ №3:

Я попробовал решение Дейва Уорда. Часть данных не отправлялась из браузера в части полезной нагрузки запроса post, поскольку для ContentType установлено значение "application/json" . Как только я удалил эту строку, все заработало отлично.

 var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },

               { "position": "235.1944023323615", "markerPosition": "19" },

               { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({

    type: "POST",
    url: "/webservices/PodcastService.asmx/CreateMarkers",
    // The key needs to match your method's input parameter (case-sensitive).
    data: JSON.stringify({ Markers: markers }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }
});
  

Комментарии:

1. Я работаю с сервером, к которому у меня нет доступа. Я удалил ContentType, это помогло. Но полезная нагрузка передавалась как с ним, так и без него. Что-то еще изменилось. Тип содержимого изменен на «application / x-www-form-urlencoded», что неверно, но это работает. Магия. Спасибо.

Ответ №4:

Я тоже сталкивался с этим, и это мое решение.

Если при анализе данных вы сталкиваетесь с недопустимым исключением объекта json, даже если вы знаете, что ваша строка json верна, приведите данные, полученные в вашем ajax-коде, в строковую форму, прежде чем преобразовывать их в JSON:

 $.post(CONTEXT "servlet/capture",{
        yesTransactionId : yesTransactionId, 
        productOfferId : productOfferId
        },
        function(data){
            try{
                var trimData = $.trim(JSON.stringify(data));
                var obj      = $.parseJSON(trimData);
                if(obj.success == 'true'){ 
                    //some codes ...
  

Ответ №5:

Пожалуйста, следуйте этому, чтобы с помощью ajax вызвать веб-сервис java var param = { feildName: feildValue }; JSON.stringify({data: param})

 $.ajax({
            dataType    : 'json',
            type        : 'POST',
            contentType : 'application/json',
            url         : '<%=request.getContextPath()%>/rest/priceGroups',
            data        : JSON.stringify({data : param}),
            success     : function(res) {
                if(res.success == true){
                    $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in');
                    $('#alertMessage').removeClass('alert-danger alert-info');
                    initPriceGroupsList();
                    priceGroupId = 0;
                    resetForm();                                                                    
                }else{                          
                    $('#alertMessage').html(res.message).addClass('alert alert-danger fade in');
                }
                $('#alertMessage').alert();         
                window.setTimeout(function() { 
                    $('#alertMessage').removeClass('in');
                    document.getElementById('message').style.display = 'none';
                }, 5000);
            }
        });
  

Комментарии:

1. вот как перечислить передачу объекта в json для вызова ajax веб-сервиса Java.