我被要求验证另一个团队的程序创建的json文件。我在有条件地验证其中一个对象的某些属性时遇到麻烦。这是带有对象及其属性的json文件的片段:
"productConfig": {
"aggregateFlag": "N",
"aggregateCode": "",
"companionFlag": "N",
"insertMatchCodeFlag": "N",
"pomFlag": "N",
"ncoaFlag": "N",
"cleanseAddressFlag": "N",
"frequency": "D",
"resolutionDpi": "0300",
"priority": "35",
"stidInd": "I",
"stidAuto": "270",
"remitImbFlag": "Y",
"remitStidInd": "I",
"remitStid": "030",
"keylineAppendFlag": "N",
"imbPlacementInd": "U",
"keylinePlacementInd": "U",
"hriPlacement": "LM",
"inputScanPlacement": "R3",
"outputScanPlacement": "L"
},
如果remitImbFlag
为“ Y”,则需要验证remitStidInd
和remitStid
。
当remitImbFlag
为“ N”时,我不在乎remitStidInd
和remitStid
中的值。但是,remitStidInd
和remitStid
仍在json文件中,并设置为空字符串。如果不希望这样做,则会导致验证失败。
当remitStidInd
为“ N”时,如何使验证模式忽略remitStid
和remitImbFlag
?
我尝试设置依赖项:
"remitImbFlag": {
"type": "string",
"enum": ["Y", "N"],
"options": {
"dependencies":[
{"id":"remitStidInd","value":"Y"},
{"id":"remitStid","value":"Y"}
]
}
},
"remitStidInd": {
"type": "string",
"enum": ["I", "N"]
},
"remitStid": {
"type": "string",
"enum": ["030", "032"]
},
但是由于remitStidInd
和remitStid
仍在文件中,因此它们正在评估并且失败。
...
"remitImbFlag": "N",
"remitStidInd": "",
"remitStid": "",
...
我正在使用python库jsonschema中的Draft4Validator并进行“惰性”验证以查找文件中的所有错误。
from jsonschema import Draft4Validator
...
v = Draft4Validator(schema)
error_cnt = 0
errors = list(v.iter_errors(data))
if not errors:
print("File passed validation.")
else:
print("File failed validation, found {} error(s):".format(len(errors)))
for error in sorted(errors, key=str):
error_cnt += 1
print("{}. Error at {}: {}".format(error_cnt, error.absolute_path.pop(), error.message))
print("\n")