Próbuję opublikować obiekt JSON w usłudze internetowej asp.net.
Mój Json wygląda następująco:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Używam json2.js do stringyfy mój obiekt json.
i używam jquery do opublikowania go w mojej usłudze internetowej.
$.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);
}
});
Otrzymuję następujący błąd:
„Niepoprawna operacja podstawowa JSON:
Znalazłem kilka postów związanych z tym i wydaje się, że jest to naprawdę częsty problem, ale nic, co próbuję rozwiązać, nie rozwiązuje problemu.
Gdy firebug jest publikowany na serwerze, wygląda to tak:
markery% 5B0% 5D% 5Bpozycja% 5D = 128.3657142857143 i markery% 5B0% 5D% 5BmarkerPozycja% 5D = 7 i markery% 5B1% 5D% 5Bpozycja% 5D = 235,1944023323615 i markery% 5B1% 5D% 5B Marker%% 5D 5D = 42,5978231292517 i markery% 5B2% 5D% 5 Marker Pozycja% 5D = -3
Moja wywoływana funkcja usługi internetowej to:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
źródło
Odpowiedzi:
Wspomniałeś, że używasz json2.js, aby skretyfikować swoje dane, ale dane POSTed wydają się być JSON URLEncoded Być może już to widziałeś, ale ten post o niepoprawnej operacji podstawowej JSON opisuje, dlaczego JSON jest URLEncoded.
Chciałbym doradzić przed przechodzącą surowe, ręcznie odcinkach ciąg JSON do swojej metody . ASP.NET automatycznie JSON zdekrializuje dane POST żądania, więc jeśli ręcznie serializujesz i wysyłasz ciąg JSON do ASP.NET, w rzeczywistości będziesz musiał JSON serializować swój szeregowany ciąg JSON.
Sugerowałbym coś więcej zgodnie z tymi wskazówkami:
Kluczem do uniknięcia niepoprawnego pierwotnego problemu JSON jest przekazanie jQuery ciągu JSON dla
data
parametru, a nie obiektu JavaScript, aby jQuery nie próbował URLEncode danych.Po stronie serwera dopasuj parametry wejściowe metody do kształtu przekazywanych danych:
Możesz również zaakceptować tablicę, na przykład
Marker[] Markers
, jeśli wolisz. Deserializator, którego używa ASMX ScriptServices (JavaScriptSerializer), jest dość elastyczny i zrobi wszystko, co w jego mocy, aby przekonwertować dane wejściowe na określony typ po stronie serwera.źródło
contentType
jest brane pod uwagę, jeśli używamy GET, a nie POST?markers
nie jest obiektem JSON. Jest to normalny obiekt JavaScript.data:
opcji :Jeśli chcesz wysłać dane jako JSON, musisz najpierw je zakodować:
jQuery nie konwertuje automatycznie obiektów ani tablic do JSON.
Ale zakładam, że komunikat o błędzie pochodzi z interpretacji odpowiedzi usługi. Odesłany tekst nie jest JSON. Ciągi JSON muszą być ujęte w podwójne cudzysłowy. Więc musisz zrobić:
Nie jestem pewien, czy twoim prawdziwym problemem jest wysyłanie lub odbieranie danych.
źródło
markers
jako ciąg JSON?Wypróbowałem rozwiązanie Dave'a Warda. Część danych nie była wysyłana z przeglądarki w części danych żądania wysyłania, ponieważ parametr contentType jest ustawiony na
"application/json"
. Po usunięciu tej linii wszystko działało świetnie.źródło
Zetknąłem się też z tym i to jest moje rozwiązanie.
Jeśli podczas analizowania danych napotkasz niepoprawny wyjątek obiektu json, mimo że wiesz, że łańcuch json jest poprawny, przed analizowaniem go do JSON należy skorygować dane otrzymane w kodzie ajax:
źródło
Mam zapytanie
Wysyłam dane logowania w json i otrzymuję ciąg jako
"Success"
, ale nie otrzymuję odpowiedzi.źródło
Postępuj zgodnie z tym, wywołując ajax do webservice java var param = {feildName: feildValue}; JSON.stringify ({data: param})
źródło