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 5D = 42,5978231292517 & маркери% 5B2% 5D% 5BmarkerPosition% 5D = -3

Моя функція веб-сервісу, яку викликають:

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

"Помилка" не надається як можливий параметр серед перелічених у api.jquery.com/jQuery.ajax ... можливо, ви помилилися з "помилкою" замість цього?
Данікотра

Відповіді:


390

Ви згадали, що використовуєте json2.js для строковування даних, але дані POSTed, схоже, є URLE-кодованими JSON Ви, можливо, це вже бачили, але ця публікація про недійсні примітиви JSON охоплює, чому JSON використовується URLE-кодований.

Я б порадив проти проходження сирої, вручну серіалізовані рядки 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 не намагався URLEкодувати ваші дані.

На стороні сервера порівняйте вхідні параметри вашого методу з формою даних, які ви передаєте:

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 від urlencoding ваших даних, ви повинні встановити processData на false.
Softlion

8
Проходження в рядку достатньо, щоб jQuery не міг URLEкодувати параметр даних. Ви можете встановити dataData на false, але це зайве (а робити це поодинці, не переходячи в рядок JSON для даних, недостатньо).
Дейв Ворд

1
Це ж питання (і відповідь) стосується і Рейлів.
GregT

2
@DaveWard Чи contentTypeвважається, якщо ми використовуємо GET, а не POST?
Royi Namir

@RoyiNamir Якщо ви використовуєте ASMX ScriptServices або ASPX WebMethods, вам потрібно використовувати POST, щоб змусити їх повернути JSON. Якщо ви GET, 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% 22 маркери% 22% 3A% 5B% 7B% 22позиція% 22% 3A% 22128.3657142857143% 22% 2C% 22markerPosition% 22% 3A% 227% 22% 7D% 2C% 7B% 22позиція% 22% 3A% 22235.1944023323615 % 22% 2C% 22markerPosition% 22% 3A% 2219% 22% 7D% 2C% 7B% 22позиція% 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 webservice.
Раві Панчал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.