如何自动修复Kafka消息中缺失引号的字典键以实现JSON解析?
解决非标准JSON(键无引号)的解析问题
针对Kafka消息中字典键缺失双引号导致json.loads解析失败的问题,这里提供两种简便的自动转换方法:
方法一:正则表达式补全键的双引号
利用正则匹配未加引号的键,给它们补上双引号,再用标准json库解析。这种方法无需额外安装依赖,适合快速解决问题。
代码示例:
import re import json # 模拟Kafka消息的字节内容 msg_value = b'{time:"2022-10-23 06:55:00.000000 UTC",name:"NLU:G1H6J67 - SF, 6a, Zh. DE A", address:"11.11.11.11",address_name:null}' value_str = msg_value.decode('utf-8') # 正则替换:匹配{或,后的空白+键名,给键名添加双引号 pattern = re.compile(r'(?<=[{,]\s*)([a-zA-Z0-9_\-:]+)(?=\s*:)') fixed_str = pattern.sub(r'"\1"', value_str) # 解析为标准字典 data = json.loads(fixed_str) # 按需重命名键 data = { "cal_timestamp_time": data["time"], "device_name": data["name"], "device_ip_address": data["address"], "subscriber_ip_address": data["address_name"] } print(data)
注意:如果键名包含空格等特殊字符,需要调整正则表达式的字符范围,确保能匹配到所有可能的键名。
方法二:使用JSON5库解析
JSON5是JSON的超集,原生支持无引号键、末尾逗号等非标准语法,直接用它的解析器就能处理这类消息。
首先安装依赖:
pip install json5
代码示例:
import json5 # 模拟Kafka消息的字节内容 msg_value = b'{time:"2022-10-23 06:55:00.000000 UTC",name:"NLU:G1H6J67 - SF, 6a, Zh. DE A", address:"11.11.11.11",address_name:null}' value_str = msg_value.decode('utf-8') # 直接解析非标准JSON data = json5.loads(value_str) # 按需重命名键 data = { "cal_timestamp_time": data["time"], "device_name": data["name"], "device_ip_address": data["address"], "subscriber_ip_address": data["address_name"] } print(data)
这种方法更健壮,能处理各种复杂的非标准JSON语法,无需手动维护正则表达式,适合键名格式多样的场景。
内容的提问来源于stack exchange,提问作者cezgi
相关产品推荐
相关产品推荐

