11

是否有任何库可以从 JSON 模式生成 Javascript 类型对象(JS 函数)?基本上相当于这个http://code.google.com/p/jsonschema2pojo/的 JS 版本。谢谢。

编辑:

从...开始 :

{
    "description": "An entity",
    "type":"object",
    "properties": {
        "geometries": {"type": "array",
            "items": {
                "$ref" : "geometry"
             }
          }
    }
}

我想为我生成一些这样的代码

function Entity {
    this.geometries;
}

显然,使用 $ref 等模式可能会更复杂,我希望这能给出这个想法。

4

3 回答 3

2

这个djvi库是否满足您的要求?

提供的示例显示:

var jsonSchema = {"common":{"properties":{"type":{"enum":["common"]}},"required":["type"]}};

var env = new djvi();
env.addSchema('test', jsonSchema);
env.instance('test#/common');
// => { type: 'common' }

我怀疑这是您所追求的解决方案。

现在这不是您所追求的确切解决方案,但我遇到了类似的问题并创建了以下解决方案以将父对象作为函数返回,它可能会有所帮助:

var dbdict = {
    "title": "Entity",
    "description": "An entity",
    "type":"object",
    "properties": {
        "geometries": {"type": "array",
            "items": {
                "$ref" : "geometry"
             }
          }
    }
}

var walkJSONSchema = function (JSONSchema, returnFunction) {

    var walkObject = function(PROPS) {
        var $this = this,
            $child = {}
        ;

        if(returnFunction == true) {
            $child = new function() {};
        }

        //console.log("PROPS");
        //console.log(PROPS);

        for(var key in PROPS) {
            console.log("key:"+key+" type:"+PROPS[key].type+" default:"+PROPS[key].default);
            switch(PROPS[key].type) {
                case "boolean":
                    $child[key] = PROPS[key].default || undefined;
                    break;
                case "integer":
                case "number":
                    $child[key] = PROPS[key].default || undefined;
                    break;
                case "array":
                    $child[key] = [].push($this.walkObject(PROPS[key].properties));
                    break;
                case "object":
                    $child[key] = $this.walkObject(PROPS[key].properties);
                    break;
                case "string":
                    $child[key] = PROPS[key].default || undefined;
                    break;
            };
        };

        return $child;
    }

    return walkObject(JSONSchema.properties);
}

Entity = walkJSONSchema(dbdict, true);

Of course you could script the retrieval of the "Entity" from the schema doc however you like, but this way at least you get a function.

于 2013-05-09T08:36:38.827 回答
0

我会说你是靠自己的。无论如何,做起来应该不会太难。只需解析您拥有的 JSON,然后遍历每个项目,为每个“类”应用您想要的逻辑并将结果附加到一个字符串。完成后,打印该字符串并使用任何 JS 格式化程序来获取您的代码。

于 2012-10-23T11:13:31.337 回答
-2

您唯一能做的就是向_type_您的 json 对象添加一个属性(以某种奇怪的方式命名,以免与其他文字冲突),以识别您的类型。然后,您可以将该字符串映射到 javascript 中列出可用属性的另一个对象。

你可以这样做——这并不意味着这是一个好主意。Json 是为了在 javascript 中直接使用而设计的。

于 2012-10-23T11:27:13.270 回答