如何解决Python Cerberus在架构中嵌入数字配置数据
我有一组针对(冲击波)进行验证的文档和架构。
这些文档是来自使用不同格式的各种客户端的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,},}
并像这样添加一个schema_id
:
schema = {
"schema_id": 1,"timestamp": {"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
解决方法
因此,我没有使用哈希函数,而是将架构嵌入另一个保存信息的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,"registerId": {
"type": "string"
},"description": {
"type": "string"
}
}
}
]
我想是想得太清楚了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。