Come posso creare un object JSON da inviare a un servizio Web AJAX?

Dopo aver provato a formattare i miei dati JSON manualmente in javascript e fallendo miseramente, mi sono reso conto che probabilmente c’è un modo migliore. Ecco come appare il codice per il metodo di servizio web e le classi pertinenti in 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; } 

Il servizio web funziona alla grande con l’uso di SOAP / XML, ma non riesco a ottenere una risposta valida usando javascript e jQuery perché il messaggio che torno dal server ha un problema con il mio JSON codificato a mano.

Non riesco a utilizzare la funzione jQuery getJSON perché la richiesta richiede HTTP POST, quindi sto utilizzando la funzione ajax livello inferiore invece:

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

La funzione ajax sta inviando tutto ciò che è specificato nei data: che è il mio problema. Come posso creare un object JSON correttamente formattato in javascript in modo da poterlo colbind alla mia chiamata ajax modo:

 data: theRequest 

Alla fine estrarrò i dati dagli input di testo nei moduli, ma per ora i dati dei test codificati vanno bene.

Come posso creare un object JSON correttamente formattato da inviare al servizio web?


AGGIORNAMENTO: Risulta che il problema con la mia richiesta non era la formattazione del JSON, come ha sottolineato TJ, ma piuttosto che il mio testo JSON non era conforms ai requisiti del servizio web. Ecco una richiesta JSON valida basata sul codice nel WebMethod:

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

Questo ha sollevato un’altra domanda: quando è importante la distinzione tra maiuscole e minuscole nelle richieste JSON ai servizi Web ASP.NET (ASMX)?

La risposta è molto semplice e basata sui miei post precedenti Posso restituire JSON da un servizio Web .asmx se ContentType non è JSON? e JQuery chiamata ajax a httpget webmethod (c #) non funziona .

I dati dovrebbero essere codificati JSON. Dovresti separare codificare ogni parametro di input. Perché hai solo un parametro che dovresti fare come segue:

per prima cosa costruisci i tuoi dati come dati JavaScript nativi come:

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

quindi fornire come parametro la richiesta 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); } }) 

invece di $ .toJSON, che provengono dal plugin JSON, puoi usare un’altra versione (JSON.stringify) da http://www.json.org/

Se il tuo WebMethod avesse parametri simili

 public Response ValidateAddress(Request request1, Request myRequest2) 

il valore del parametro dei data della chiamata ajax dovrebbe essere come

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

o

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

se si preferisce un’altra versione del codificatore JSON.

Il tuo problema si divide in due parti:

Creazione della stringa JSON

Il tuo JSON nel tuo codice citato è perfettamente valido. Ma essere fatti a mano è un dolore. Come altri hanno chiamato, il modo più semplice per farlo è creare un object Javascript e poi JSON.stringify . Esempio:

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

Il primo passo sopra crea un object usando la notazione letterale dell’object Javascript, che è un superset di JSON (come usato sopra, in realtà è lo stesso di JSON, ma ignora questo). Il secondo bit prende quell’object e lo converte in una stringa.

Naturalmente, i valori sopra sono stringhe letterali, il che è improbabile. Ecco come sarebbe se avessi ognuno di questi valori in una variabile:

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

Ad ogni modo, ora hai la stringa.

Invio della stringa JSON al servizio web

È necessario scoprire se il servizio Web si aspetta che i dati in formato JSON siano il corpo POST o se si aspettano che i dati JSON siano il valore di un parametro nei dati POST codificati in URL con nome più comune = valore. Tenderei ad aspettarmi il primo, perché il servizio web sembra progettato specificamente per funzionare con dati in formato JSON.

Se si suppone che sia il corpo POST, beh, non l’ho mai fatto con jQuery, e quello che hai citato sembra corretto per me leggere i documenti. Se non funziona, dovrei ricontrollare che la struttura degli oggetti è davvero ciò che si aspettano di vedere. Ad esempio, se è solo la convalida di un singolo indirizzo, mi chiedo se si aspetta di ricevere solo un object Address, piuttosto che un object contenente un object Address, ad esempio:

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

Se si suppone che sia il valore di un parametro in noiosi dati di moduli multipart con codifica URL, allora:

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

Ho rimosso il contentType così jQuery tornerà al suo valore predefinito (“application / x-www-form-urlencoded”) e ci assicureremo che la stringa che abbiamo creato sopra sia correttamente codificata in quel tipo di contenuto. Dovrai scoprire il paramname da usare (forse “Indirizzo” e vedere il mio commento precedente sull’invio di solo l’indirizzo, piuttosto che un object che contiene un object figlio di indirizzo?).

JSON.stringify prenderà un object javascript e lo trasformsrà in una stringa. Scommetto però che se si crea un object Javascript come

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

e quindi passare in jsonData come “dati” nella chiamata ajax, quindi convertirà l’object in testo json per te.

Vorrei creare un object javascript e quindi chiamare JSON.stringify per trasformarlo in JSON valido. Puoi scaricarlo da qui .

Potresti fare qualcosa del genere:

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

Devi passarlo in questo modo:

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

Dai un’occhiata a questo articolo per maggiori dettagli: 3 errori da evitare quando usi jQuery con ASP.NET AJAX

Tutte le scuse se questa risposta arriva troppo tardi, o è una duplicazione.

Da quello che ho capito, sembra che tu stia cercando di inviare solo la stringa di un object JSON. Prova a creare un object e poi a lavorare con le sue proprietà e invialo così com’è.

Esempio:

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

Ottieni un plugin jQuery in grado di convertire qualsiasi object javascript in json. Per esempio:

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