Jquery Ajax Postando json para webservice

Eu estou tentando postar um object JSON para um webservice asp.net.

Meu json parece com isso:

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

Eu estou usando o json2.js para stringyfy meu object json.

e eu estou usando jquery para postá-lo no meu webservice.

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

“Primitiva JSON inválida:

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

Quando o firebug que está sendo postado no servidor, é assim:

marcadores% 5B0% 5D% 5Bposição% 5D = 128.3657142857143 & marcadores% 5B0% 5D% 5BaracterísticaPosição% 5D = 7 & marcadores% 5B1% 5D% 5Bposição% 5D = 235.1944023323615 & marcadores% 5B1% 5D% 5BarcadorPosição% 5D = 19 & marcadores% 5B2% 5D% 5Bposição% 5D = 42,5978231292517 e marcadores% 5B2% 5D% 5BmarkerPosition% 5D = -3

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

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

Você mencionou o uso de json2.js para restringir seus dados, mas os dados POSTed parecem ter JSON URLEncoded Você já deve ter visto, mas esta postagem sobre a primitiva JSON inválida explica por que o JSON está sendo URLEncoded.

Eu aconselharia a não passagem de uma string JSON raw, manualmente serializada para o seu método . O ASP.NET irá automaticamente desserializar JSON os dados POST da solicitação, portanto, se você estiver manualmente serializando e enviando uma string JSON para o ASP.NET, na verdade, você acabará tendo que serializar JSON sua string JSON serializada.

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 parâmetro data , não um object JavaScript, para que o jQuery não tente URLEncode seus dados.

No lado do servidor, corresponda os parâmetros de input do seu método ao formato dos dados que você está passando:

 public class Marker { public decimal position { get; set; } public int markerPosition { get; set; } } [WebMethod] public string CreateMarkers(List Markers) { return "Received " + Markers.Count + " markers."; } 

Você também pode aceitar uma matriz, como Marker[] Markers , se preferir. O desserializador que o ASMX ScriptServices usa (JavaScriptSerializer) é bastante flexível e fará o possível para converter seus dados de input no tipo do lado do servidor que você especificar.

  1. markers não é um object JSON. É um object JavaScript normal.
  2. Leia sobre os data: option :

    Dados a serem enviados para o servidor. Ele é convertido em uma string de consulta , se ainda não for uma string.

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

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

O jQuery não converte objects ou matrizes em JSON automaticamente.


Mas presumo que a mensagem de erro vem da interpretação da resposta do serviço. O texto que você envia de volta não é JSON. Strings JSON devem ser colocadas entre aspas duplas. Então você tem que fazer:

 return "\"received markers\""; 

Não tenho certeza se seu problema real é enviar ou receber os dados.

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

Se você estiver encontrando uma exceção de object json inválida ao analisar dados, mesmo sabendo que sua cadeia json está correta, restrinja os dados recebidos em seu código ajax antes de analisá-los para 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 ... 

Eu tentei a solução de Dave Ward. A parte de dados não estava sendo enviada do navegador na parte de carga útil da solicitação de postagem, pois o contentType está configurado como "application/json" . Depois que eu 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); } }); 

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 no json e obtendo uma string como "Success" , mas não estou recebendo a resposta.

Por favor, siga isso para por chamada ajax para webservice 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); } });