如何根据特定属性的值以不同方式验证JSON数据的子集?

时间:2014-12-15 07:44:41

标签: python json django serialization django-rest-framework

我正在使用Django Rest Framework。我有一个API,我可以获得JSON数据。我有一个列表序列化程序,我试图验证父JSON中的列表。该列表如下所示:

[{
 type:"integer",
 name: "Age",
 range: [18, 60]
},
{
 type: "string",
 name: "Email",
 pattern : "email"
},
{
 type: "date",
 name: "Joining Date",
 format: "mm-dd-yyyy"
}]

我有一个处理其余数据的序列化程序。其中一个属性是此列表,由列表序列化程序处理。现在,对于列表中的单个元素,验证取决于type属性。

例如:如果类型是整数,我期望一个范围。如果type是string,我期待一个模式。 如果类型是日期,我希望有一种格式。

验证此类数据的好方法是什么?

如何验证?

1 个答案:

答案 0 :(得分:0)

我通常使用这种模式:

data = [{
    "type": "integer",
    "name": "Age",
    "range": [18, 60]
},
{
    "type": "string",
    "name": "Email",
    "pattern": "email"
},
{
    "type": "date",
    "name": "Joining Date",
    "format": "mm-dd-yyyy"
}]

rules = {
    "integer": {
        "must_contains": ["range"]
    },
    "string": {
        "must_contains": ["pattern"]
    }
}


class ValidationError(Exception):
    pass


class Validator(object):
    def __init__(self, rules):
        self.rules = rules

    @staticmethod
    def _check_contains_rule(rule, obj):
        for elem in rule.get("must_contains", ()):
            if not obj.get(elem):
                raise ValidationError("Object with type %s must contains %s!" % (obj["type"], elem))

    def validate(self, data):
        for obj in data:
            rule = self.rules.get(obj["type"])
            if rule:
                self._check_contains_rule(rule, obj)


v = Validator(rules)

v.validate(data)