javascript - jQuery中序列化为JSon

  显示原文与译文双语对照的内容

我需要将一个对象序列化为 JSON 。 我使用的是 jQuery 。有"标准"的方法?

我的具体情况:我有一个类似这样的数组:


var countries = new Array();
countries[0] = 'ga';
countries[1] = 'cd';
...

我需要把它转换成一个字符串,这样才能传递给 $.ajax():


$.ajax({
 type:"POST",
 url:"Concessions.aspx/GetConcessions",
 data:"{'countries':['ga','cd']}",
...

时间:

JSON-js - JavaScript中的JSON 。

要将对象转换为字符串,请使用 JSON.stringify:


var json_text = JSON.stringify(your_object, null, 2);

要将JSON字符串转换为对象,请使用 JSON.parse:


var your_object = JSON.parse(json_text);

最近由 John Resig 推荐:

。请开始JSON-using应用程序迁移到 json2.js. crockford与ecmascript 5规范完全兼容,优雅地降解如果本机( 更快) 实现存在。

事实上,我昨天刚刚在jQuery中登陆了一个改变,如果它存在的话,使用 JSON.parse 方法。

我倾向于相信他在JavaScript问题上所说的:

更新的浏览器支持 JSON对象。 crockford库的当前版本的JSON只定义了 JSON.stringifyJSON.parse,如果它们还没有定义的话,就会保留任何浏览器原生实现。

我已经使用了 jquery-json 6个月,它工作很好。 使用非常简单:


var myObj = {foo:"bar","baz":"wockaflockafliz"};
$.toJSON(myObj);

//Result: {"foo":"bar","baz":"wockaflockafliz"}

我没有使用过它,但你可能想尝试 jquery插件作者马克·吉布森

它添加了两个函数: $.toJSON(value)$.parseJSON(json_str, [safe])

我在某处找到了这个。 无法记住位置。。可能在 StackOverflow: ) 上


$.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;
};

上面的解决方案没有考虑到的一点是,如果你有一个输入数组,但只提供一个值。

例如如果后端需要一个人数组,但在这个特定的情况下,你只处理一个人。 然后执行以下操作:


<input type="hidden" name="People" value="Joe"/>

然后,使用前面的解决方案,它将映射到类似以下内容:


{
"People" :"Joe"
}

但它真的应该映射到


{
"People" : ["Joe" ]
}

要解决这个问题,输入应该如下所示:


<input type="hidden" name="People[]" value="Joe"/>

你将使用以下函数( 基于其他解决方案,但扩展一点)


$.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;
};

最好的方法是将polyfill包含在 JSON 对象中。

但是,如果你坚持创建一个方法,将对象序列化为jQuery命名空间内的JSON表示法( 的有效值),你可以执行如下操作:

实现


(function (global, $) {
 var _iterator, _stringify, _toString, _primitive, _object;

 if (window.JSON && typeof JSON.stringify ==="function")
 return $.stringify = JSON.stringify;

 _toString = Object.prototype.toString;
 _primitive =/string|number|boolean|null/;
 _object ="[object Object]";

//creates the closure
 _iterator = function (items) {
 return function (key, value) {
 var prop =""" + key +"":",
 type = $.type(value);

//key is the index on an array
 if (typeof key ==="number") prop ="";
 if (type ==="string") {
 prop +=""" + value +""";
 }
 else if (_primitive.test(type)) {
 prop += value;
 }
 else if (type ==="array") {
 prop += _stringify(value, true);
 }
 else if (_toString.call(value) === _object) {
 prop += _stringify(value);
 }
 else return;
 items.push(prop);
 }
 };

//internal implementation
 _stringify = function (obj, isArray) {
 var items = [], brackets = ["{","}"];
 if (isArray) brackets = ["[","]"];
//let the _iterator closure take place
 $.each(obj, _iterator(items));
 return brackets[0] + items.join(",") + brackets[1];
 };

//creates the method in the jQuery namespace
 $.stringify = function () {
 if (!arguments.length) return"";
 var dummy, obj = arguments[0];
//if obj is a primitive value 
 if (_primitive.test($.type(obj))) {
 _iterator(dummy = [])(0, obj);
 return dummy.join("");
 }
 return _stringify.call(null, obj, obj instanceof Array);
 }
}(window, jQuery));

用法


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 = $.stringify(myObject);
console.log(json);

...