Python 查询时如何正确设置json的嵌套dict路径
我得到一个错误:Python 查询时如何正确设置json的嵌套dict路径,python,json,jsonq,Python,Json,Jsonq,我得到一个错误: Exception has occurred: KeyError 'Key not exists' File "C:\ShopFloor\main.py", line 59, in main res = qe.at('vehicledata.result.NUM').where('Status', '=', 1).where('Process', '=', 'SPA').get() File "C:\ShopFloor\main.py", line 96, in
Exception has occurred: KeyError
'Key not exists'
File "C:\ShopFloor\main.py", line 59, in main
res = qe.at('vehicledata.result.NUM').where('Status', '=', 1).where('Process', '=', 'SPA').get()
File "C:\ShopFloor\main.py", line 96, in <module>
main()
vehicledata是一个字符串,但是result.NUM是动态的,因此result.NUM大约有2000个不同的dict。我的问题旨在获取状态为1、流程为SPA的所有NUM:我如何才能使其工作?我认为这是由于动态的dict,任何帮助都是非常感谢的
下面是data.json中的一个小样本数据
{
"vehicledata": [
{
"12345678901234567": {
"Process": "SPA",
"Status": 0
}
},
{
"12345678901234567": {
"Process": "Road",
"Status": 0
}
},
根据您提供的示例,您需要将代码更改为以下内容:
from pyjsonq import JsonQ
from pprint import pprint
import json
qe = JsonQ("data.json")
res = qe.at('vehicledata').get()
l = list(map(lambda r: r.values()[0], res))
d = {"vehicledata": l}
with open('extarcted_data.json', 'wb') as outfile:
json.dump(d, outfile)
q = JsonQ("extarcted_data.json")
r = q.at('vehicledata').where('Status', '=', 1).where('Process', '=', 'SPA').get()
print(r)
JsonQ.reset(q)
JsonQ.reset(qe)
这样做的目的是,您可以获取所有可以在vehicledata
和所需对象之间更改的元素。使用标准的json
库,将以前的对象包装到新对象中,而不使用额外的层。在此之后,使用JsonQ
方便搜索。上面的代码是概念证明,可能不是最佳解决方案。根据文档JsonQ
不允许跳过层,您必须知道您的密钥才能检索数据。在您的情况下,您必须知道12345678901234567
或任何替代它的数字
另类独奏
此解决方案使JsonQ
的使用变得可疑。尽管如此,我还是会把它贴在这里作为参考:
from pyjsonq import JsonQ
from pprint import pprint
qe = JsonQ("data.json")
objs = qe.at('vehicledata').get()
for obj in objs:
values = obj.values()[0]
if 'Status' in values and values['Status'] == 1 and 'Process' in values and values['Process'] == 'SPA':
pprint(values)
JsonQ.reset(qe)
或者,您可以使用json包加载它,并以这种方式进行过滤
import json
with open('data.json', 'r') as f:
data = json.load(f)
curr_position = data['vehicledata']
result = [key for list_item in curr_position for key in list_item.keys() if list_item[key]['Status'] == 1 and list_item[key]['Process'] == 'SPA']
print(result)
据报道,JsonQ在幕后做着基本相同的事情。你能分享
数据.json
以及你想提取哪些字段吗?@DanielPryden这是一个json查询包,我发现到目前为止它非常有用,这里有一个教程@Aaron_ab添加了一个示例,请将您收到的确切错误消息添加到您的post@EcSync如果在访问vehicledata
后没有result.NUM
嵌套键,它为什么要工作?(至少,基于您提供的数据样本)这是它如何开始的,它不会返回任何数据…您在回答中的列表是在哪里打开的?运行此返回[],我认为这是因为它无法访问嵌套并找到我需要的条件specified@EcSync“展开”在at
函数下发生。在此之后,您将搜索每个对象以查找指定的条件。你希望返回什么?啊,好的,它返回空白,应该返回几百个results@EcSync我根据您的评论修改了我的解决方案。我不认为有任何好的方法可以解决这个问题,只使用JsonQ
,所以我提出了一种“解决方法”。我喜欢这种方法,但是我发现出现了以下错误异常:AttributeError'list'对象没有属性'keys'
import json
with open('data.json', 'r') as f:
data = json.load(f)
curr_position = data['vehicledata']
result = [key for list_item in curr_position for key in list_item.keys() if list_item[key]['Status'] == 1 and list_item[key]['Process'] == 'SPA']
print(result)