Jquery Ajax Отправка JSON в веб-сервис

238

Я пытаюсь опубликовать объект 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 публикуется на сервере, это выглядит так:

Маркеры% 5B0% 5D% 5Bposition% 5D = 128,3657142857143 & маркеры% 5B0% 5D% 5BmarkerPosition% 5D = 7 & маркеры% 5B1% 5D% 5Bposition% 5D = 235,1944023323615 & маркеры% 5B1% 5D% 5BmarkerPosition% 5D = 19 & маркеры% 5В2% 5D% 5Bposition% 5D = +42,5978231292517 & маркеры% 5В2% 5D% 5BmarkerPosition% 5D = -3

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

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
Код фараона
источник
'fail' не указан в качестве возможного параметра среди перечисленных в api.jquery.com/jQuery.ajax ... может, вместо этого вы ошиблись с 'error'?
Даникотра

Ответы:

390

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

Я бы посоветовал против прохождения сырой, вручную сериализована строки JSON в ваш метод . ASP.NET собирается автоматически JSON десериализовать данные запроса POST, поэтому, если вы вручную сериализуете и отправляете строку 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);},
    failure: 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), довольно гибкий и сделает все возможное для преобразования ваших входных данных в указанный вами тип серверной части.

Дейв Уорд
источник
4
Вы написали «чтобы jQuery не пытался URLE кодировать ваши данные», но это неверно. Чтобы jquery не кодировал ваши данные, вы должны установить для processData значение false.
Softlion
8
Передачи в строке достаточно, чтобы запретить jQuery URLEncoding для параметра данных. Вы можете установить для processData значение false, но это излишне (и сделать это самостоятельно, не передавая строку JSON для данных, недостаточно).
Дейв Уорд
1
Эта же проблема (и ответ) относится и к Rails.
GregT
2
@DaveWard Рассматривается ли, contentTypeесли мы используем GET, а не POST?
Ройи Намир
@RoyiNamir Если вы используете ASMX ScriptServices или ASPX WebMethods, вам нужно использовать POST, чтобы они возвращали JSON. Если вы ПОЛУЧИТЕ, Content-Type правильный или нет, вы получите XML вместо этого.
Дэйв Уорд
19
  1. markersне является объектом JSON. Это обычный объект JavaScript.
  2. Прочитайте о data:варианте :

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

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

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

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


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

return "\"received markers\"";

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

Феликс Клинг
источник
Спасибо за помощь, Феликс, я подумал, что, запустив маркеры через метод JSON.stringyfy, я преобразовал его в строку запроса, я сделал, как вы предложили, но, к сожалению, это не работает, я не публикую следующее.
Код фараона
Маркеры =% 7B% 22markers% 22% 3A% 5B% 7B% 22position% 22% 3A% +22128,3657142857143% 22% 2C% 22markerPosition% 22% 3A% 227% 22% 7D% 2C% 7B% 22position% 22% 3A% +22235,1944023323615 % 22% 2C% 22markerPosition% 22% 3A% 2219% 22% 7D% 2C% 7B% 22position% 22% 3A% 2242,5978231292517% 22% 2C% 22markerPosition% 22% 3A% 22-3% 22% 7D% 5D% 7D
Код фараона
@Dreamguts: Мне немного неясно, что вы хотите. Вы хотите отправить в markersвиде строки JSON?
Феликс Клинг
Привет Феликс, да, я хочу отправить объект маркеров в виде строки JSON, чтобы я мог использовать его в своем веб-сервисе.
Код фараона
@Dreamguts: Тогда это должно работать таким образом. Также «код», который вы разместили в комментарии, выглядит нормально. Конечно, вы должны правильно декодировать его на стороне сервера, и, возможно, вам придется изменить имя параметра, я не знаю.
Феликс Клинг
3

Я попробовал решение Дейва Уорда. Часть данных не отправлялась из браузера в части полезной нагрузки запроса на публикацию, так как для 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);
    }
});
Уша
источник
2

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

Если вы столкнулись с недопустимым исключением объекта 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 ...
Клэр Панганорон
источник
1

У меня есть запрос,

$("#login-button").click(function(e){ alert("hiii");

        var username = $("#username-field").val();
        var password = $("#username-field").val();

        alert(username);
        alert("password" + password);



        var markers = { "userName" : "admin","password" : "admin123"};
        $.ajax({
            type: "POST",
            url: url,
            // The key needs to match your method's input parameter (case-sensitive).
            data: JSON.stringify(markers),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert("got the data"+data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });

    });

Я публикую данные для входа в JSON и получаю строку как "Success", но я не получаю ответ.

Прия Б
источник
1
Это не ответ на вопрос. Если вы хотите задать вопрос, перейдите в меню «Вопрос» и нажмите «Задать вопрос», и, если ваш вопрос связан с этим вопросом, предоставьте ссылку на ваш вопрос.
Миттал Патель
-2

Пожалуйста, следуйте этому при помощи 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);
            }
        });
Рави Панчал
источник
здесь, как перечислить объект, передаваемый в json для вызова ajax веб-сервиса java.
Рави Панчал