如何以多种方式验证JSON,AJV JSON?

rbpvctlc  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(105)

我目前正在尝试使用AJV Json库验证满足某些要求的Json结构。JSON结构场景将是这样的:1场景(有效、正确、必须通过)

{
"QuoteDocuments": {
"CLQuoteXML": {
"QuoteObject": {}
}
}
}

2.场景(有效,必须通过):

{
  "QuoteDocuments": {
   "CLQuoteDocument": {
    "CLQuoteObject": {}
   }
  }
}

3场景(无效,不正确):

{
"QuoteDocuments": {
"NOTEXIST": {
"NOTHING": {}
}
}
}

4.场景(无效,不正确):

{
"QuoteDocuments": {
"CLQuoteDocument": {
"CLQuoteObject": {}
},
"CLQuoteXML": {
"QuoteObject": {}
}
}
}

1.场景(无效,不正确):
{“QuoteDocuments”:{“CLQuoteDocument”:{“CLQuoteObject”:“字符串”},} }
然而,我有这样的模式规则:

{
      "QuoteDocuments": {
        "$id": "quoteDocumentsId",
        "type": "object",
        "errorMessage": {
          "type": "The ${0#} property must be an object"
        },
        "oneOf": [
          {
            "properties": {
              "CLQuoteXML": {
                "type": "object",
                "required": ["QuoteObject"]
              }
            },
            "required": ["CLQuoteXML"]
          },
          {
            "properties": {
              "CLQuoteDocument": {
                "type": "object",
                "required": ["CLQuoteObject"]
              }
            },
            "required": ["CLQuoteDocument"]
          }
        ]
      }
    }

但这对我来说不起作用,因为JSON有这样的结构:

{
"QuoteDocuments": {
"CLQuoteDocument": {
"QuoteObject": ""
}
}
}

指示这些验证错误:必须具有必需的属性“CLQuoteXML”必须具有必需的属性“CLQuoteObject”必须与oneOf中的一个架构完全匹配
这是没有意义的,因为在CLQuoteDocument属性已经存在的情况下,它不再需要指示'CLQuoteXML'是必需的,在这种情况下,它只需要指示CLQuoteObject是必需的,因为它是连续的属性。
这意味着,如果json带有CLQuoteXML属性,则不应再指示需要CLQuoteDocument属性,如果json已经具有CLQuoteDocument属性,则不应再指示需要CLQuoteXML。
然后,工作流将是,如果CLQuoteXML属性存在,则它应该仅继续验证规则,这些规则在“CLQuoteXML”下找到,这是请求QuoteObject所需的。
但是如果只有CLQuoteDocument属性而不是CLQuoteXML,那么工作流将停止或执行CLQuoteDocument下的指令,该指令将根据需要请求CLQuoteObject字段。
因为有时候json会有这样的结构:

{
"QuoteDocuments": {
"CLQuoteDocument": {
"CLQuoteObject": {}
}
}
}

要么

{
"QuoteDocuments": {
"CLQuoteXML": {
"QuoteObject": {}
}
}
}

如果json结构不同,将属性更改为该结构,则它应该给予错误。

sg2wtvxw

sg2wtvxw1#

假设您使用的是JSON Schema,而不是其他json验证的变体。
您没有对QuoteObject必须是什么给出任何约束。
给予这个试试,看看是否有效。您没有明确说明验证成功的实际要求。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "QuoteDocuments": {
            "oneOf": [
                {
                    "required": [
                        "CLQuoteXML"
                    ],
                    "type": "object",
                    "properties": {
                        "CLQuoteXML": {
                            "required": [
                                "QuoteObject"
                            ],
                            "type": "object",
                            "properties": {
                                "QuoteObject": {
                                    "$ref": "#/$defs/QuoteObject"
                                }
                            }
                        }
                    }
                },
                {
                    "required": [
                        "CLQuoteDocument"
                    ],
                    "type": "object",
                    "properties": {
                        "CLQuoteDocument": {
                            "required": [
                                "QuoteObject"
                            ],
                            "type": "object",
                            "properties": {
                                "QuoteObject": {
                                    "$ref": "#/$defs/QuoteObject"
                                }
                            }
                        }
                    }
                }
            ]
        }
    },
    "$defs": {
        "QuoteObject": {
            "type": "object",
            "properties": {}
        }
    }
}

相关问题