Jquery Ajax Posting json w serwisie internetowym


238

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";
}

„awaria” nie jest zapewniona jako możliwe ustawienie wśród tych wymienionych w api.jquery.com/jQuery.ajax ... może zamiast tego pomyliłeś ją z „błędem”?
danicotra

Odpowiedzi:


390

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:

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

Kluczem do uniknięcia niepoprawnego pierwotnego problemu JSON jest przekazanie jQuery ciągu JSON dla dataparametru, a nie obiektu JavaScript, aby jQuery nie próbował URLEncode danych.

Po stronie serwera dopasuj parametry wejściowe metody do kształtu przekazywanych danych:

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.";
}

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.


4
Napisałeś „aby jQuery nie próbował URLEncode twoich danych.”, Ale to nie jest poprawne. Aby powstrzymać jquery przed urlencoding danych, musisz ustawić wartość processData na false.
Softlion,

8
Przekazywanie ciągu jest wystarczające, aby uniemożliwić jQuery URLEnkodowanie parametru danych. Możesz ustawić wartość processData na false, ale jest to zbyteczne (i samo to robić, bez przekazywania ciągu JSON dla danych, nie wystarczy).
Dave Ward,

1
Ten sam problem (i odpowiedź) dotyczy również Railsów.
GregT

2
@DaveWard Czy contentTypejest brane pod uwagę, jeśli używamy GET, a nie POST?
Royi Namir,

@RoyiNamir Jeśli używasz ASMX ScriptServices lub ASPX WebMethods, musisz użyć POST, aby zmusić je do zwrócenia JSON. Jeśli GET, typ zawartości jest poprawny, czy nie, otrzymasz XML.
Dave Ward

19
  1. markersnie jest obiektem JSON. Jest to normalny obiekt JavaScript.
  2. Przeczytaj o data:opcji :

    Dane do wysłania na serwer. Jest konwertowany na ciąg zapytania , jeśli nie jest już ciągiem.

Jeśli chcesz wysłać dane jako JSON, musisz najpierw je zakodować:

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

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ć:

return "\"received markers\"";

Nie jestem pewien, czy twoim prawdziwym problemem jest wysyłanie lub odbieranie danych.


Dzięki za pomoc Felixowi, pomyślałem, że uruchamiając znaczniki za pomocą metody JSON.stringyfy, konwertujełem go na ciąg zapytania, zrobiłem tak, jak zasugerowałeś, ale niestety nie działa, nie zamieszczam następujących.
Kod Faraon

markery =% 7B% 22 markery% 22% 3A% 5B% 7B% 22 pozycja% 22% 3A% 22128.3657142857143% 22% 2C% 22marker Pozycja% 22% 3A% 227% 22% 7D% 2C% 7B% 22 pozycja 22% 3A% 22235.1944023323615 % 22% 2C% 22marker Pozycja% 22% 3A% 2219% 22% 7D% 2C% 7B% 22pozycja% 22% 3A% 2242.5978231292517% 22% 2C% 22markerPozycja% 22% 3A% 22-3% 22% 7D% 5D% 7D
Kod Faraon

@Dreamguts: Nie jest dla mnie jasne, czego chcesz. Czy chcesz wysłać markersjako ciąg JSON?
Felix Kling

Cześć Felix, tak, chcę wysłać obiekt znaczników jako ciąg JSON, aby móc go użyć w mojej usłudze internetowej.
Kod Faraon

@Dreamguts: To powinno działać w ten sposób. Również „kod” opublikowany w komentarzu wygląda dobrze. Oczywiście musisz go poprawnie zdekodować po stronie serwera i być może musisz zmienić nazwę parametru, nie wiem.
Felix Kling

3

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.

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

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:

$.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

Mam zapytanie

$("#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);
            }
        });

    });

Wysyłam dane logowania w json i otrzymuję ciąg jako "Success", ale nie otrzymuję odpowiedzi.


1
To nie jest odpowiedź na pytanie. Jeśli chcesz zadać pytanie, przejdź do menu „Pytanie” i kliknij „Zadaj pytanie”, a jeśli twoje pytanie dotyczy tego pytania, podaj link referencyjny w swoim pytaniu.
Mittal Patel

-2

Postępuj zgodnie z tym, wywołując ajax do webservice 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);
            }
        });

tutaj, jak wyświetlić listę obiektów przekazywanych do json do wywołania ajax usługi Java.
Ravi Panchal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.