首页 > 解决方案 > 在 Python 中解析 JSON 味精

问题描述

我正在尝试将 json MSG 解析为 python dict。

作为参考,消息是使用 python MQTT 处理程序从物联网接收的。

这是我打印对象时收到的格式

msg = MSG(variable_group=MSG(data0=0, data1=0, data2=0), variable2='name', variable3='num')

在其默认状态下,我可以通过 msg.variable2 访问各个字段,例如提供“名称”但不提供变量名称本身。

这对于我将所有内容硬编码到我的系统中的情况很好,但我希望它更具适应性,并在变量进入时为它们创建新条目。

有什么方法可以解析这个,让我同时获得数据和变量名?

谢谢!

编辑:

从上面的输入,我想得到一个包含变量名和数据的python dict。

dict = 
{
variable_group : MSG(data0=0, data1=0, data2=0),
variable2 : 'name',
variable3 : 'num'
}

目前,我可以通过 for 循环访问数据,如果我打印整个结构,可以打印变量名,但不能通过循环机制访问变量名

编辑2:

在对包装进行了一些挖掘之后,发现了以下内容:

def _json_object_hook(d):
    return namedtuple("MSG", d.keys())(*d.values())


def json2obj(data):
    return json.loads(data, object_hook=_json_object_hook)

上面显示的输入是通过将其作为“数据”传递给 json2obj 来创建的。

我仍然不确定如何从这种格式中获取字典,之前没有使用过 object_hooks。

标签: pythonjson

解决方案


从下面评论中的讨论来看,MSG 对象似乎是一个从 json 对象动态创建的命名元组。

在这种情况下,您可以通过查看_fields对象来获取字段。你可以像这样 dict-ify 一个命名元组

def nt_to_dict(nt):
     return {field, getattr(nt, field) for field in nt._fields}

或者您可以通过_fields在代码中拖钓并getattr根据需要使用来检查对象


推荐阅读