Como faço para criar um object JSON para enviar para um WebService AJAX?

Depois de tentar formatar meus dados JSON manualmente em javascript e falhar miseravelmente, percebi que provavelmente há uma maneira melhor. Aqui está o que o código para o método de serviço da web e classs relevantes parece em c #:

[WebMethod] public Response ValidateAddress(Request request) { return new test_AddressValidation().GenerateResponse( test_AddressValidation.ResponseType.Ambiguous); } ... public class Request { public Address Address; } public class Address { public string Address1; public string Address2; public string City; public string State; public string Zip; public AddressClassification AddressClassification; } public class AddressClassification { public int Code; public string Description; } 

O serviço da Web funciona muito bem com o uso de SOAP / XML, mas não consigo obter uma resposta válida usando javascript e jQuery porque a mensagem que recebo do servidor tem um problema com meu JSON codificado manualmente.

Eu não posso usar a function getJSON do jQuery porque a requisição requer HTTP POST, então estou usando a function ajax nível mais baixo:

 $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress", data: "{\"Address\":{\"Address1\":\"123 Main Street\",\"Address2\":null,\"City\":\"New York\",\"State\":\"NY\",\"Zip\":\"10000\",\"AddressClassification\":null}}", dataType: "json", success: function(response){ alert(response); } }) 

A function ajax está enviando tudo especificado nos data: que é onde está o meu problema. Como faço para construir um object JSON formatado corretamente em javascript para que eu possa conectá-lo à minha chamada ajax forma:

 data: theRequest 

Eventualmente vou extrair dados de inputs de texto em formulários, mas por enquanto os dados de teste codificados estão bem.

Como faço para criar um object JSON formatado corretamente para enviar para o serviço da web?


UPDATE: Acontece que o problema com o meu pedido não foi a formatação do JSON, como TJ apontou, mas sim que o meu texto JSON não estava de acordo com os requisitos do serviço web. Aqui está uma solicitação JSON válida com base no código no WebMethod:

 '{"request":{"Address":{"Address1":"123 Main Street","Address2":"suite 20","City":"New York","State":"NY","Zip":"10000","AddressClassification":null}}}' 

Isso trouxe outra questão: Quando a maiúsculas e minúsculas é importante em solicitações JSON para serviços da Web do ASP.NET (ASMX)?

A resposta é muito fácil e baseada em meus posts anteriores Posso retornar o JSON de um serviço da Web .asmx se o ContentType não for JSON? e JQuery chamada ajax para httpget webmethod (c #) não está funcionando .

Os dados devem ser codificados em JSON. Você deve separar cada um dos parâmetros de input. Porque você tem apenas um parâmetro que você deve seguir:

primeiro construa seus dados como dados nativos de JavaScript como:

 var myData = {Address: {Address1:"address data 1", Address2:"address data 2", City: "Bonn", State: "NRW", Zip: "53353", {Code: 123, Description: "bla bla"}}}; 

em seguida, forneça como um parâmetro da solicitação ajax {request:$.toJSON(myData)}

 $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress", data: {request:$.toJSON(myData)}, dataType: "json", success: function(response){ alert(response); } }) 

em vez de $ .toJSON, que vem do plugin JSON, você pode usar outra versão (JSON.stringify) de http://www.json.org/

Se o seu WebMethod tivesse parâmetros como

 public Response ValidateAddress(Request request1, Request myRequest2) 

o valor do parâmetro data da chamada ajax deve ser como

 data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)} 

ou

 data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)} 

se você preferir outra versão do codificador JSON.

Seu problema se divide em duas partes:

Criando a string JSON

Seu JSON no seu código citado é perfeitamente válido. Mas ser feito a mão é uma dor. Como outros chamaram, a maneira mais fácil de fazer isso é criar um object Javascript e, em seguida, JSON.stringify . Exemplo:

 var data = { "Address": { "Address1": "123 Main Street", "Address2": null, "City": "New York", "State": "NY", "Zip": "10000", "AddressClassification": null } }; data = JSON.stringify(data); 

