在jQuery中序列化到JSON

我需要序列化一个对象到JSON。我正在使用jQuery。有没有“标准”的方法来做到这一点?

我的具体情况:我有一个数组定义如下:

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

我需要把它变成一个字符串传递给#0,就像这样:

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

我没有用过,但你可能想试试由Mark Gibson编写的jQuery插件

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

不,序列化为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);

它最近被johnresig推荐:

…请开始迁移将您的JSON应用程序转移到Crockford的json2.js.完全与ECMAScript 5兼容规范并优雅地降级如果原生(更快!)实现存在。

事实上,我昨天刚刚登陆了jQuery的一个变化,它利用了JSON.parse方法如果存在,现在它已被完全指定。

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

所有现代浏览器(以及许多并非古老的旧版本)原生支持JSON对象。Crockford的JSON库的当前版本将仅定义JSON.stringifyJSON.parse,如果它们尚未定义,则不会保留任何浏览器原生实现。

如果你不想使用外部库,有.toSource()原生JavaScript方法,但它不是完美的跨浏览器。

我确实在某个地方找到了这个。虽然不记得在哪里…可能是在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;};

我已经使用jquery-json 6个月了,效果很好。使用起来非常简单:

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

适用于IE8+

不需要jQuery,使用:

JSON.stringify(countries);

上述解决方案没有考虑的一件事是,如果您有一个输入数组,但只提供了一个值。

例如,如果后端期望一个People数组,但在这个特定情况下,你只是在处理一个人。然后执行:

<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对象的Poly填充。

但是如果你坚持在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 iterationfunction action(key, value) {var type = $.type(value),prop = "";
//key is not an array indexif (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 arrayfunction each(obj, callback, thisArg) {for (var key in obj) {if (obj instanceof Array) key = +key;callback.call(thisArg, key, obj[key]);}}
//generates the jsonfunction toJson(obj, type) {var items = [];each(obj, action, items);return _OPEN[type] + items.join(",") + _CLOSE[type];}
//exported function that generates the jsonreturn 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 objectreturn 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);

这基本上是两个步骤的过程:

首先,你需要像这样使用stringify:

var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);

之后,您需要将string转换为Object

var obj = JSON.parse(JSON_VAR);

是的,你应该在调用$.ajax之前JSON.stringifyJSON.parse你的Json_PostData

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