3

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

{
    "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() )?如果不是,那么处理这种不存在的数据结构的最佳方法是什么?

4

2 回答 2

3

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

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

然后你可以这样做:

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

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

于 2012-07-30T18:53:09.080 回答
1

可能这行得通

for item in sensors["measurements"]:
 for j in range(len(sensors["measurements"])):
     try:
        DBTable.DBField = item[j]["sensor"]
     except:
        DBTable.DBField = None
于 2012-07-30T19:32:59.800 回答