提问人:Herb Caudill 提问时间:10/10/2008 最后编辑:ZachHerb Caudill 更新时间:4/19/2020 访问量:928156
在 jQuery 中序列化为 JSON [duplicate]
Serializing to JSON in jQuery [duplicate]
问:
我需要将对象序列化为 JSON。我正在使用jQuery。有没有“标准”的方法可以做到这一点?
我的具体情况:我定义了一个数组,如下所示:
var countries = new Array();
countries[0] = 'ga';
countries[1] = 'cd';
...
我需要把它变成一个字符串来传递给$.ajax(),
如下所示:
$.ajax({
type: "POST",
url: "Concessions.aspx/GetConcessions",
data: "{'countries':['ga','cd']}",
...
答:
我没有使用过它,但你可能想尝试一下 Mark Gibson 编写的 jQuery 插件
它添加了两个函数:、。$.toJSON(value)
$.parseJSON(json_str, [safe])
评论
$.parseJSON
否,序列化为 JSON 的标准方法是使用现有的 JSON 序列化库。如果您不想这样做,那么您将不得不编写自己的序列化方法。
如果你需要有关如何执行此操作的指导,我建议您检查一些可用库的源代码。
编辑:我不打算说编写自己的 serliazation 方法不好,但您必须考虑,如果使用格式良好的 JSON 对您的应用程序很重要,那么您必须权衡“多一个依赖项”的开销与您的自定义方法有一天可能会遇到您没有预料到的失败情况的可能性。这种风险是否可接受是你的决定。
评论
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 的应用程序转移到 Crockford 的 json2.js。它完全是 与 ECMAScript 5 兼容 规范并优雅降级 如果是原生(更快!)实现 存在。
事实上,我昨天刚刚在jQuery中进行了更改,该更改利用了 JSON.parse 方法(如果存在),现在 它已经完全指定了。
我倾向于相信他所说的关于JavaScript的言论:)
所有现代浏览器(以及许多不古老的旧浏览器)都原生支持 JSON 对象。当前版本的 Crockford 的 JSON 库将仅定义 并且尚未定义,则保留任何浏览器本机实现。JSON.stringify
JSON.parse
评论
JSON.stringify(obj, function(key, val) { if (val instanceof SVGSVGElement) {return val.xml || new XMLSerializer().serializeToString(val);} return val;})
如果你不想使用外部库,可以使用原生的 JavaScript 方法,但它并不是完全跨浏览器的。.toSource()
我确实在某个地方找到了这个。不记得在哪里了......可能在 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;
};
评论
var data = "" + $.toJSON($('form').serializeObject());
alert(typeof data);
alert(data);
Valid JSON
$.toJSON is not a function
<script src="http://www.x-non.com/json/jquery.json-2.4.min.js"> </script>
$.toJSON
JSON.stringify
我已经使用 jquery-json 6 个月了,效果很好。使用起来非常简单:
var myObj = {foo: "bar", "baz": "wockaflockafliz"};
$.toJSON(myObj);
// Result: {"foo":"bar","baz":"wockaflockafliz"}
评论
无需jQuery,使用:
JSON.stringify(countries);
上述解决方案没有考虑的一件事是,如果您有一个输入数组,但只提供了一个值。
例如,如果后端需要一组人员,但在这种特殊情况下,您只是在处理一个人。然后做:
<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;
};
最好的方法是包含 JSON 对象的 polyfill。
但是,如果您坚持在 jQuery 命名空间内创建一个将对象序列化为 JSON 表示法(JSON 的有效值)的方法,则可以执行如下操作:
实现
// 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));
用法
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);
这基本上是两步过程:
首先,你需要像这样字符串化:
var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);
之后,您需要将 转换为:string
Object
var obj = JSON.parse(JSON_VAR);
是的,您应该在致电之前:JSON.stringify
JSON.parse
Json_PostData
$.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");
}
});
评论
countries