在PatternProperties中严格键入JSON Schema

时间:2018-01-11 07:25:02

标签: json jsonschema json-schema-validator

我有类似于下面的JSON文档

for ( $i = 0; $i < $resultcount; $i ++ ) {
    $pattern = '%\b^((https?://)|(www\.)|(^[a-z]+\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%';
    $message = (string)$result[$i]['message'];
    preg_match_all($pattern,$message,$match);
    print_r($match);
    }

我想要的是一个键值对列表,其中键将是计算机的名称,值将是计算机的属性。同样在这些值中,我可以有多个键值对,如上所示。

我已经用草案6编写了JSON Schema,如下所示

export default class WidgetModel extends Component {

  constructor() {
    super()
  }

  render() {
    const {  } = this.props,   
    return (  
      <p>{Copy}</p>           
    )
  }
}

你可以尝试here

问题是我不想让用户输入“虚拟”值,如上面给出的JSON所示。显然 <div id="widget"> <p>@vm.Copy</p> </div>无效。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您的主要问题是您的架构描述了您的数据没有的名为“计算机”的顶级属性。因此,您测试的数据都不受模式的限制。另一个问题是你的正则表达式与大写字符不匹配。

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "patternProperties": {
    "^[a-zA-Z0-9-_]+$": {
      "additionalProperties": false,
      "properties": {
        "memory": {
          "patternProperties": {
            "^[a-zA-Z0-9-_]+$": {
              "additionalProperties": false,
              "properties": {
                "RamType": { "type": "string" },
                "Size": { "type": "number" }
              }
            }
          }
        }
      }
    }
  }
}