JSON Schema:表示在字符串类型中编码对象类型的约束

Mah*_*oni 1 javascript schema json schema-design jsonschema

在我的JSON序列化数据中,我有嵌套对象:

{
  "A" : { "A1": 1,
          "A2": 2 },
  "B" : { "B1": 3,
          "B2": 4 }
}
Run Code Online (Sandbox Code Playgroud)

由于给定的约束我无法影响,我需要压扁结构.这意味着,深度大于1的每个对象都必须编码为字符串.应用于上面的例子,这是这样的:

{
  "A" : "\{\"A1\": 1, \"A2\": 2\}"
  "B" : "\{\"B1\": 3, \"B2\": 4\}"  
}
Run Code Online (Sandbox Code Playgroud)

因为我需要在JSON Schema中表达这个约束,所以我几乎要遵循它的语法规则.我猜这些对象的类型将是string或者object.

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "type": "string vs. object" 
    "B": {
      "type": "string vs. object"
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*che 5

我同意,无论你选择object还是string打字.我已经查看了JSON Schema文档,但我找不到任何可以根据需要明确表达约束的内容.因此,我想到了两种方法的简短讨论.

键入字符串

JSON Schema定义了七种基本类型,包括object.字符串简单地定义为JSON字符串.RFC 4627定义了一个JSON字符串,如下所示

字符串是零个或多个Unicode字符的序列

这适用于您的情况,即使必须限制字符串的内容.问题是如何传达限制.我会用a description来引用另一个子模式.您甚至可以pattern为字符串定义一个 将子模式编码为正则表达式.然而,这将非常容易出错并且根本不可读.但是,它可以用于更好的数据模式验证.

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "type": "string".
      "description": "Please refer to http://... for the subschema."
    },
    "B": {
      "type": "string"
      "description": "Please refer to http://... for the subschema."
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,JSON提供程序必须将字符串放入该属性,这一点明确无误.缺点是完整的模式不能被视为一次,描述可能被监督,并且在查找过程中也很麻烦.最后看到类型时会非常混乱,stringobject在子模式中定义了a .

输入对象

通过简单地使用类型,您可以避免使用字符串的所有缺点.这里的问题实际上是说明了必须是字符串编码的描述将被忽略.

{
  "title": "My Schema",
  "type": "object",
  "properties": {

    "A": {
      "description": "Must be encoded as string",
      "type": "object",
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    },
    "B": {
      "description": "Must be encoded as string",
      "type": "object"
      "properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
    }
}
Run Code Online (Sandbox Code Playgroud)

你总是可以做一些完全虚假的事情,比如使用类型stringproperties为它定义,但这将是无效的JSON Schema.


我建议你使用Type Object方法.虽然存在这种约束,但使用字符串类型总是会导致其后面的数据降级.可以通过其他方式强制执行约束.观察谁提供数据,将约束传达给所有各方,阻止与此约束无关的数据等.

谁知道,也许这种约束不会永远存在,如果发生变化,你需要再次更改模式,在另一种情况下你只需要删除注释,说明字符串编码的要求.