Enviar datos JSON con jQuery

Resuelto Neir0 asked hace 13 años • 5 respuestas

¿ Por qué el código siguiente envió datos en City=Moscow&Age=25lugar 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);
        }
    }
);
Neir0 avatar Jul 06 '11 01:07 Neir0
Aceptado

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.stringifymé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 contentTypepropiedad 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 del Content-Typeencabezado de respuesta del servidor. Entonces, si tiene un servidor web que respeta más o menos el protocolo HTTP y responde a Content-Type: application/jsonsu solicitud, jQuery analizará automáticamente la respuesta en un objeto javascript en la successdevolución de llamada para que no necesite especificar la dataTypepropiedad.

Cosas con las que tener cuidado:

  • Lo que llamas no arres una matriz . Es un objeto javascript con propiedades ( Cityy Age). Las matrices se indican con []en javascript. Por ejemplo [{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }], es una matriz de 2 objetos.
Darin Dimitrov avatar Jul 05 '2011 18:07 Darin Dimitrov

Porque, de forma predeterminada, jQuery serializa los objetos pasados ​​como dataparámetro a $.ajax. Se utiliza $.parampara convertir los datos en una cadena de consulta.

De los documentos jQuery para $.ajax:

[el dataargumento] 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.stringifysólo está presente en los navegadores modernos. Para soporte heredado, busque json2.js

lonesomeday avatar Jul 05 '2011 18:07 lonesomeday

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);
});
Aram Kocharyan avatar Oct 22 '2013 11:10 Aram Kocharyan

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);
    }
});
Amrit avatar Jul 05 '2011 18:07 Amrit