在Python中解析JSON MSG

时间:2018-05-23 17:22:13

标签: python json

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

作为参考,使用python MQTT处理程序从Things Network接收消息。

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

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

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

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

有没有办法解析这个问题,以便我同时得到数据和变量名?

谢谢!

编辑:

从上面的输入中,我想得到一个包含变量名和数据的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)

上面显示的输入是通过将其作为'data'传递给json2obj来创建的。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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