Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 安全地将JSON字符串转换为对象_Javascript_Json_Parsing - Fatal编程技术网

Javascript 安全地将JSON字符串转换为对象

Javascript 安全地将JSON字符串转换为对象,javascript,json,parsing,Javascript,Json,Parsing,给定一个JSON数据字符串,如何安全地将该字符串转换为JavaScript对象 显然,我可以通过以下方式不安全地做到这一点: var obj = eval("(" + json + ')'); 但这使我容易受到包含其他代码的JSON字符串的攻击,简单地求值似乎是非常危险的。我不确定是否有其他方法可以做到这一点,但这里介绍了如何使用 当参数为true时调用evalJSON()可以清除传入字符串。这个答案适用于IE

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

显然,我可以通过以下方式不安全地做到这一点:

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

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

我不确定是否有其他方法可以做到这一点,但这里介绍了如何使用

当参数为true时调用
evalJSON()
可以清除传入字符串。

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

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

有多种语言的JSON解析器,包括四种不同的JavaScript解析器。我相信大多数人都会考虑他们的GOTO实现。

如果你正在使用,你也可以使用:

$.getJSON(url, function(data) { });
然后你可以做像这样的事情

data.key1.something
data.key1.something_else
等等


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

现在不推荐使用jQuery方法。请改用此方法:

let jsonObject = JSON.parse(jsonString);

使用不推荐的jQuery功能的原始答案:

如果使用jQuery,只需使用:

jQuery.parseJSON( jsonString );

这正是您想要的(请参阅jQuery)。

是一种纯JavaScript方法,只要您能够保证一个合理的现代浏览器。

这似乎是一个问题:

通过AJAXWebSocket等接收的输入,它将是字符串格式,但您需要知道它是否为
JSON.parsable
。问题是,如果您总是通过
JSON.parse
运行它,程序可能会“成功”继续运行,但您仍然会看到控制台中抛出一个错误,错误是可怕的
“error:unexpected token'x'


使用“”中的简单代码示例:

并将其逆转:

var str = JSON.stringify(arr);

请尝试将该方法用于此数据对象。例如:
Data='{result:true,count:1}
'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

当您使用串行端口编程时,这种方法在Nodejs中确实很有帮助。为了好玩,这里有一种使用函数的方法:

 jsonObject = (new Function('return ' + jsonFormatData))()
我找到了一个“更好”的方法:

在咖啡脚本中:

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.parse
可能是最好的方法

这里有一个例子

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);

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

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);
然后可以获取JSON元素的值,例如:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;
按照文档中的说明使用:

JSON.parse(jsonString);
JSON.parse()
将传递到函数中的任何JSON字符串转换为JSON对象

要更好地理解它,请按F12在浏览器中打开“Inspect Element”,然后转到控制台编写以下命令:

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

console.log(JSON.parse(response));
console.log(obj.result);
您将以对象
{result:true,count:1}
的形式获得输出

为了使用该对象,您可以将其分配给变量,可能是
obj

var obj = JSON.parse(response);
通过使用
obj
和点(
)操作符,您可以访问JSON对象的属性

尝试运行以下命令:

console.log(JSON.parse(response));
console.log(obj.result);

json.parse将变成object。

json解析总是一件痛苦的事。如果输入不符合预期,则会抛出错误并使您正在执行的操作崩溃

您可以使用以下微型函数安全地解析输入。即使输入无效或已经是一个对象,它也始终会打开一个对象,这在大多数情况下是更好的:

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,然后对其进行解析,对我来说很有用,比如:

JSON.parse(JSON.stringify(object))

您还可以使用
revivier
功能进行过滤

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

有关更多信息,请阅读。

官方文档:

JSON.parse()
方法解析JSON字符串,构造字符串所描述的JavaScript值或对象。可以提供一个可选的
恢复器
函数,在返回结果对象之前对其执行转换

语法:

JSON.parse(text[, reviver])
参数:

JSON.parse(text[, reviver])
text
:要解析为JSON的字符串。有关JSON语法的描述,请参见JSON对象

恢复器(可选)
:如果是函数,则说明在返回之前如何转换最初通过解析生成的值

返回值

与给定JSON文本对应的对象

例外情况


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

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


举个例子:

 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元素的配置设置(例如数据属性)

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

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

使用
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"}'); 
var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)
这里的
obj
是相应的JSON对象,看起来像:

{ "name":"John", "age":30, "city":"New York"}
要获取值,请使用
运算符:

obj.name // John
obj.age //30
使用
JSON.stringify()
将JavaScript对象转换为字符串摘要: Javascript(浏览器和NodeJS)有一个内置的
JSON
对象。在这个对象上有两种方便的方法来处理
JSON
。它们是:

  • JSON.parse()
    JSON
    作为参数,返回JS对象
  • JSON.stringify()
    将JS对象作为参数返回
    JSON
    object
  • 其他应用程序: 此外,为了非常方便地处理
    JSONobj.name // John
    obj.age //30
    
    "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
    
    var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
    var jsonString= JSON.parse(sampleString)
    var jsonObject= JSON.parse(jsonString)
    
    // instead of last JSON.parse:
    var { status, token } = JSON.parse(jsonString);
    
    status = 1 and token = 65b4352b2dfc4957a09add0ce5714059
    
    var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');
    
    var myArr = JSON.parse(this.responseText);
    console.log(myArr[0]);
    
    var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
    var obj = JSON.parse(text);
    obj.birth = new Date(obj.birth);
    
    var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
    var obj = JSON.parse(text);
    obj.age = eval("(" + obj.age + ")");