…但这会使我们容易受到包含其他代码的"/>

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

关于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;
                 }
           }

推荐阅读

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

    linux清空表数据命令?

    linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,L

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux数据库检查命令?

    linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,

    linux命令进去数据库?

    linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网

    linux数据库基础命令?

    linux数据库基础命令?,地址,工作,基础,系统,命令,信息,情况,工具,设备,目录,l

    linux数据共享命令?

    linux数据共享命令?,情况,系统,工具,网络,数据,软件,发行,设备,命令,文件,Lin

    命令发送数据linux?

    命令发送数据linux?,数据,地址,时间,工具,系统,设计,工作,网络,命令,综合,lin

    数据库导出命令linux?

    数据库导出命令linux?,数据,系统,名称,密码,软件,服务,情况,网上,工具,文件,L

    linux命令清空数据?

    linux命令清空数据?,服务,数据,名称,不了,百度,管理,档案,产品,命令,文件,删

    linux大数据在线命令?

    linux大数据在线命令?,工作,地址,系统,信息,管理,命令,数据,在线,目录,网络,l

    linux数据库删除命令?

    linux数据库删除命令?,软件,服务,产品,名称,系统,不了,地址,管理,电脑,命令,L

    linux数据库操作命令?

    linux数据库操作命令?,信息,系统,网络,地址,分析师,数据,名称,管理,基础,命

    linux连数据库命令?

    linux连数据库命令?,服务,地址,密码,名字,系统,软件,一致,命令,数据库,读法,

    备份数据库命令linux?

    备份数据库命令linux?,服务,网络,备份,数据,工具,设备,系统,一致,数据库,命

    数据哭常用linux命令?

    数据哭常用linux命令?,工作,地址,系统,信息,数据,命令,管理,密码,服务,名字,L

    linux登录数据库命令?

    linux登录数据库命令?,地址,系统,名字,服务,软件,标准,灵活,命令,数据库,读

    linux数据库选择命令?

    linux数据库选择命令?,系统,地址,工作,软件,管理,信息,工具,基础,命令,服务,

    linux命令发送数据包?

    linux命令发送数据包?,数据,系统,流程,地址,工作,时间,信息,网络,电脑,设备,L