我需要将一个对象序列化为JSON。我用的是jQuery。是否有一个“标准”的方法来做到这一点?

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

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

我需要把它变成一个字符串传递给$.ajax()像这样:

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

当前回答

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

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

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

其他回答

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。解析方法,如果它存在,现在 它已经被完全指定了。

我倾向于相信他所说的JavaScript的重要性:)

所有现代浏览器(以及许多不太古老的旧浏览器)都支持JSON对象。当前版本的Crockford JSON库将只定义JSON。stringify和JSON。如果还没有定义,就解析它们,保持任何浏览器本机实现不变。

不,序列化到JSON的标准方法是使用现有的JSON序列化库。如果您不希望这样做,那么您将不得不编写自己的序列化方法。

如果您需要关于如何做到这一点的指导,我建议检查一些可用库的源代码。

编辑:我并不是说编写自己的serliazation方法不好,但是您必须考虑到,如果使用格式良好的JSON对您的应用程序很重要,那么您必须权衡“多一个依赖项”的开销与自定义方法可能有一天遇到您没有预料到的失败情况的可能性。这种风险是否可接受由你决定。

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

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

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

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

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

例如,如果后端期望一个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;
};