Enviar datos JSON con jQuery
¿ Por qué el código siguiente envió datos en City=Moscow&Age=25
lugar del formato JSON?
var arr = {City:'Moscow', Age:25};
$.ajax(
{
url: "Ajax.ashx",
type: "POST",
data: arr,
dataType: 'json',
async: false,
success: function(msg) {
alert(msg);
}
}
);
Porque no ha especificado ni el tipo de contenido de la solicitud ni la solicitud JSON correcta. Esta es la forma correcta de enviar una solicitud JSON:
var arr = { City: 'Moscow', Age: 25 };
$.ajax({
url: 'Ajax.ashx',
type: 'POST',
data: JSON.stringify(arr),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: false,
success: function(msg) {
alert(msg);
}
});
Cosas a tener en cuenta:
- Uso del
JSON.stringify
método para convertir un objeto javascript en una cadena JSON que es nativa e integrada en los navegadores modernos. Si desea admitir navegadores más antiguos, es posible que deba incluir json2.js - Especificación del tipo de contenido de la solicitud utilizando la
contentType
propiedad para indicar al servidor la intención de enviar una solicitud JSON - La
dataType: 'json'
propiedad se utiliza para el tipo de respuesta que espera del servidor. jQuery es lo suficientemente inteligente como para adivinarlo a partir delContent-Type
encabezado de respuesta del servidor. Entonces, si tiene un servidor web que respeta más o menos el protocolo HTTP y responde aContent-Type: application/json
su solicitud, jQuery analizará automáticamente la respuesta en un objeto javascript en lasuccess
devolución de llamada para que no necesite especificar ladataType
propiedad.
Cosas con las que tener cuidado:
- Lo que llamas no
arr
es una matriz . Es un objeto javascript con propiedades (City
yAge
). Las matrices se indican con[]
en javascript. Por ejemplo[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]
, es una matriz de 2 objetos.
Porque, de forma predeterminada, jQuery serializa los objetos pasados como data
parámetro a $.ajax
. Se utiliza $.param
para convertir los datos en una cadena de consulta.
De los documentos jQuery para $.ajax
:
[el
data
argumento] se convierte en una cadena de consulta, si aún no es una cadena
Si desea enviar JSON, deberá codificarlo usted mismo:
data: JSON.stringify(arr);
Tenga en cuenta que JSON.stringify
sólo está presente en los navegadores modernos. Para soporte heredado, busque json2.js
Escribí una breve función de conveniencia para publicar JSON.
$.postJSON = function(url, data, success, args) {
args = $.extend({
url: url,
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: true,
success: success
}, args);
return $.ajax(args);
};
$.postJSON('test/url', data, function(result) {
console.log('result', result);
});
Debe establecer el tipo de contenido correcto y cadenar su objeto.
var arr = {City:'Moscow', Age:25};
$.ajax({
url: "Ajax.ashx",
type: "POST",
data: JSON.stringify(arr),
dataType: 'json',
async: false,
contentType: 'application/json; charset=utf-8',
success: function(msg) {
alert(msg);
}
});