来自json schema的构造函数

时间:2013-08-11 22:04:06

标签: javascript json oop

有没有办法从JSON模式构建对象构造函数?我想创建一个与我的应用程序命名空间相关联的json模式,我可以编辑一次,并更改我的对象的属性(在运行之前)。

我知道你可以编写像

这样的伪经典对象构造函数
var Note = function(input){ 
  var title = input
};
var newNote = new Note("test title");

是否可以从json创建类似的结构?这样我就可以写:

var Note = {
  "title":""
};
var newNote = new Note();
newNote.title = "test title"

据我所知,上面的语法错误,但我想举例:

var notes = {
  "NotesList":[{
    "title":"note1",
    "content":"test content"
  }]
}
var newNote = new Note();
notes.NotesList.add(newNote);
newNote.title = "new title";

这样我就可以将所有对象和他们所有的孩子从我的json模式创建的对象模板中移除。如果无法做到这一点,你能推荐一种更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我不确定我完全理解你的问题。但是,如果你想将一个函数转换为JSON,那么肯定是可能的。

您需要做的就是使用像acorn这样的JavaScript解析器,它使用Mozilla Parser API生成JSON格式的abstract syntax tree构造函数。例如:

var ast = acorn.parse(Note);
var json = JSON.stringify(ast, null, 4);
alert(json);

function Note(input) {
    var title = input;
}

参见演示here。上面的代码产生以下输出:

{
    "type": "Program",
    "start": 0,
    "end": 47,
    "body": [
        {
            "type": "FunctionDeclaration",
            "start": 0,
            "end": 47,
            "id": {
                "type": "Identifier",
                "start": 9,
                "end": 13,
                "name": "Note"
            },
            "params": [
                {
                    "type": "Identifier",
                    "start": 14,
                    "end": 19,
                    "name": "input"
                }
            ],
            "body": {
                "type": "BlockStatement",
                "start": 21,
                "end": 47,
                "body": [
                    {
                        "type": "VariableDeclaration",
                        "start": 27,
                        "end": 44,
                        "declarations": [
                            {
                                "type": "VariableDeclarator",
                                "start": 31,
                                "end": 44,
                                "id": {
                                    "type": "Identifier",
                                    "start": 31,
                                    "end": 36,
                                    "name": "title"
                                },
                                "init": {
                                    "type": "Identifier",
                                    "start": 39,
                                    "end": 44,
                                    "name": "input"
                                }
                            }
                        ],
                        "kind": "var"
                    }
                ]
            }
        }
    ]
}

您可以将上述AST保存在JSON文件中,并在需要时加载它。您可以使用escodegen将AST转换回JavaScript,如下所示:

alert(escodegen.generate(ast));

参见演示here。然后,您可以eval生成的代码,并根据需要使用Note构造函数。

答案 1 :(得分:0)

我找到了我正在寻找的答案。我的最终目标是使用子数组创建一个对象,每个子对象都可以有子对等。然后,该对象将被用作整个应用程序的命名空间,如:

var myobj = {};

我想使用JSON指定此对象的属性,然后从这些属性构建构造函数,如:

var myObj = {
"name": "genericname",
"id": "uniqueid",
"children": [
    {
        "grandchildren": [
            {
                "name": "child",
                "age": "0"
            }
        ]
    }
]
};

我最终做的是,从中构建构造函数,然后将它们克隆到我的新对象中,以便它们可以具有这样的默认值:

myObj.Child = function(){
  var child = myObj.children[0];
  return child;
  //this is the unmodified constructor child
};
var myObj.createChild = function(){
  var newChild = new Clone(myObj.Child());
  //do stuff to this is new child which can be modified without changing the original
  return newChild;
};