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 публикува това, което се изпраща на сървъра, то изглежда по следния начин:

markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3

Функцията на моята уеб услуга, която се извиква, е:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
Решение

Споменахте, че използвате json2.js, за да стрингифицирате данните си, но изпратените данни изглеждат като URLEncoded JSON Може би вече сте го видели, но тази публикация за невалидния JSON примитив покрива причините, поради които JSON е URLEncoded.

Бих посъветвал да не подавате необработен, ръчно сериализиран JSON низ във вашия метод. ASP.NET автоматично ще десериализира JSON данните от POST заявката, така че ако ръчно сериализирате и изпращате JSON низ към ASP.NET, в крайна сметка ще се наложи да сериализирате 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 Markers)
{
  return "Received " + Markers.Count + " markers.";
}

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

Коментари (13)
  1. Markers не е JSON обект. Той е нормален JavaScript обект.
  2. Прочетете за опцията data::

    Данни, които да бъдат изпратени на сървъра. Преобразува се в запитващ низ, ако вече не е низ.

Ако искате да изпратите данните като JSON, трябва първо да ги кодирате:

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

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


Но предполагам, че съобщението за грешка идва от интерпретирането на отговора на услугата. Текстът, който изпращате обратно, не е JSON. JSON низовете трябва да бъдат затворени в двойни кавички. Така че би трябвало да направите:

return "\"received markers\"";

Не съм сигурен дали истинският ви проблем е в изпращането или получаването на данните.

Коментари (9)

Аз също се сблъсках с този проблем и това е моето решение.

Ако срещате изключение за невалиден 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 ...
Коментари (0)