0

我有一组文档和模式正在针对(令人震惊的)进行验证。

这些文档是来自使用各种不同格式的各种不同客户端的 JSON 消息,因此为从这些客户端接收到的每个文档/消息定义了一个模式。

我想使用dispatcher(将函数调用作为值的字典)在针对匹配模式进行验证后帮助执行文档的映射/格式化。一旦我知道消息的有效模式,我就可以通过调用必要的映射函数为我的各种消费者服务创建所需的消息有效负载。

为此,我的调度程序中需要一个键,它唯一地映射到该模式的相应映射函数。还需要使用密钥来识别模式,以便可以调用正确的映射函数。

我的问题是:有没有办法将像数字 ID 这样的配置值嵌入到架构中?

我想采用这个架构:

schema = {
    "timestamp": {"type": "number"},
    "values": {
        "type": "list",
        "schema": {
            "type": "dict",
            "schema": {
                "id": {"required": True, "type": "string"},
                "v": {"required": True, "type": "number"},
                "q": {"type": "boolean"},
                "t": {"required": True, "type": "number"},
            },
        },
    },
}

并添加schema_id这样的:

schema = {
    "schema_id": 1,
    "timestamp": {"type": "number"},
    "values": {
        "type": "list",
        "schema": {
            "type": "dict",
            "schema": {
                "id": {"required": True, "type": "string"},
                "v": {"required": True, "type": "number"},
                "q": {"type": "boolean"},
                "t": {"required": True, "type": "number"},
            },
        },
    },
}

因此,在成功验证后,将创建message/document到模式之间的链接,并通过schema_id生成mapping_function的调度程序创建。

像这样的东西:

mapping_dispatcher = {1: map_function_1, 2: map_function_2...}

if Validator.validate(document, schema) is True:
    id = schema["schema_id"]

formatted_message = mapping_dispatcher[id](document)

最后的努力可能是简单地对 json 模式进行字符串化并将其用作键,但我不确定我对此有何感受(感觉很聪明但错误)......

我也可能把这一切都弄错了,有一种更聪明的方法可以做到这一点。

谢谢!

小更新

我通过对模式进行字符串化,转换为字节,然后是十六进制,然后将整数值加在一起来解决它,如下所示:

schema_id = 0
bytes_schema = str.encode(schema)
hex_schema = codecs.encode(bytes_schema, "hex") 
for char in hex_schema:
    schema_id += int(char)
>>>schema_id
36832
4

1 回答 1

0

因此,我只是将模式嵌入到另一个保存信息的 json 对象中,而不是散列函数,如下所示:

[
    {
        "schema_id": "3",
        "schema": {
            "deviceName": {
                "type": "string"
            },
            "tagName": {
                "required": true,
                "type": "string"
            },
            "deviceID": {
                "type": "string"
            },
            "success": {
                "type": "boolean"
            },
            "datatype": {
                "type": "string"
            },
            "timestamp": {
                "required": true,
                "type": "number"
            },
            "value": {
                "required": true,
                "type": "number"
            },
            "registerId": {
                "type": "string"
            },
            "description": {
                "type": "string"
            }
        }
    }
]

估计是想多了。

于 2020-11-11T05:41:30.813 回答