首页 文章

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

提问于
浏览
1178

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

很显然,你可以通过以下方式不安全地做到这一点......

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

...但是这使得我们容易受到包含其他代码的json字符串的影响,这对于简单的eval来说似乎非常危险 .

25 回答

  • 1

    尝试将此方法与此Data对象一起使用 . 例如: Data='{result:true,count:1} '

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

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

  • 7

    试试这个 . 这个是用打字稿写的 .

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

    我已成功使用json_sans_eval一段时间了 . 根据它的作者,它比json2.js更安全 .

  • 9

    如果你正在使用jQuery,你也可以这么做 $.getJSON(url, function(data) { });

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

  • 0
    JSON.parse(jsonString);
    

    json.parse将变为object .

  • 6

    只是为了好玩,这是使用功能的方式:

    jsonObject = (new Function('return ' + jsonFormatData))()
    
  • 11

    您也可以使用 reviver 函数进行过滤 .

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

    欲了解更多信息,请阅读JSON.parse

  • 0

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

    let jsonObject = JSON.parse(jsonString);
    

    使用弃用的jQuery功能的原始答案:

    如果您正在使用jQuery,请使用:

    jQuery.parseJSON( jsonString );
    

    它正在寻找's exactly what you'(参见jQuery documentation) .

  • 0

    Officially documented

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

    Syntax

    JSON.parse(text[, reviver])
    

    Parameters

    文本

    要解析为JSON的字符串 . 有关JSON语法的说明,请参阅JSON对象 .

    reviver(可选)

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

    Return value

    对应于给定JSON文本的Object .

    Exceptions

    如果要解析的字符串不是有效的JSON,则抛出SyntaxError异常 .

  • 863
    $.ajax({
      url: url,
      dataType: 'json',
      data: data,
      success: callback
    });
    

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

  • 64

    JSON.parse()将传递给函数的任何JSON String转换为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));
    

    你将得到输出为Object {result:true,count:1} .

    为了使用该Object,您可以将其分配给变量let's say obj: -

    var obj = JSON.parse(response);
    

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

    尝试运行该命令

    console.log(obj.result);
    
  • 19

    我'm not sure about other ways to do it but here'你是怎么做的Prototype (JSON tutorial) .

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

    使用true调用 evalJSON() 作为参数清理传入的字符串 .

  • 8

    JSON.parse(jsonString)是一种纯JavaScript方法,只要您能保证合理的现代浏览器 .

  • 146

    使用以下link on MSDN中表示的简单代码 .

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

    并反转

    var str = JSON.stringify(arr);
    
  • 2

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

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

    那么你可以得到 Json 元素的值,例如:

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

    使用jQuery中描述的jQuery

    JSON.parse(jsonString);
    
  • -1

    Edit: This answer is for IE < 7, for modern browsers check Jonathan's answer above.

    编辑:这个答案已过时,Jonathan's answer aboveJSON.parse(jsonString) )现在是 best answer .

    JSON.org有许多语言的JSON解析器,包括4个不同的Javascript语言 . 我相信大多数人会考虑json2.js他们的goto实现 .

  • 16

    这似乎是个问题:

    通过ajax websocket等接收输入,它总是以String格式 - 但你需要知道它是否是JSON.parsable . Touble是,如果你总是通过JSON.parse运行它,程序可以继续“成功”但你仍然会看到控制台中出现的错误,其中包含可怕的“错误:意外标记'x'” .

    var data;
    
    try {
      data = JSON.parse(jqxhr.responseText);
    } catch (_error) {}
    
    data || (data = {
      message: 'Server error, please retry'
    });
    
  • 4

    使用JSON.parse可能是最好的方法 . 这是一个例子live demo

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

    我发现了一种“更好”的方式:

    在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'
    });
    
  • 0

    如果你的JavaScript在Mootools中, JSON.parse 将由框架匿名 .
    将JSON字符串安全地转换为对象的有效syntax应为:

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

    而且 JSON Request 可以引发一个能够直接解析的对象 .
    你可以在这里告诉它如何变成json raw data

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

  • 1

    摘要:

    Javascript(浏览器和NodeJS)都有一个内置的 JSON 对象 . 在这个对象上有2个方便的方法来处理 JSON . 它们如下:

    • JSON.parse()JSON 作为参数,返回JS对象

    • JSON.stringify() 将JS对象作为参数返回 JSON object

    其他应用:

    除了非常方便地处理 JSON 之外,它们还可以用于其他方式 . 两种 JSON 方法的结合使我们可以非常轻松地制作数组或对象的深度克隆 . 例如:

    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
    
  • 2

    将对象转换为JSON,然后解析它,对我有用,如:

    JSON.parse(JSON.stringify(object))
    
  • 12

    使用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对象转换为字符串 .

  • 0

    更老的问题,我知道,但是没有人注意到这个解决方案是使用 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元素的配置设置(例如数据属性) .

  • 1778

    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 || {};
      }
    };
    

相关问题