繁体   English   中英

从json字符串传递复杂的javascript对象配置(数据和函数)

[英]Pass complex javascript object configuration(data and functions) from json string

我有一个JavaScript,里面有很多参数和函数。

 ctrl.kendoGrid({
 dataSource: {
    type: "odata",
    transport: {
        read: {
            url: "odata/CodeView",
            dataType: "json",
            contentType: "application/json"
        },
        update: {
            url: function (data) {
                return "api/CodeMapUpdate/" + data.CODE_MAP_ID;
            },
            dataType: "json",
            type: "post",
            complete: function (e) {
                ctrl.data("kendoGrid").dataSource.read();
                if (e.status == 201) {
                    logger.log("Record Updated: Record ID = " + e.responseJSON, null, null, true);
                } else {
                    logger.logError(" Save failed " + e.responseJSON.ExceptionMessage, null, null, true);
                }

            }
        },
        destroy: {
            url: function (data) {
                return "api/CodeMapDelete/" + data.CODE_MAP_ID;
            },
            dataType: "json",
            complete: function () {
                ctrl.data("kendoGrid").dataSource.read();
            }
        },
        create: {
            url: "api/CodeMapCreate",
            dataType: "json",
            complete: function (e) {
                ctrl.data("kendoGrid").dataSource.sort({
                    field: "CODE_MAP_ID",
                    dir: "desc"
                });
                ctrl.data("kendoGrid").dataSource.filter({});
                if (e.status == 201) {
                    logger.log("Record Created: Record ID = " + e.responseJSON, null, null, true);
                } else {
                    logger.logError(" Save failed " + e.responseJSON.ExceptionMessage, null, null, true);
                }

            }
        },
    },
    schema: {
        data: function (data) {
            return data.value;
        },
        total: function (data) {
            return data["odata.count"];

        },
        model: {
            id: "CODE_MAP_ID",
            fields: {
                CODE_MAP_ID: {
                    editable: false,
                    type: "number"
                },
                CODE_NAME: {
                    type: "string",
                    validation: {
                        title: "Required Field",
                        required: true
                    }
                },
                L_NAME: {
                    type: "string",
                    validation: {
                        required: true
                    }
                },
                CODE_DATE: {
                    field: "CODE_DATE",
                    type: "date",
                    format: "{0:MM/dd/yyyy}",
                    validation: {
                        required: true
                    }
                },
            }
        }
    },
    change: function () {

    },
    //batch: true,
    pageSize: 20,
    serverPaging: true,
    serverFiltering: true,
    serverSorting: true,
    sort: {
        field: "CODE_MAP_ID",
        dir: "desc"
    }
    //autoSync: true
} })

我试图将整个“ dataSource”对象保存为变量,并在运行时使用ajax检索它。
我可以使用eval(“(” + dataSource +“)”)来执行此操作,但是不再包含任何包含的函数。

对将这种类型的对象存储到JSON中/从JSON中检索这种策略有任何想法吗?

这是一个有关如何将第二个参数用于JSON.parse以恢复存储的功能的简单演示:

var ob={a:1, b:false, c: function(a){ return a * a;} };//a sample object

Function.prototype.toJSON=Function.toString; //extend JSON to cover Functions

var str=JSON.stringify(ob, null, "\t"); //turn sample object into a string:
/* str =={
    "a": 1,
    "b": false,
    "c": "function (a){return a*a;}"
}  */


//now turn the string back into an object, using a reviver to re-parse methods:
var ob2=JSON.parse(str, function(a,b){
  if(b.match && b.match(/^function[\w\W]+\}$/)){ b=eval("b=0||"+b); }
  return b;
});


var n=5;    //let's try the method using a number
var n2=ob2.c(5); //apply the method to the number
alert(n2); // shows: 25, the number times itself, verifying that the function works

您可能希望对发送到eval的内容更加严格,除了匹配看起来像函数的属性之外,还可以使用键架构。 您可以对regexp进行更严格的处理,但是对于JSON.parse()参数的此快速演示,一切都很好。

在这种情况下,由于您要收集JSON的属性,因此没有机会碰到eval()可以解决的安全问题。 这些问题源于将一个用户的输入发送给另一用户而不进行过滤,而不是当您启动客户端上次生成的代码时...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM