我有一组看起来与此类似的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。
这可能吗?我需要先转换数据吗?非常感谢任何帮助!
答案 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
)