javascript - print - Serialización a JSON en jQuery
return json javascript (11)
Esta pregunta ya tiene una respuesta aquí:
- Serialización de un objeto a JSON 3 respuestas
Necesito serializar un objeto a JSON. Estoy usando jQuery. ¿Hay una manera "estándar" de hacer esto?
Mi situación específica: tengo una matriz definida como se muestra a continuación:
var countries = new Array();
countries[0] = ''ga'';
countries[1] = ''cd'';
...
y necesito convertir esto en una cadena para pasar a $.ajax()
como esto:
$.ajax({
type: "POST",
url: "Concessions.aspx/GetConcessions",
data: "{''countries'':[''ga'',''cd'']}",
...
Encontré esto en alguna parte. No recuerdo dónde, aunque ... probablemente en :)
$.fn.serializeObject = function(){
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '''');
} else {
o[this.name] = this.value || '''';
}
});
return o;
};
Es básicamente un proceso de 2 pasos:
En primer lugar, necesitas unirte así.
var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);
Después de eso, necesitas convertir la cadena a Objeto
var obj = JSON.parse(JSON_VAR);
He estado usando jquery-json durante 6 meses y funciona muy bien. Es muy simple de usar:
var myObj = {foo: "bar", "baz": "wockaflockafliz"};
$.toJSON(myObj);
// Result: {"foo":"bar","baz":"wockaflockafliz"}
La mejor manera es incluir el polyfill para el objeto JSON-js .
Pero si insiste en crear un método para serializar un objeto a notación JSON ( valores válidos para JSON ) dentro del espacio de nombres jQuery, puede hacer algo como esto:
Implementación
// This is a reference to JSON.stringify and provides a polyfill for old browsers.
// stringify serializes an object, array or primitive value and return it as JSON.
jQuery.stringify = (function ($) {
var _PRIMITIVE, _OPEN, _CLOSE;
if (window.JSON && typeof JSON.stringify === "function")
return JSON.stringify;
_PRIMITIVE = /string|number|boolean|null/;
_OPEN = {
object: "{",
array: "["
};
_CLOSE = {
object: "}",
array: "]"
};
//actions to execute in each iteration
function action(key, value) {
var type = $.type(value),
prop = "";
//key is not an array index
if (typeof key !== "number") {
prop = ''"'' + key + ''":'';
}
if (type === "string") {
prop += ''"'' + value + ''"'';
} else if (_PRIMITIVE.test(type)) {
prop += value;
} else if (type === "array" || type === "object") {
prop += toJson(value, type);
} else return;
this.push(prop);
}
//iterates over an object or array
function each(obj, callback, thisArg) {
for (var key in obj) {
if (obj instanceof Array) key = +key;
callback.call(thisArg, key, obj[key]);
}
}
//generates the json
function toJson(obj, type) {
var items = [];
each(obj, action, items);
return _OPEN[type] + items.join(",") + _CLOSE[type];
}
//exported function that generates the json
return function stringify(obj) {
if (!arguments.length) return "";
var type = $.type(obj);
if (_PRIMITIVE.test(type))
return (obj === null ? type : obj.toString());
//obj is array or object
return toJson(obj, type);
}
}(jQuery));
Uso
var myObject = {
"0": null,
"total-items": 10,
"undefined-prop": void(0),
sorted: true,
images: ["bg-menu.png", "bg-body.jpg", [1, 2]],
position: { //nested object literal
"x": 40,
"y": 300,
offset: [{ top: 23 }]
},
onChange: function() { return !0 },
pattern: /^bg-.+/.(?:png|jpe?g)$/i
};
var json = jQuery.stringify(myObject);
console.log(json);
No lo he usado, pero es posible que desee probar el complemento jQuery escrito por Mark Gibson
Agrega las dos funciones: $.toJSON(value)
, $.parseJSON(json_str, [safe])
.
No, la forma estándar de serializar a JSON es usar una biblioteca de serialización JSON existente. Si no desea hacer esto, tendrá que escribir sus propios métodos de serialización.
Si desea orientación sobre cómo hacer esto, sugeriría examinar la fuente de algunas de las bibliotecas disponibles.
EDITAR: No voy a salir y decir que escribir sus propios métodos de serliazación es malo, pero debe tener en cuenta que si es importante para su aplicación utilizar un JSON bien formado, debe sopesar los gastos generales de "uno más". dependencia "frente a la posibilidad de que sus métodos personalizados puedan algún día encontrar un caso de falla que no había anticipado. Si ese riesgo es aceptable es su decisión.
Sí, debes JSON.stringify y JSON.parse tu "Json_PostData" antes de llamar a $ .ajax
$.ajax({
url: post_http_site,
type: "POST",
data: JSON.parse(JSON.stringify(Json_PostData)),
cache: false,
error: function (xhr, ajaxOptions, thrownError) {
alert(" write json item, Ajax error! " + xhr.status + " error =" + thrownError + " xhr.responseText = " + xhr.responseText );
},
success: function (data) {
alert("write json item, Ajax OK");
}
});
Si no desea utilizar bibliotecas externas, existe el método de JavaScript nativo .toSource()
, pero no es perfectamente .toSource()
con todos los navegadores.
Una cosa que las soluciones anteriores no tienen en cuenta es si tiene una serie de entradas pero solo se proporcionó un valor.
Por ejemplo, si el back-end espera una gran cantidad de personas, pero en este caso particular, solo tratas con una sola persona. Entonces haciendo:
<input type="hidden" name="People" value="Joe" />
Luego, con las soluciones anteriores, se asignaría a algo como:
{
"People" : "Joe"
}
Pero realmente debería asignar a
{
"People" : [ "Joe" ]
}
Para arreglar eso, la entrada debe verse como:
<input type="hidden" name="People[]" value="Joe" />
Y usaría la siguiente función (basada en otras soluciones, pero extendida un poco)
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (this.name.substr(-2) == "[]"){
this.name = this.name.substr(0, this.name.length - 2);
o[this.name] = [];
}
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '''');
} else {
o[this.name] = this.value || '''';
}
});
return o;
};
JSON-js - JSON en JavaScript.
Para convertir un objeto en una cadena, use JSON.stringify
:
var json_text = JSON.stringify(your_object, null, 2);
Para convertir una cadena JSON en objeto, use JSON.parse
:
var your_object = JSON.parse(json_text);
Recientemente fue recomendado por John Resig :
... POR FAVOR, comience a migrar sus aplicaciones que usan JSON a json2.js de Crockford. Es totalmente compatible con la especificación ECMAScript 5 y se degrada con gracia si existe una implementación nativa (¡más rápida!).
De hecho, ayer encontré un cambio en jQuery que utiliza el método JSON.parse, si existe, ahora que se ha especificado por completo.
Tiendo a confiar en lo que dice sobre asuntos de JavaScript :)
Los navegadores más nuevos admiten el objeto JSON de forma nativa. La versión actual de la biblioteca JSON de Crockford solo definirá JSON.stringify
y JSON.parse
si aún no están definidas, dejando intacta cualquier implementación nativa del navegador.