【问题标题】:How to create an object with a function from string:如何使用字符串中的函数创建对象:
【发布时间】:2016-04-26 08:39:26
【问题描述】:

我将此代码存储为字符串:

{
  "func": function (field) {
    var date = getDate(field);
    return date != -1;
  },
  "somethingElse": "Message",
  "somethingElse2": "Message2"
}

有没有办法将其转换为对象? JSON.parse 不允许函数。

【问题讨论】:

  • }(),替换},

标签: javascript json parsing serialization


【解决方案1】:

正如Durendal 已经说过的,你必须将你的函数作为一个字符串传递给JSON.parse。之后,您可以使用eval 调用您的函数:

var string = '{"func":"function (field) {return field;}","somethingElse": "Message","somethingElse2":"Message2"}';

var jsonObject = JSON.parse(string);
var func = eval("("+jsonObject["func"]+")");

document.write(func("abc"));

您可能也对这个问题感兴趣:JavaScript eval() "syntax error" on parsing a function string

【讨论】:

    【解决方案2】:

    你的字符串应该是这样的:

    var string = '{"func":"function (field) {var date = getDate(field);return date != -1;}","somethingElse": "Message","somethingElse2":"Message2"}';
    
    var jsonObject = JSON.parse(string);
    

    https://jsfiddle.net/pc6hdk1y/

    【讨论】:

      【解决方案3】:

      首先,要存储这样的方法,您需要使用 replacer 函数

      var text = JSON.stringify(a, function(k,v){
        return typeof v == "function" ? v.toString() : v;
      })
      

      现在,要恢复函数,你需要使用 reviver 函数

      JSON.parse(text,function(k,v){
        console.log(v);
      
        return typeof v == "string" && v.indexOf("function") == 0 ? new Function(v.substring(v.indexOf("{")+1, v.lastIndexOf("}"))) : v;
      })
      

      【讨论】:

      • JSON 不处理这种开箱即用的功能有什么原因吗?
      • @Fidel90 我认为将任意字符串解析为可执行方法并不安全。其次,JSON 不知道该值是否是一个方法,因为它得到的只是一个字符串。
      • 可悲的是,函数参数似乎没有在解析中恢复
      • @Ralstlin 等等,让我也做点什么。
      • @Ralstlin 在我看来,除非函数在函数内部使用 arguments 对象,否则如果没有 eval,它将无法使用变量参数
      【解决方案4】:

      如果您想重用该功能,您可能需要这样做

      var data = {
                            "func": ["field", "var date = getDate(field); return date != -1;"],
                   "somethingElse": "Message",
                  "somethingElse2": "Message2"
                 },
         jData = JSON.stringify(data),
         pData = JSON.parse(jData),
          func = new Function(pData.func[0],pData.func[1]);
      document.write("<pre>" + func + "</pre>");

      【讨论】:

        猜你喜欢
        • 2011-08-31
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 2013-03-25
        相关资源
        最近更新 更多