Jquery Ajax Postando json no webservice


238

Estou tentando postar um objeto JSON em um serviço da web asp.net.

Meu json fica assim:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

Estou usando o json2.js para stringyfy meu objeto json.

e eu estou usando o jquery para publicá-lo no meu serviço web.

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

Eu estou recebendo o seguinte erro:

"Primitivo JSON inválido:

Eu encontrei um monte de posts relacionados a isso e parece ser um problema muito comum, mas nada que eu tente conserte o problema.

Ao firebug, o que está sendo publicado no servidor fica assim:

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

Minha função de serviço da web que está sendo chamada é:

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

'falha' não é fornecida como uma configuração possível entre as listadas em api.jquery.com/jQuery.ajax ... talvez você tenha confundido com 'erro'?
Danicotra #

Respostas:


390

Você mencionou o uso do json2.js para especificar seus dados, mas os dados POSTed parecem ser JSON com código URLEn Você já deve ter visto, mas esta publicação sobre o primitivo JSON inválido cobre por que o JSON está sendo codificado com URLEn.

Eu aconselho a não passar uma string JSON bruta serializada manualmente em seu método . O ASP.NET irá JSer desserializar automaticamente os dados POST da solicitação, portanto, se você estiver serializando manualmente e enviando uma string JSON para o ASP.NET, na verdade, você terá que JSON serializar sua string serializada JSON.

Eu sugeriria algo mais ao longo destas linhas:

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

A chave para evitar o problema primitivo JSON inválido é passar jQuery uma string JSON para o dataparâmetro, não um objeto JavaScript, para que o jQuery não tente codificar seus dados com URLEn.

No lado do servidor, combine os parâmetros de entrada do seu método com a forma dos dados pelos quais você está passando:

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

Você também pode aceitar uma matriz, como Marker[] Markers, se preferir. O desserializador usado pelo ASMX ScriptServices (JavaScriptSerializer) é bastante flexível e fará o possível para converter seus dados de entrada no tipo de servidor especificado.


4
Você escreveu "para que o jQuery não tente URLEncode seus dados.", Mas não está correto. Para impedir que o jquery codifique seus dados pela URL, defina processData como false.
Softlion 20/10/11

8
Passar uma string é suficiente para impedir que o jQuery URLEncoding o parâmetro data. Você pode definir processData como false, mas é supérfluo (e fazer isso sozinho, sem passar uma string JSON para os dados, não é suficiente).
Dave Ward

1
Este mesmo problema (e resposta) também se aplica ao Rails.
precisa saber é o seguinte

2
@DaveWard Será contentTypeconsiderado se usarmos GET e não POST?
21413 Royi Namir

@RoyiNamir Se você estiver usando ASMX ScriptServices ou ASPX WebMethods, precisará usar o POST para fazer com que eles retornem JSON. Se você GET, Content-Type correto ou não, receberá XML.
Dave Ward

19
  1. markersnão é um objeto JSON. É um objeto JavaScript normal.
  2. Leia sobre a data:opção :

    Dados a serem enviados para o servidor. É convertido em uma sequência de consultas , se ainda não é uma sequência.

Se você deseja enviar os dados como JSON, é necessário codificá-los primeiro:

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

O jQuery não converte objetos ou matrizes para JSON automaticamente.


Mas suponho que a mensagem de erro venha da interpretação da resposta do serviço. O texto que você envia de volta não é JSON. As strings JSON devem ser colocadas entre aspas duplas. Então você teria que fazer:

return "\"received markers\"";

Não tenho certeza se o seu problema real está enviando ou recebendo dados.


Obrigado por ajudar o Felix, pensei que, executando marcadores através do método JSON.stringyfy, estava convertendo-o em uma string de consulta, fiz o que você sugeriu, mas infelizmente não funciona, não estou postando o seguinte.
Faraó de código

marcadores =% 7B% 22marcadores% 22% 3A% 5B% 7B% 22posição% 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
Faraó de código

@ Dreamguts: Não é claro para mim o que você quer. Deseja enviar markerscomo string JSON?
Felix Kling

Oi Felix, sim, eu quero enviar o objeto de marcadores como uma string JSON para que eu possa usá-lo no meu serviço web.
Code Pharaoh

@ Dreamguts: Então deve funcionar dessa maneira. Além disso, o "código" que você postou no comentário parece ok. Claro que você tem que decodificá-lo corretamente no lado do servidor e talvez você precise alterar o nome do parâmetro, eu não sei.
Felix Kling

3

Eu tentei a solução de Dave Ward. A parte de dados não estava sendo enviada do navegador na parte de carga da solicitação de postagem, pois o contentType está definido como "application/json". Depois que removi essa linha, tudo funcionou muito bem.

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

Eu encontrei este também e esta é a minha solução.

Se você estiver encontrando uma exceção de objeto json inválida ao analisar dados, mesmo sabendo que sua sequência json está correta, especifique os dados que você recebeu em seu código ajax antes de analisá-lo em 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

Eu tenho consulta

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

    });

Estou postando os detalhes de login em json e recebendo uma string como "Success", mas não estou recebendo a resposta.


1
Esta não é a resposta para a pergunta. Se você quiser fazer a pergunta, vá ao menu "Pergunta" e clique em "Fazer pergunta". Se a sua pergunta estiver relacionada a ela, forneça o link de referência na sua pergunta.
Mittal Patel

-2

Por favor, siga isto para chamar ajax para o serviço web de 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);
            }
        });

aqui como listar o objeto passe para json na chamada ajax do java webservice.
Ravi Panchal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.