给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象?

很明显,我可以用这样的方式来做这件事:

var obj = eval("(" + json + ')');

但这让我很容易受到包含其他代码的JSON字符串的攻击,简单地eval似乎非常危险。


当前回答

试试这个。这是用打字机写的。

export function safeJsonParse(str: string) {
    try {
        return JSON.parse(str);
    } catch (e) {
        return str;
    }
}

其他回答

这个答案适用于IE<7,对于现代浏览器,请查看上面Jonathan的答案。

这个答案已经过时,Jonathan上面的答案(JSON.parse(jsonString))现在是最好的答案。

JSON.org有多种语言的JSON解析器,包括四种不同的JavaScript解析器。我相信大多数人都会考虑将json2.js作为他们的goto实现。

使用JSON.Parse()解析JSON字符串,数据将成为JavaScript对象:

JSON.parse(jsonString)

这里,JSON表示处理JSON数据集。

想象一下,我们从web服务器收到了以下文本:

'{ "name":"John", "age":30, "city":"New York"}'

要解析为JSON对象,请执行以下操作:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

这里obj是相应的JSON对象,看起来像:

{ "name":"John", "age":30, "city":"New York"}

要获取值,请使用。操作员:

obj.name // John
obj.age //30

使用JSON.stringify()将JavaScript对象转换为字符串。

我找到了一个“更好”的方法:

在CoffeeScript中:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

在Javascript中:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

官方文件:

方法解析JSON字符串,构造字符串所描述的JavaScript值或对象。可以提供可选的reviver函数,以便在返回结果对象之前对其执行转换。

语法:

JSON.parse(text[, reviver])

参数:

文本:要解析为JSON的字符串。有关JSON语法的描述,请参见JSON对象。

reviver(可选):如果是函数,这规定了在返回之前如何转换最初通过解析生成的值。

返回值

与给定JSON文本对应的Object。

例外情况

如果要分析的字符串不是有效的JSON,则引发SyntaxError异常。

使用“JSON.parse()”中的简单代码示例:

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

并将其反转:

var str = JSON.stringify(arr);