表达式树的JSON模式

时间:2015-09-24 20:27:16

标签: json visual-studio-2013 jsonschema

我需要为简单的语法表达式创建模式,其中:

{Expression}:
     {Function}
     OR {Variable}
{Function}:   
     FunctionName [array of {Expression}]
{Variable}:
     VariableName

所以我可以像这样编写JSON树表达式:

{
    "Expression": {
        "function": "MyFunc",
        "args": [ { "varName": "X1" }, { "varName": "X2" }, { "function": "MyFunc2", "args": [ { "varName": "123" } ] } ]
    }
}

我需要为函数和变量提供additionalProperties的能力。 这是我创建的架构:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "var": {
            "type": "object",
            "properties": {
                "varName": { "type": "string" }
            },
            "required": [ "varName" ]
        },
        "func": {
            "type": "object",
            "properties": {
                "function": { "type": "string" },
                "args": { "type": "array", "items": { "$ref": "#/definitions/expr" } }
            },
            "required": [ "function" ]
        },
        "expr": {
            "oneOf": [
                { "$ref": "#/definitions/var" },
                { "$ref": "#/definitions/func" }
            ]
        }
    },
    "type": "object",
    "properties": {
        "Expression": { "$ref": "#/definitions/expr" }
    }
}

由于某些原因,它没有通过验证,因为Visual Studio 2013 Update 5中的表达式显示以下错误:

  

1)所需的属性“varName”不存在

     

2)属性“Expression”的值必须完全符合其中之一   以下架构:{               “type”:“object”,               “properties”:{                   “varName”:{“type”:“string”}               },               “required”:[“varName”]           },{               “type”:“object”,               “properties”:{                   “function”:{“type”:“string”},                   “args”:{“type”:“array”,“items”:{“$ ref”:“#/ definitions / expr”}}               },               “必需”:[“功能”]           }

赞赏任何想法

1 个答案:

答案 0 :(得分:1)

您的架构写得很好且没有错误。问题必须出在您使用的验证器中。架构在http://jsonschemalint.com/draft4/#http://json-schema-validator.herokuapp.com/处成功验证。我也详细审查了它,发现没有错误。

您可以尝试的一件事是使用anyOf代替oneOf。它将产生与oneOf相同的结果,因为这两个模式是互斥的。如果幸运的话,该错误会影响oneOf,但不会影响anyOf