递归结构的Json模式不起作用

时间:2019-08-10 14:23:34

标签: json json.net jsonschema

这是我的json模式。我想要一个递归的树状结构。但是,即使我在所需的数组中有无效的对象,响应也会通过。

{  
   "$schema":"http://json-schema.org/draft-03/schema",
   "properties":{  
      "Result":{  
         "type":"object",
         "properties":{  
            "Children":{  
               "$ref":"#/definitions/Node"
            }
         },
         "required":true
      }
   },
   "required":true,

   "type":"object",
   "definitions":{  
      "Node":{  
         "type":"array",
         "Items":{  
            "type":"object",
            "properties":{  
               "Children":{  
                  "$ref":"#/definitions/Node"
               }
            },
            "required":true
         }
      }
   }
}

要检查JSON模式验证是否正确验证,我特意在响应中放入了无效对象-

{"Result":{"title":"title","Children":[{"invalidobject":"invalidobject"}]}}

但是它正在通过-https://www.jsonschemavalidator.net/ 我真正想要的是Children也要有一系列Children等。因此,只有具有对象属性(标题和子级)的子级才应允许。 它也通过了此响应-

{"Result":{"title":"title","Children":[{"title":45}]}}

1 个答案:

答案 0 :(得分:0)

尝试此架构。请注意,即使在第一级,此架构也将允许子数组为空。在第一级之后,必须允许子数组为空,否则,架构将需要无限递归数据才能通过验证。

{
  "$schema": "http://json-schema.org/draft-03/schema",
  "type": "object",
  "properties": {
    "Result": {
      "$ref": "#/definitions/node",
      "required":true,
    }
  },
  "definitions": {
    "node": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "required": true
        },
        "Children": {
          "type": "array",
          "required": true,
          "items": {
            "$ref": "#/definitions/node"
          }
        }
      },
      "additionalProperties": false
    }
  }
}

如果不想让子级数组在第一级为空,请尝试像这样单独定义第一级。

{
  "$schema": "http://json-schema.org/draft-03/schema",
  "type": "object",
  "properties": {
    "Result": {
      "type": "object",
      "required": true,
      "properties": {
        "title": {
          "$ref": "#/definitions/title"
        },
        "Children": {
          "minItems": 1,
          "$ref": "#/definitions/Children"
        }
      },
      "additionalProperties": false
    }
  },
  "definitions": {
    "title": {
      "type": "string",
      "required": true
    },
    "Children": {
      "type": "array",
      "required": true,
      "items": {
        "$ref": "#/definitions/node"
      }
    },
    "node": {
      "type": "object",
      "properties": {
        "title": {
          "$ref": "#/definitions/title"
        },
        "Children": {
          "$ref": "#/definitions/Children"
        }
      },
      "additionalProperties": false
    }
  }
}

这里是从https://www.jsonschemavalidator.net/验证的示例输入JSON的验证结果

输入JSON:

{
  "Result": {
    "title": "title",
    "Children": [
      {
        "invalidobject": "invalidobject"
      }
    ]
  }
}

验证结果:

  

消息:   尚未定义属性“ invalidobject”,并且该架构不允许使用其他属性。   架构路径:    #/ definitions / node / additionalProperties

     

消息:   对象缺少必需的属性:title,Children。   架构路径:    #/ definitions / node /必填

内置JSON:

{
  "Result": {
    "title": "title",
    "Children": [
      {
        "title": 45
      }
    ]
  }
}

验证结果:

  

消息:   类型无效。预期为String,但得到了Integer。   架构路径:    #/ definitions / node / properties / title / type

     

消息:   对象:子级缺少必需的属性。   架构路径:    #/ definitions / node /必填