将JS对象转换为JSON字符串

1379

如果我使用以下JS代码定义一个对象:

var j={"name":"binchen"};

我该如何将对象转换为JSON格式?输出的字符串应为:

'{"name":"binchen"}'

77
JSON.stringify()是你要找的方法。 - Gowtham
13
第一次学习时总会有这样的经历。 - Egan Wolf
JSON.stringify 也是复制对象的好方法。 - Justin Meskan
23个回答

2046

所有现代浏览器都内置了本地JSON支持。因此,只要您不处理IE6/7等史前浏览器,就可以像这样轻松地完成:

var j = {
  "name": "binchen"
};
console.log(JSON.stringify(j));


7
为了使 JSON.stringify(j); 起作用,请下载此脚本 - AabinGunz
2
工作在Node.js上,因为Node使用相同的引擎。 - georgelviv
28
这个回答发布于IE9发布一年之前,因此在撰写时,IE8确实是现代浏览器,或者至少是可用的最新版IE。 - Andris
JSON.stringify无法转换嵌套对象。有什么解决方法吗..?? - Ritesh
要精确,j=JSON.stringify(j);var newvar=JSON.stringify(j); - Fanky
11
如果您需要更易读的JSON字符串,可以使用space参数,例如:var formattedJSON = JSON.stringify(j, null, 2); - Jacek Gzel

123

使用 JSON.stringify()。该函数可以在大多数现代浏览器中原生调用,也可以在json2.js中找到。

JSON.stringify(value, replacer, space)
    value       any JavaScript value, usually an object or array.
    replacer    an optional parameter that determines how object
                values are stringified for objects. It can be a
                function or an array of strings.
    space       an optional parameter that specifies the indentation
                of nested structures. If it is omitted, the text will
                be packed without extra whitespace. If it is a number,
                it will specify the number of spaces to indent at each
                level. If it is a string (such as "\t" or " "),
                it contains the characters used to indent at each level.

8
为了更清晰一些:replacer是可选的,因此如果您仍想使用space参数,则可以在replacer中输入null。如果您希望将此函数用于漂亮的打印,我发现这个答案也很有用: https://dev59.com/6W445IYBdhLWcg3wia2V#7220510 - Glenn Lawrence

36

查看Thomas Frank改进后的更新方式:

更新于2008年5月17日:在toObject方法中添加了小型清洁程序。现在,如果它发现任何恶意代码,toObject()将不会对其进行eval()。为了更安全:不要将includeFunctions标志设置为true。

JSON概念之父Douglas Crockford编写了JavaScript的第一个字符串化器。稍后,Trim Path的Steve Yen编写了一个很好的改进版本,我已经使用了一段时间。我想与大家分享的是我对Steve版本所做的更改。基本上,这些更改源于我希望使字符串化器:

  • 处理并恢复循环引用
  • 包括函数/方法的JavaScript代码(作为选项)
  • 必要时排除Object.prototype中的对象成员。

33
你可以使用 JSON.stringify() 方法将 JSON 对象转换为字符串。
var j={"name":"binchen"};
JSON.stringify(j)

要进行反向操作,可以使用JSON.parse() 方法将 JSON 字符串转换为 JSON 对象。


感谢您添加了反向过程。 - David Lavieri

14

JSON.stringify(j, null, 4) 会返回美化后的 JSON 字符串,如果你需要美化的话。

第二个参数是 replacer。它可以被用作过滤器,在将对象转换为字符串时过滤掉某些键值对。如果设置为 null,则会返回所有键值对。


10

在AngularJS中

angular.toJson(obj, pretty);

obj: 要序列化为JSON的输入。

pretty(可选):
如果设置为true,则JSON输出将包含换行符和空格。如果设置为整数,则JSON输出将包含该数量的空格作为缩进。

(默认值:2)


9
如果你使用AngularJS,可以使用“json”过滤器完成此操作:
<span>{{someObject | json}}</span>

9
JSON.stringify将JavaScript对象转换为JSON文本,并将该JSON文本存储在字符串中。
这种转换是从对象到字符串的。 JSON.parse将JSON文本字符串转换为JavaScript对象。
这种转换是从字符串到对象的。
var j={"name":"binchen"};

为了将其转换为JSON字符串,可以使用以下方法。
JSON.stringify({"key":"value"});

JSON.stringify({"name":"binchen"});

您可以参考下面的链接获取更多信息。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


7

有一个自定义方法,直到我们从 stringify 方法中做一些奇怪的操作。

var j={"name":"binchen","class":"awesome"};
var dq='"';
var json="{";
var last=Object.keys(j).length;
var count=0;
for(x in j)
{
json += dq+x+dq+":"+dq+j[x]+dq;
count++;
if(count<last)
   json +=",";
}
json+="}";
document.write(json);

输出

{"name":"binchen","class":"awesome"}

LIVE http://jsfiddle.net/mailmerohit5/y78zum6v/


1
不会转义带引号的字符串,比如:"a " in a string" - alphakevin
2
那段自定义代码非常不完整。它不支持数组、对象和特殊字符。例如:json {"arr":["1", "2", "3"],"obj":{"a":"b"},"key"with\special}chars":"value"} 的输出结果将是 {"arr":"1,2,3","obj":"[object Object]","key"with\special}chars":"value"},这是错误的! - Manuel Romeiro
当然,这段代码只是一个玩弄代码的例子..我们应该始终使用stringify...JS已经为我们完成了工作。 - Rohit Kumar

7

我遇到了stringify内存不足的问题,而其他解决方案似乎都不起作用(至少我无法让它们起作用),这就是我偶然发现了这个帖子的原因。感谢Rohit Kumar,我只需要迭代我的非常大的JSON对象,就可以防止它崩溃。

var j = MyObject;
var myObjectStringify = "{\"MyObject\":[";
var last = j.length
var count = 0;
for (x in j) {
    MyObjectStringify += JSON.stringify(j[x]);
    count++;
    if (count < last)
        MyObjectStringify += ",";
}
MyObjectStringify += "]}";

如果你有一个较大的对象,MyObjectStringify会给你它的字符串表示(就像在本线程中提到的其他时间一样),除非你需要一个名称而不是数组,否则应该也适用于此- 只需确保按照自己的需求构建即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接