JQuery Ajax Проводка json для webservice

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

Мой json выглядит так:

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

Я использую json2.js для stringyfy моего 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

Моя функция webservice, вызываемая:

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

Ответ 1

Вы упомянули использование json2.js, чтобы укрепить ваши данные, но данные POSTed выглядят как 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 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, если хотите. Deserializer, который использует ASMX ScriptServices (JavaScriptSerializer), довольно гибкий и сделает все возможное, чтобы преобразовать ваши входные данные в указанный вами тип сервера.

Ответ 2

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

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

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

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

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


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

return "\"received markers\"";

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

Ответ 3

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

Если при анализе данных вы сталкиваетесь с недопустимым исключительным событием 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 ...

Ответ 4

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

Ответ 5

Пожалуйста, следуйте этому путем ajax-вызова веб-сервиса java

var param = {
        priceGroupId                    : priceGroupId,
        divId                           : selectedDivId,
        priceGroupName                  : $('#priceGroupName').val(),
        priceGroupDescription           : $('#desc').val(),
        indexNumber                     : $('#indexNumber').val(),
        priceList                       : priceGroupId == 0 ? '' : priceList
        <%-- <% for(int index=0;index<10;index++){%>
            priceList[<%=index%>].regularSellPrice : $('#storePrice_<%=index%>').val(),
        <%}%>
        priceList[10].regularSellPrice : $('#storePrice_10').val() --%>
    }

$.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);
            }
        });

//any idea about when variable of javascript has list object of another list
//Like,
var priceList = [];
    for(var index=0;index<priceListLength;index++){
        if(initPriceListLength == 0){
            priceGroupStoreId = 0;
        }
        priceList.push({ 
            regularSellPrice    : $('#storePrice_'+index).val(), 
            rebateAmount        : $('#rebateAmount_'+index).val(), 
            storeId             : $('#storeId_'+index).val(), 
            storeName           : $('#storeName_'+index).val(),
            postponeDate        : $('#datePostpone').val(),
        });
    }