编写Python代码以处理JSON数组不一致性

2024-03-28 17:10:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩Python从jsonapi抓取和解析数据,具体来说,我正在使用CTA(芝加哥交通管理局)Train Tracker API。你知道吗

当存在多个“train”运行数组而不是单个“train”运行数组时,我会定期收到一个TypeError: string indices must be integers跟踪到。单个运行不在运行数组中。你知道吗

{'ctatt':
 {'tmst': '2018-03-05T01:59:10',
 'errCd': '0',
 'errNm': None,
 'route': [{'@name': 'g'},
           {'@name': 'y',
            'train': {'rn': '030',
                     .....
                      'heading': '302'},
           {'@name': 'blue',
            'train': [{'rn': '125',
                     .....
                       'heading': '302'},
                      {'rn': '127',
                     ..... 
                       'heading': '278'},

“g”路由没有运行实例。 “y”路线有1条路线。你知道吗

  'train': {'rn':}

“蓝色”路线有多条路线。你知道吗

  'train': [{'rn': ...},{'rn': ...},{'rn': ...}]

我用来解析的代码处理了缺少运行和多次运行的问题。它以1次运行命中TypeError。你知道吗

for train_rt in trains_data['ctatt']['route']:
    line_name = train_rt['@name']
    if train_rt.get('train', 'None') != 'None':
        for train_run in train_rt['train']:

处理不在阵列中的单个运行的最佳方法是什么?你知道吗

2 Yellow Line Runs in Chrome: Dev Tools: Network: Preview

1 Yellow Line Run in Chrome: Dev Tools: Network: Preview

我注意到的一个不一致之处是,如果我查询单个路由,这些路由仍然位于一个由1个路由组成的数组中。你知道吗


Tags: nameinnone路由fortrain数组rn
1条回答
网友
1楼 · 发布于 2024-03-28 17:10:11

您有两种选择:

  • 使用isinstance()显式测试列表或字典
  • 将您的访问放到try:...except中并捕获TypeError,然后继续将其作为单个元素处理。你知道吗

你选择哪一种并不重要(但是有can be a performance difference),选择你认为最适合你的代码的样式。你知道吗

例如,如果使用isistance()测试,可以在单个元素周围添加一个列表,这样代码的其余部分就不必更改:

for train_rt in trains_data['ctatt']['route']:
    line_name = train_rt['@name']

    train_runs = train_rt.get('train', [])
    if not isinstance(train_runs, list):
        # single entry, wrap
        train_runs = [train_runs]

    for train_run in train_runs:
        # ...

请注意,如果缺少'train'键,则上述代码将使用空列表再次正常化。这允许您避免另一个if测试,因为现在for循环根本不会迭代。你知道吗

如果您有该API的支持联系人,我至少会报告这个问题,并指出它们的数据结构不一致。你知道吗

相关问题 更多 >