A primeira etapa acima cria um object usando a notação literal do object Javascript, que é um superconjunto de JSON (como usado acima, ele é na verdade o mesmo que JSON, mas ignora isso). O segundo bit pega esse object e o converte em uma string.

Naturalmente, os valores acima são seqüências literais, o que é improvável. Veja como ficaria se você tivesse cada um desses valores em uma variável:

 var data = { "Address": { "Address1": address1, "Address2": address2, "City": city, "State": state, "Zip": zip, "AddressClassification": null } }; data = JSON.stringify(data); 

De qualquer maneira, agora você tem a string.

Enviando a sequência JSON para o serviço da web

Você precisa descobrir se o serviço da Web espera que os dados formatados em JSON sejam o corpo POST ou se espera que os dados JSON sejam o valor de um parâmetro nos dados POST codificados por URL name = value mais comuns. Eu tenderia a esperar o primeiro, porque o serviço da Web parece especificamente projetado para trabalhar com dados formatados em JSON.

Se é suposto ser o corpo do POST, bem, eu nunca fiz isso com jQuery, e o que você citou parece correto para mim lendo os documentos. Se não estiver funcionando, confirmo que sua estrutura de objects é realmente o que eles esperam ver. Por exemplo, se for apenas validar um único endereço, será que você espera receber apenas um object Address, em vez de um object que contenha um object Address, por exemplo:

 { "Address1": "123 Main Street", "Address2": null, "City": "New York", "State": "NY", "Zip": "10000", "AddressClassification": null } 

Se é suposto ser o valor de um parâmetro em dados de formulários multipartidos codificados por URL antigos, então:

 $.ajax({ type: "POST", url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress", data: "paramname=" + encodeURIComponent(data), dataType: "json", success: function(response){ alert(response); } }) 

Eu removi o contentType para que o jQuery retorne ao padrão (“application / x-www-form-urlencoded”) e assegure que a string que criamos acima esteja corretamente codificada nesse tipo de conteúdo. Você precisará descobrir o paramname do paramname a ser usado (talvez “Endereço” e ver meu comentário anterior sobre o envio apenas do endereço, em vez de um object que contém um object filho de endereço?).

JSON.stringify pegará um object javascript e o transformará em uma string. Eu aposto que se você criar um object Javascript como

 var jsonData = { address: 'address', address1: 'address1', address2: 'address2' }; 

e depois passar jsonData como ‘data’ na chamada ajax, então ele irá converter o object para o texto json para você.

Gostaria de criar um object javascript e, em seguida, chamar JSON.stringify para transformá-lo em JSON válido. Você pode baixá-lo daqui .

Você poderia fazer algo assim:

 var address= {}; address["Address1"] = "your val"; address["Address2"] = "your val"; address["City"] = "your val"; address["State"] = "your val"; address["Zip"] = "your val"; $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress", data: JSON.stringify(address), dataType: "json", success: function(response){ alert(response); } }); 

Você precisa passar assim:

 $.ajax({ type: "POST", url: "WebService.asmx/WebMethodName", data: "{'fname':'dave', 'lname':'ward'}", contentType: "application/json; charset=utf-8", dataType: "json" }); 

Dê uma olhada neste artigo para obter mais detalhes: 3 erros a evitar ao usar o jQuery com o ASP.NET AJAX

Todas as desculpas se esta resposta chegar tarde ou for uma duplicação.

Pelo que entendi, parece que você está tentando enviar apenas a string de um object JSON. Tente construir um object e, em seguida, trabalhar com suas propriedades e enviá-lo como está.

Exemplo:

 address = new Object(); address.Address = new Object(); address.Address.Address1 = "123 Main Street"; address.Address.Address2 = ""; address.Address.City = "New York"; address.Address.State = "NY"; address.Address.Zip = "10000"; address.Address.AddressClassification = null; $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress", data: address, dataType: "json", success: function(response){ alert(response); } }); 

Arranja um plugin jquery que pode converter qualquer object javascript em json. Por exemplo:

http://plugins.jquery.com/project/json