关于javascript:安全地将JSON字符串转换为对象

Safely turning a JSON string into an object

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

很明显,你可以用像…

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

…但这会使我们容易受到包含其他代码的JSON字符串的攻击,这对于简单地评估似乎非常危险。


只要你能保证一个相当现代化的浏览器,JSON.parse(jsonString)就是一个纯粹的javascript方法。


jquery方法现在已弃用。改为使用此方法:

1
let jsonObject = JSON.parse(jsonString);

使用已弃用的jquery功能的原始答案:

如果使用jquery,只需使用:

1
jQuery.parseJSON( jsonString );

这正是您要查找的内容(请参见jquery文档)。


编辑:这个答案适用于IE<7,对于现代浏览器,请查看上面的乔纳森的答案。

编辑:这个答案过时了,乔纳森的回答(JSON.parse(jsonString))现在是最好的答案。

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


使用msdn上以下链接中表示的简单代码。

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

反向

1
var str = JSON.stringify(arr);


我不确定其他的方法,但这里是如何在原型(JSON教程)中实现的。

1
2
3
4
5
6
7
new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

使用true调用evaljson()作为参数来清理传入字符串。


这似乎就是问题所在:

通过Ajax WebSocket等接收到一个输入,它始终是字符串格式的——但您需要知道它是否是json.parsable。问题是,如果您总是通过json.parse运行它,那么程序可能会"成功"地继续运行,但您仍然会看到控制台中抛出了一个错误,并带有可怕的"错误:意外的标记"x"。

1
2
3
4
5
6
7
8
9
var data;

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

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


如果您使用的是jquery,您也可以使用$.getJSON(url, function(data) { });

然后你可以做像data.key1.somethingdata.key1.something_else等事情。


1
2
3
4
5
6
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

回调将传递返回的数据,该数据将是JSON结构定义的javascript对象或数组,并使用$.parseJSON()方法进行分析。


尝试使用此数据对象的方法。例:Data='{result:true,count:1}'

1
2
3
4
5
6
7
try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

当您使用串行端口编程时,此方法确实有助于nodejs。


为了好玩,以下是使用功能的方法:

1
 jsonObject = (new Function('return ' + jsonFormatData))()


使用parse()方法最简单的方法是:

1
2
var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

然后可以得到Json元素的值,例如:

1
2
var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

使用文档中描述的jquery:

1
JSON.parse(jsonString);

使用json.parse可能是最好的方法。以下是一个现场演示示例

1
2
3
4
5
var jsonRes = '{"students" : [' +
          '{"firstName":"Michel" ,"lastName":"John" ,"age":18},' +
          '{"firstName":"Richard" ,"lastName":"Joe","age":20 },' +
          '{"firstName":"James" ,"lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

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

在咖啡中描述:

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

在JavaScript中:

1
2
3
4
5
6
7
8
9
var data;

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

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

1
JSON.parse(jsonString);

json.parse将变为对象。


JSON解析总是让人头疼。如果输入不符合预期,它就会抛出一个错误,并破坏您正在做的工作。您可以使用下面的小函数来安全地分析您的输入。即使输入无效或已经是大多数情况下更好的对象,它也始终会转换对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};


将对象转换为JSON,然后对其进行解析,对我来说是可行的,比如:

1
JSON.parse(JSON.stringify(object))


如果我们有这样的字符串:""状态":1,"token":"65B4352B2DF4957A09AD0CE5714059


正式记录:

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

句法

1
JSON.parse(text[, reviver])

参数

文本

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

复活器(可选)

如果是一个函数,这就规定了在返回之前如何转换解析产生的值。

返回值

与给定的JSON文本对应的对象。

例外情况

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


parse()将传递给函数的任何JSON字符串转换为JSON对象。

要更好地理解,请按F12打开浏览器的inspect元素,然后转到console编写以下命令:

1
2
var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

现在运行命令:

1
console.log(JSON.parse(response));

您将得到输出作为对象结果:真,计数:1。

为了使用该对象,可以将其分配给变量,例如obj:

1
var obj = JSON.parse(response);

现在,通过使用obj和dot(.)操作符,可以访问JSON对象的属性。

尝试运行命令

1
console.log(obj.result);


您还可以使用reviver函数进行过滤。

1
2
3
var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

有关更多信息,请阅读json.parse


我知道,以前的问题,但是没有人注意到使用new Function()这个返回数据的匿名函数的解决方案。

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

这有点安全,因为它在函数内部执行,而不是直接在代码中编译。因此,如果其中有一个函数声明,它将不会绑定到默认窗口对象。

我使用它来"编译"简单而快速的DOM元素(例如数据属性)的配置设置。


用json.parse()解析json字符串,数据变成一个javascript对象。

1
JSON.parse(jsonString)

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

例子,假设我们从一个Web服务器接收到了此文本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
'{"name":"John","age":30,"city":"New York
<hr>
Summary:

<p>
Javascript (both browser and NodeJS) have a built in <wyn>JSON</wyn> object. On this Object are 2 convenient methods for dealing with <wyn>JSON</wyn>. They are the following:
</p>



<li>
<wyn>JSON.parse()</wyn>      Takes <wyn>JSON</wyn> as argument, returns JS object
</li>


<li>
<wyn>JSON.stringify()</wyn>  Takes JS object as argument returns <wyn>JSON</wyn> object
</li>



Other applications:

<p>
Besides for very conveniently dealing with <wyn>JSON</wyn> they have can be used for other means.  The combination of both <wyn>JSON</wyn> methods allows us to make very easy make deep clones of arrays or objects. For example:
</p>

<p>


[cc lang="javascript"]let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = '
changed';
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = '
changed';
console.log(newArrDeepclone); // A deep clone, values unchanged


如果您的javascript在mooolts中,那么框架将匿名提供JSON.parse。安全地将JSON字符串转换为对象的有效语法应该是:

1
var object = JSON.decode(string[, secure]);

此外,JSON Request可以引发一个能够直接解析的对象。您可以在这里讨论如何转换JSON原始数据:

http://jsfiddle.net/chetabahana/qbx9b5pm/


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

1
2
3
4
5
6
7
         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }