解析JSON文件,按ID排序并返回具有最大ID的值

时间:2018-04-05 19:49:06

标签: python json

JSON文件:https://1drv.ms/u/s!AizscpxS0QM4hJpFPnbeAexYPwYu9Q

我使用此代码从整个文件中获取所有行(错误KeyError: 'job'

datapath = '1.json'

data = json.load(open(datapath))

for issue in data['executions']:
  if 'id' in issue:
       print issue['date-started']['date'], issue['date-ended']['date'], issue['status'], issue['job']['name'], issue['id']

2018-04-03T17:43:34Z 2018-04-03T17:43:38Z failed aa 126
2018-04-03T17:42:26Z 2018-04-03T17:42:31Z succeeded test 125
2018-04-03T17:41:29Z 2018-04-03T17:41:37Z succeeded aa 124
2018-04-02T21:10:22Z 2018-04-02T21:10:28Z succeeded aa 123
2018-04-02T21:09:27Z 2018-04-02T21:09:33Z failed aa 122
2018-03-30T18:20:44Z 2018-03-30T18:20:47Z succeeded aa 121
2018-03-30T17:52:54Z 2018-03-30T17:52:57Z succeeded aa 120
2018-03-30T17:31:47Z 2018-03-30T17:31:49Z succeeded aa 119
2018-03-30T17:28:15Z 2018-03-30T17:28:17Z failed aa 118
2018-03-26T19:26:08Z 2018-03-26T19:26:13Z succeeded test 117
2018-03-26T19:24:29Z 2018-03-26T19:24:33Z succeeded test 116
2018-03-26T19:23:51Z 2018-03-26T19:23:53Z failed test 115
2018-03-26T19:21:57Z 2018-03-26T19:22:00Z succeeded

它返回所有值+一个没有工作(这就是为什么我遇到错误)

需要获取具有最高职位ID的值 - issue['id'],我的&#34中的最后一个值;选择"输出中的语句最后一列

期望的输出:

2018-04-03T17:43:34Z 2018-04-03T17:43:38Z failed aa 126

需要这个,因为Zabbix无法处理多个输出,所以想要#34; feed"它与最新的工作(由问题[' id']指定)

jq已排序并将其传递给.[0],不知道python是否存在某些内容

2 个答案:

答案 0 :(得分:0)

要阻止KeyError,请更改此行:

if 'id' in issue:

...检查密钥的存在:

if 'id' in issue and 'job' in issue:

请注意,如果您正在访问job密钥(您正在打印,但不需要检查最高ID),则只需执行此操作。

获取最高ID:

max_id = 0
for issue in data['executions']:
    if 'id' in issue and issue['id'] > max_id:
        max_id = issue['id']

使用列表理解在一行中执行此操作:

max_id = max([i.get('id',0) for i in data['executions']])

*这显示了最高的问题ID,而不是最高的问题作业ID,因为没有明确说明如何在您的问题中对这些进行排名

答案 1 :(得分:0)

该文件中的某些问题具有job属性,有些不是。您需要在尝试使用它之前检查它,或使用setdefault提供默认值。

issue.setdefault('job', {'name': 'noname', 'id': -1});
print issue['date-started']['date'], issue['date-ended']['date'], issue['status'], issue['job']['name'], issue['id']