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

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

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

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

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

当前回答

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

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

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

其他回答

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

它添加了两个函数:$. tojson (value), $. tojson (value)。parseJSON (json_str[安全])。

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

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

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

最好的方法是包含JSON对象的填充。

但是如果你坚持在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);

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。如果还没有定义,就解析它们,保持任何浏览器本机实现不变。

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