c# - ¿Cómo construyo un objeto JSON para enviar a un WebService de AJAX?
javascript jquery (7)
Después de tratar de formatear mis datos JSON a mano en JavaScript y fallar miserablemente, me di cuenta de que probablemente haya una mejor manera. Aquí se muestra el aspecto del código del método de servicio web y las clases relevantes en 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;
}
El servicio web funciona muy bien con el uso de SOAP / XML, pero parece que no puedo obtener una respuesta válida usando javascript y jQuery porque el mensaje que recibo del servidor tiene un problema con mi JSON codificado a mano.
No puedo usar la función jQuery getJSON
porque la solicitud requiere HTTP POST, así que estoy usando la función ajax
nivel inferior en su lugar:
$.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 función ajax
está enviando todo lo especificado en los data:
es donde está mi problema. ¿Cómo creo un objeto JSON formateado correctamente en JavaScript para que pueda conectarlo a mi llamada ajax
manera:
data: theRequest
Eventualmente sacaré datos de las entradas de texto en formularios, pero por ahora los datos de las pruebas codificadas están bien.
¿Cómo creo un objeto JSON formateado correctamente para enviarlo al servicio web?
ACTUALIZACIÓN: Resultó que el problema con mi solicitud no era el formato del JSON, como señaló TJ, sino que el texto de JSON no se ajustaba a los requisitos del servicio web. Aquí hay una solicitud JSON válida basada en el código en el WebMethod:
''{"request":{"Address":{"Address1":"123 Main Street","Address2":"suite 20","City":"New York","State":"NY","Zip":"10000","AddressClassification":null}}}''
Esto planteó otra pregunta: ¿ cuándo es importante la sensibilidad de mayúsculas y minúsculas en las solicitudes JSON a los servicios web ASP.NET (ASMX)?
Crearía un objeto javascript y luego llamaría a JSON.stringify para convertirlo en JSON válido. Puedes descargarlo desde aquí .
Podrías hacer algo como esto:
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);
}
});
Necesitas pasarlo así:
$.ajax({
type: "POST",
url: "WebService.asmx/WebMethodName",
data: "{''fname'':''dave'', ''lname'':''ward''}",
contentType: "application/json; charset=utf-8",
dataType: "json"
});
Eche un vistazo a este artículo para obtener más información: 3 errores que debe evitar al usar jQuery con ASP.NET AJAX
Obtenga un plugin jquery que pueda convertir cualquier objeto javascript en json. Por ejemplo:
Todas las disculpas si esta respuesta llega demasiado tarde, o es una duplicación.
Por lo que entiendo, parece como si estuvieras tratando de enviar solo la cadena de un objeto JSON. Intente construir un objeto y luego trabajar con sus propiedades y enviarlo tal como está.
Ejemplo:
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);
}
});
Tu problema se divide en dos partes:
Creando la cadena JSON
Su JSON en su código entre comillas es perfectamente válido. Pero ser hecho a mano es un dolor. Como otros han llamado, la forma más fácil de hacerlo es crear un objeto Javascript y luego JSON.stringify
. Ejemplo:
var data = {
"Address": {
"Address1": "123 Main Street",
"Address2": null,
"City": "New York",
"State": "NY",
"Zip": "10000",
"AddressClassification": null
}
};
data = JSON.stringify(data);
El primer paso anterior crea un objeto utilizando la notación literal de objetos Javascript, que es un superconjunto de JSON (como se utilizó anteriormente, en realidad es lo mismo que JSON, pero ignore eso). El segundo bit toma ese objeto y lo convierte en una cadena.
Por supuesto, los valores anteriores son cadenas literales, lo cual es poco probable. Esto es lo que se vería si tuviera cada uno de esos valores en una variable:
var data = {
"Address": {
"Address1": address1,
"Address2": address2,
"City": city,
"State": state,
"Zip": zip,
"AddressClassification": null
}
};
data = JSON.stringify(data);
De cualquier manera, ahora tienes la cadena.
Envío de la cadena JSON al servicio web
Necesita averiguar si el servicio web espera que los datos con formato JSON sean el cuerpo POST, o si espera que los datos JSON sean el valor de un parámetro en los datos POST codificados por URL = nombre = valor más comunes. Tiendo a esperar lo primero, porque el servicio web parece específicamente diseñado para trabajar con datos formateados en JSON.
Si se supone que es el cuerpo POST, bueno, nunca he hecho eso con jQuery, y lo que has citado me parece correcto al leer los documentos. Si no funciona, verificaría que tu estructura de objetos sea realmente lo que esperan ver. Por ejemplo, si solo está validando una sola dirección, me pregunto si espera recibir solo un objeto Address, en lugar de un objeto que contenga un objeto Address, por ejemplo:
{
"Address1": "123 Main Street",
"Address2": null,
"City": "New York",
"State": "NY",
"Zip": "10000",
"AddressClassification": null
}
Si se supone que es el valor de un parámetro en datos antiguos aburridos de formularios multiparte codificados en URL, entonces:
$.ajax({
type: "POST",
url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
data: "paramname=" + encodeURIComponent(data),
dataType: "json",
success: function(response){
alert(response);
}
})
He eliminado el contentType
para que jQuery vuelva a su estado predeterminado ("application / x-www-form-urlencoded") y asegure que la cadena que creamos arriba está codificada correctamente en ese tipo de contenido. Necesitarás encontrar el paramname
de paramname
a usar (tal vez "Dirección" y ver mi comentario anterior sobre enviar solo la dirección, en lugar de un objeto que contiene un objeto hijo de dirección?).
JSON.stringify tomará un objeto javascript y lo convertirá en una cadena. Apuesto a que si creas un objeto Javascript como
var jsonData = {
address: ''address'',
address1: ''address1'',
address2: ''address2''
};
y luego pasa jsonData como ''datos'' en la llamada ajax, luego convertirá el objeto en texto json para ti.
La respuesta es muy sencilla y se basa en mis publicaciones anteriores. ¿Puedo devolver JSON desde un servicio web .asmx si el ContentType no es JSON? y JQuery ajax llama a httpget webmethod (c #) no funciona .
Los datos deben estar codificados con JSON. Debe separar codificar cada parámetro de entrada. Como solo tiene un parámetro, debe hacer lo siguiente:
primero construya sus datos como datos 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"}}};
luego da como parámetro de la solicitud 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);
}
})
en lugar de $ .toJSON que provienen del complemento JSON, puede usar otra versión (JSON.stringify) de http://www.json.org/
Si su WebMethod tenía parámetros como
public Response ValidateAddress(Request request1, Request myRequest2)
el valor del parámetro de data
de la llamada ajax
debería ser como
data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)}
o
data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)}
si prefieres otra versión del codificador JSON.