【问题标题】:How to access a possibly existing element derived from a JSON data tree?如何访问从 JSON 数据树派生的可能存在的元素?
【发布时间】:2012-07-28 11:13:20
【问题描述】:

我有一个从带有json.load(<filehandle>) 的 JSON 派生的相当复杂的数据结构,例如

{
    "sensors": {
        "measurements": [
            [
                null, 
                null, 
                null
            ], 
            [
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 81.54296875
                }, 
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 61.54534875
                },
                {
                    "sensor": "Fields 341", 
                    "remote": null, 
                    "mark": "reliable", 
                    "duration": 61.89378945
                }
            ]
        ]
    }
}

结果是嵌套的字典和列表,例如

{u'sensors': {u'measurements': [[None, None, None],
                            [{u'duration': 81.54296875,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'},
                             {u'duration': 61.545348750000002,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'},
                             {u'duration': 61.89378945,
                              u'mark': u'reliable',
                              u'remote': None,
                              u'sensor': u'Fields 341'}]]}}

目标是通过 sqlalchemy 获取数据并将其填充到数据库中。像这样:

for item in sensors["measurements"]:
    for j in range(len(sensors["measurements"])):
        DBTable.DBField = item[j]["sensor"]
        ...

这样做的问题是:数据中的任何部分都可以替换为null/None,以防测量错误(如第一个)。如果是这样,则应为 DBFields 分配None。如果是这种情况,则赋值引发异常:

TypeError: 'NoneType' object is unsubscriptable

有没有一种理智的方法可以让 for 循环运行而不引发异常(可能使用某种 .get() )?如果没有,处理这种不存在的数据结构的最佳方法是什么?

【问题讨论】:

    标签: python data-structures exists


    【解决方案1】:

    您可以使用您喜欢的默认值预先构建字典:

    defaults = {"sensor": None, "remote": None", "mark": None, "duration": None }
    

    那么你可以这样做:

    DBTable.DBField = item.get(j, defaults)["sensor"]
    

    您还可以将collections.defaultdict 用于默认项,这将允许您为访问的任何键提供默认值。

    【讨论】:

    • 这似乎是一个绝妙的主意。但我还不知道,我是否可以让 json 来构造 defaultdicts 而不是 dicts。我会对此进行调查。
    【解决方案2】:

    这可能行得通

    for item in sensors["measurements"]:
     for j in range(len(sensors["measurements"])):
         try:
            DBTable.DBField = item[j]["sensor"]
         except:
            DBTable.DBField = None
    

    【讨论】:

    • 是的,这行得通(已测试)。但是这个数据结构可能会变得很大(超过 200 个不同的字段,比如“传感器”),这样做会使代码变得非常臃肿,因为每个字段都需要这个结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2020-09-06
    相关资源
    最近更新 更多