1229

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

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

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

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

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

11 回答 11

1155

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.stringifyJSON.parse如果尚未定义,则保留任何浏览器本机实现不变。

于 2009-05-26T19:22:40.907 回答
186

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

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

// Result: {"foo":"bar","baz":"wockaflockafliz"}
于 2011-06-01T21:40:58.990 回答
101

适用于 IE8+

不需要 jQuery,使用:

JSON.stringify(countries); 
于 2011-08-29T06:57:32.720 回答
46

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

它增加了两个功能:$.toJSON(value), $.parseJSON(json_str, [safe])

于 2008-10-10T15:35:52.573 回答
37

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

如果您需要有关如何执行此操作的指导,我建议您检查一些可用库的来源。

编辑:我不会出来说编写自己的序列化方法不好,但是您必须考虑,如果使用格式良好的 JSON 对您的应用程序很重要,那么您必须权衡“再一个依赖”以防止您的自定义方法有一天可能会遇到您没有预料到的失败案例。这种风险是否可以接受是你的决定。

于 2008-10-10T15:47:13.173 回答
30

我确实在某个地方找到了这个。不记得在哪里……可能在 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;
};
于 2011-01-02T07:57:40.227 回答
11

如果您不想使用外部库,则可以使用.toSource()本机 JavaScript 方法,但它不是完美的跨浏览器。

于 2009-12-01T21:44:16.797 回答
11

是的,你应该 JSON.stringifyJSON.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");

        } 
});
于 2016-03-24T03:50:13.320 回答
10

最好的方法是包含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);
于 2015-04-11T05:50:05.573 回答
10

它基本上是两步过程:

首先,您需要像这样进行字符串化:

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

之后,您需要将其转换stringObject

var obj = JSON.parse(JSON_VAR);
于 2015-06-29T13:21:03.170 回答
7

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

例如,如果后端需要一个 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;
};
于 2014-06-18T15:49:43.043 回答