2009-11-17 26 views
54

Estoy tratando de poner algunos datos formateados JSON a través de Ajax con jQuery a un servidor. Mi código es el siguiente:jQuery - ¿Cómo PONER JSON a través de Ajax?

$.ajax({ 
    type: "PUT", 
    url: myURL, 
    contentType: "application/json", 
    data: {"data": "mydata"} 
}); 

Pero en el lado del servidor, recibo una cadena data=mydata, en lugar de la esperada JSON. Firebug me dice lo mismo.

¿Dónde está el error?

+0

¿Qué estás usando en el lado del servidor? –

+0

Uso Couchdb que espera JSON. –

+6

AJAX PUT * está * disponible en todos los principales navegadores. HTTP PUT no lo es. Entonces, en este caso, está bien (recomendado, incluso) usar PUT. –

Respuesta

46

Creo que los datos deben ser un String. Los objetos se convierten en cadenas de consulta, que es lo que está viendo aquí.

Puede usar el método JSON.stringify(obj) para convertir su Objeto en una Cadena. El código para el objeto JSON está disponible en: https://github.com/douglascrockford/JSON-js/blob/master/json2.js.

O bien, pase el código que está utilizando para crear el objeto como una Cadena literal, pero me imagino que esto es solo un ejemplo y querrá codificar algún objeto que ya haya creado.

+1

Esta es la forma en que @Juri debería ir si quiere JSON en el servidor. Uso la biblioteca json2.js todo el tiempo y funciona muy bien. –

+3

sería bueno si jQuery fuera a codificar los datos, tal como lo hace con POST. – neoneye

+1

Enlace actualizado: https://github.com/douglascrockford/JSON-js/blob/master/json2.js – Ben

30

Si siempre tiene que enviar JSON en su aplicación, puede simplemente ejecutar esto en algún lugar de su inicio y luego usar la llamada predeterminada $.ajax como en su ejemplo, y siempre se serializará como una cadena JSON en lugar del valor predeterminado Ajax cadena de consulta.

Aquí utilizo el objeto JSON se mencionó anteriormente:

$.ajaxSetup({ 
    contentType : 'application/json', 
    processData : false 
}); 
$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    if (options.data){ 
     options.data=JSON.stringify(options.data); 
    } 
}); 
1
//url: this is a reference to the XML, where you need to define the mapping. 
//<entry key="/getEmpDetails/transEfileGenerate.app"> 
//<bean class="com.adp.ems.framework.spring.MappingItem" p:delegate-ref="efilePageDelegate" 
//p:action="passJSONObjectAndGetWebServiceOutput" /> 

//str1 is the input JSON that you need to pass... Ajax will automatically take care to get the response. 
//</entry> 

var kw = { 
    url : "getEmpDetails/transEfileGenerate.app", 
    timeout : 30000, 
    handleAs : "json", 
    sync: false, 
    putData : str1, 
    headers: { "Content-Type": "application/json"}, 
    load : function(result) { 
}, 
Cuestiones relacionadas