0

我对 Python 和 Cerberus 还很陌生。我有一个要求,我需要验证任何空字符串或重复项的列表。以下是我所做的:

import cerberus

myschema = {'uid': {'type': 'list', 'schema': {'type': 'string', 'required' : True}}}

cerberus.rules_set_registry.add('myschema', myschema)
newval = Validator(myschema)

test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}
newval.validate(test)

由于某种原因,输出始终为“假”。
或者,我尝试了“oneof”规则并提出以下内容:

from cerberus import Validator
document = {'column_name' : ['BLAH', 'SEX', 'DOMAIN', 'DOMAIN']}

schema = {'column_name' : {'oneof' : [{'type': 'list', 'contains' : ['DOMAIN']}]} }
v = Validator(schema)
v.validate(document, schema)

以上总是返回True。我希望'oneof'可以验证重复项,而上述方法是正确的。如果我错了,这里有人可以纠正我。!
在此先感谢,
尼克斯

4

2 回答 2

2

test = {'uid' : {'10000', '10001', '10002', '10003', '10004', '10005'}}

这不是 json 中列表的有效表示。以下是

test = {'uid' : ['10000', '10001', '10002', '10003', '10004', '10005']}

这就是 Cerberus 返回 false 的原因。您可以使用print(newval.errors)打印该 json 对象的所有错误。

至于oneOf,Cerberus 将验证列表中的项目是否完全符合one约束列表中提到的约束。它不检查元素之间的关系。

于 2021-03-05T05:10:39.100 回答
0

好的。
我找不到 Cerberus 验证器的答案来检查列表中的重复项。
我检查了 Json Schema,它真的很容易。下面是代码:

from jsonschema import validate

schema = { "type": "array", "uniqueItems": True}

mylist  = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']

# Returns None if validated; else a validation error
validate(instance = mylist, schema = schema)

在 Cerberus 中,如果验证正确,则验证返回 True;否则为假。然而,如果验证正确,Json Schema 返回 None (在 Python 中),抛出验证错误,如下所示:

---------------------------------------------------------------------------
ValidationError                           Traceback (most recent call last)
<ipython-input-1-efa3c7f0da39> in <module>
      5 mylist  = ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
      6 
----> 7 ans = validate(instance = mylist, schema = schema)
      8 if(ans == None): print('Validated as True')

~/Library/Python/3.8/lib/python/site-packages/jsonschema/validators.py in validate(instance, schema, cls, *args, **kwargs)
    932     error = exceptions.best_match(validator.iter_errors(instance))
    933     if error is not None:
--> 934         raise error
    935 
    936 

ValidationError: ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000'] has non-unique elements

Failed validating 'uniqueItems' in schema:
    {'type': 'array', 'uniqueItems': True}

On instance:
    ['1000', '1001', '1010', '1011', '1100', '1101', '1110', '1000']
于 2020-04-20T11:45:37.853 回答