在jQuery中序列化为JSON
我需要序列化一个对象到JSON。 我正在使用jQuery。 有没有一个“标准”的方式来做到这一点?
我的具体情况:我有一个数组定义如下所示:
var countries = new Array(); countries[0] = 'ga'; countries[1] = 'cd'; ...
我需要把它变成一个string传递给$.ajax()
像这样:
$.ajax({ type: "POST", url: "Concessions.aspx/GetConcessions", data: "{'countries':['ga','cd']}", ...
JSON-js – JavaScript中的JSON。
要将对象转换为string,请使用JSON.stringify
:
var json_text = JSON.stringify(your_object, null, 2);
要将JSONstring转换为对象,请使用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
如果尚未定义的话),从而使浏览器本机实现保持不变。
我一直在使用jQuery的json的6个月,它很好。 使用非常简单:
var myObj = {foo: "bar", "baz": "wockaflockafliz"}; $.toJSON(myObj); // Result: {"foo":"bar","baz":"wockaflockafliz"}
适用于IE8 +
不需要jQuery,使用:
JSON.stringify(countries);
我没有使用它,但你可能想尝试由马克·吉布森写的jQuery插件
它添加了两个函数: $.toJSON(value)
, $.parseJSON(json_str, [safe])
。
不,序列化为JSON的标准方法是使用现有的JSON序列化库。 如果你不想这样做,那么你将不得不编写自己的序列化方法。
如果你想要如何做到这一点的指导,我会build议检查一些可用库的来源。
编辑:我不会出来说,写你自己的serliazation方法是不好的,但你必须考虑,如果你的应用程序使用格式良好的JSON是重要的,那么你必须权衡的开销“一个依赖性“,以防止您的自定义方法有一天会遇到您没有预料到的失败案例。 您的电话是否可以接受。
我确实find了这个地方。 不记得虽然…可能在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; };
如果你不想使用外部库,那么就存在.toSource()
本地JavaScript方法,但它不是完全跨浏览器的。
最好的方法是包含JSON对象的polyfill。
但是,如果你坚持在jQuery命名空间中创build一个将对象序列化为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);
是的,你应该在调用$ .ajax之前应该JSON.stringify和JSON.parse你的“Json_PostData”
$就({ url:post_http_site, 键入:“POST”, 数据:JSON.parse(JSON.stringify(Json_PostData)), caching:假, 错误:函数(xhr,ajaxOptions,thrownError){ alert(“写json项目,Ajax错误!”+ xhr.status +“error =”+ thrownError +“xhr.responseText =”+ xhr.responseText); }, 成功:function(数据){ 警报(“写json项目,Ajax确定”); } });
上面的解决scheme没有考虑到的一件事是,如果你有一个input数组,但只有一个值被提供。
例如,如果后端需要一群人,但在这种特殊情况下,你只需要处理一个人。 然后做:
<input type="hidden" name="People" value="Joe" />
然后用以前的解决scheme,它会映射到像这样的东西:
{ "People" : "Joe" }
但它应该真的映射到
{ "People" : [ "Joe" ] }
要解决这个问题,input应该如下所示:
<input type="hidden" name="People[]" value="Joe" />
你会使用以下function(基于其他解决scheme,但扩展了一点)
$.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; };
这基本上是两个步骤:
首先,你需要像这样串起来
var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);
之后,您需要将该string转换为Object
var obj = JSON.parse(JSON_VAR);