Estou tentando postar um objeto JSON em um webservice da asp.net.
O meu filho tem este aspecto:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Estou a usar o json2.js para estrangular o meu objecto json.
e estou a usar o Jquery para o colocar 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);
}
});
Estou a receber o seguinte erro:
"Inválido JSON primitivo:
Encontrei um monte de posts relacionados a isso e parece ser um problema muito comum, mas nada que eu tente resolver o problema.
Quando o firebug o que está sendo postado no servidor é parecido com isto:
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
A minha função de webservice que está a ser chamada é:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Você mencionou o uso do json2.js para codificar seus dados, mas os dados POSTED parecem ser JSON URLEncoded Você pode já ter visto, mas este post sobre o JSON primitivo inválido cobre o motivo pelo qual o JSON está sendo URLEncoded.
I'd aconselha against a passar uma string JSON crua e serializada manualmente no seu método. O ASP.NET vai desserializar automaticamente a requisição's dados POST do JSON, então se você're-serializar manualmente e enviar uma string JSON para o ASP.NET, você'acabará tendo que serializar a sua string JSON serializada.
I'sugeriria algo mais nesse sentido:
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 a questão primitiva do JSON inválido é passar jQuery uma string JSON para o parâmetro data
, não um objeto JavaScript, para que jQuery não't tente URLEncode seus dados.
No lado do servidor, combine os parâmetros de entrada do seu método's com a forma dos dados que você're passando para dentro:
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 um array, como Marker[] Markers
, se preferir. O deserializador que o ASMX ScriptServices usa (JavaScriptSerializer) é bastante flexível, e fará o que puder para converter seus dados de entrada para o tipo de servidor que você especificar.
dados:
:Dados a serem enviados para o servidor. Ele é convertido para uma string query, se ainda não for uma string.
Se você quiser enviar os dados como JSON, você tem que codificá-los primeiro:
data: {markers: JSON.stringify(markers)}
jQuery não converte objetos ou arrays para 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. As cordas do JSON têm de ser incluídas entre aspas duplas. Então você'teria que fazer:
return "\"received markers\"";
I'não tenho a certeza se o seu problema real é enviar ou receber os dados.
Eu também já encontrei esta e esta é a minha solução.
Se você estiver encontrando uma exceção de objeto json inválido ao analisar os dados, mesmo sabendo que a sua cadeia de caracteres json está correta, codifique os dados recebidos no seu código ajax antes de analisá-los ao 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 ...