仅根据另一个字段的值来验证字段

时间:2018-08-16 17:17:20

标签: python json jsonschema

我被要求验证另一个团队的程序创建的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”,则需要验证remitStidIndremitStid

remitImbFlag为“ N”时,我不在乎remitStidIndremitStid中的值。但是,remitStidIndremitStid仍在json文件中,并设置为空字符串。如果不希望这样做,则会导致验证失败。

remitStidInd为“ N”时,如何使验证模式忽略remitStidremitImbFlag

我尝试设置依赖项:

"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"]
},

但是由于remitStidIndremitStid仍在文件中,因此它们正在评估并且失败。

...
"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")

0 个答案:

没有答案