搜索JSON,返回JSON结构中的字符串

时间:2016-09-14 12:46:52

标签: python json

我有一组看起来与此类似的JSON数据:

{"executions": [
{
  "id": 17,
  "orderId": 16,
  "executionStatus": "1",
  "cycleId": 5,
  "projectId": 15006,
  "issueId": 133038,
  "issueKey": "QTCMP-8",
  "label": "",
  "component": "",
  "projectKey": "QTCMP",
  "executionDefectCount": 0,
  "stepDefectCount": 0,
  "totalDefectCount": 0
},
{
  "id": 14,
  "orderId": 14,
  "executionStatus": "1",
  "cycleId": 5,
  "projectId": 15006,
  "issueId": 133042,
  "issueKey": "QTCMP-10",
  "label": "",
  "component": "",
  "projectKey": "QTCMP",
  "executionDefectCount": 0,
  "stepDefectCount": 0,
  "totalDefectCount": 0
    }
  ],
  "currentlySelectedExecutionId": "",
  "recordsCount": 4
}

我已经采用了这个并用Python解析它,如下所示:

import json
import pprint

with open('file.json') as dataFile:
    data = json.load(dataFile)

通过这种方式,我可以通过执行数据["执行"]等来查找执行数据集。我需要做的是搜索字符串" QTCMP- 8"在结构内,然后当我找到特定字符串时,找到" id"与该字符串相关联的。所以在QTCMP-8的情况下,它将是id 17;对于QTCMP-10,它将是14。

这可能吗?我需要先转换数据吗?非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

你不能以O(1)的计算顺序执行此操作,至少现在是这样。以下是每次搜索都具有O(n)复杂度的解决方案。

id = None
for dic in executions:
    if dic['issueKey'] == query:
        id = dic['id']
        break

在O(1)中执行此操作,需要对O(n)进行预处理,其中您按 issueKey 对执行进行分类,并在其中保存您想要的任何信息。

# Preprocessing of O(n)
mapping = dict()
for dic in executions:
    mapping[dic['issueKey']] = {
        'id':  dic['id'],
        'whatever': 'whateverel'
    }

# Now you can query in O(1)

return dic[query]['id']

如果您正在进行大量的json查询,您可能还想考虑使用MongoDB或喜欢它。

答案 1 :(得分:0)

带条件的简单迭代将完成工作:

for execution in data['executions']:
    if "QTCMP" in execution['issueKey']:
        print(execution["id"])

# -> 17
# -> 14

答案 2 :(得分:0)

您可以获取所有ID的列表:

>>> [item['id'] for item in my_json['executions'] if item['issueKey'].startswith('QTCMP')]
[17, 14]

其中my_json是存储JSON结构的变量

注意:我使用item['issueKey'].startswith('QTCMP')代替'QTCMP' in item['issueKey'],因为您需要以QTCMP开头的项目ID。例如,如果值为XXXQTCMP,则其ID不应与结果一起显示(但使用True语句时将显示为in