代码之家  ›  专栏  ›  技术社区  ›  cardamom

在jsonchema中验证两种可能的数据类型

  •  1
  • cardamom  · 技术社区  · 6 年前

    我已经花了一整天的时间试图让这个工作,将张贴一份清单的参考资料和事情,我已经尝试后的问题。

    这是我的jsonschema:

    {
        "data": [{
            "required": "effort",
            "decisive": "maybe",
            "field1": 7
        },
        {
            "required": "effort",
            "decisive": "no",
            "field1": 6
        }],
        "schema": {
            "$schema": "http://json-schema.org/draft-04/schema#",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "field1": {
                        "type": "string",
                        "pattern": "[A-Z]",
                        "title": "field1"
                    },
                    "required": {
                        "type": "string",
                        "title": "required",
                        "readonly": true
                    },
                    "decisive": {
                        "type": "string",
                        "title": "Decisive",
                        "enum": ["yes", "no", "maybe", "not now"]
                    }
    
                }
            }
        }
    }
    

    考虑JSONScript的精确片段,但是 field1 要素如下:

    "field1": {
        "type": "integer",
        "minimum": 5,
        "maximum": 10,
        "title": "field1"
    }
    
    • 第一个示例只验证其字段1中的大写字母
    • 第二个需要一个5到10之间的整数。

    你怎么能让它验证其中任何一个,所以两者都被接受-

    • 只有大写字母
    • 5到10之间的整数?

    哦-上面数据部分的field1并不重要,它是一个期望的默认值。

    我试过各种各样的主意- here , here , here

    here

    here

    here

    有人知道怎么解决这个问题吗?我没主意了。。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jason Desrosiers    6 年前

    你是一个正确的轨道 oneOf anyOf . 几乎每次你想的时候 其中之一 ,你真的想 . 记住 properties 模式和其他模式一样。你可以像在其他地方一样使用布尔关键字。

    {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                "field1": {
                    "title": "field1"
                    "anyOf": [
                        {
                            "type": "string",
                            "pattern": "[A-Z]"
                        },
                        {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 10
                        }
                    ]
                },
                "required": {
                    "type": "string",
                    "title": "required",
                    "readonly": true
                },
                "decisive": {
                    "type": "string",
                    "title": "Decisive",
                    "enum": ["yes", "no", "maybe", "not now"]
                }
    
            }
        }
    }
    

    编辑1

    其中之一

    {
      "type": "object",
      "properties": {
        "anyOf": [
          {
            "field1": { ... }
          },
          {
            "field1": { ... }
          }
        ],
        "required": { ... },
        "decisive": { ... }
      }
    }
    

    因为它出现在评论中,这里有一个更好的解释为什么 其中之一 其中之一 将始终代替 . 如果 如果不存在,JSON模式就不会失去任何表达能力。

    是一种更精确的工具。使用 其中之一 任何

    任何 是布尔或运算。 是布尔“异或”(XOR)运算“异或”没有什么用处,以至于现代语言甚至都不支持它。或通常用运算符表示 || . 异或没有模拟。

    方法 任何 其中的项可以是真的。 方法 只有一个 其中之一 全部的 以确保一个模式验证为true,其余模式验证为false。当你使用 ,验证程序可以在找到验证为true的模式后立即停止。这被称为“短路”,所有现代编程语言在计算或执行操作时都会这样做。当模式是互斥的(它们几乎总是互斥的)时,在找到一个模式之后继续验证模式纯粹是浪费,因此应该避免。

    我想 其中之一 因为从自然语言的角度来看,它听起来是正确的。