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.
— Рави Панчал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.