在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.stringifyJSON.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);