我得到的错误:
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()
......下面一行:
qe = JsonQ(r"C:\ShopFloor\data.json")
res = qe.at('vehicledata.result.NUM').where('Status', '=', 1).where('Process', '=', 'SPA').get()
pprint(res)
JsonQ.reset(qe)
vehicledata是一个字符串然而result.NUM是动态的,因为这样存在用于result.NUM大约2000种不同的类型的字典。我的查询是针对让所有NUMS其中状态为1和过程SPA:我怎么能得到这个工作?我想这是由于动态字典任何帮助表示赞赏
下面是从data.json一个小样本数据
{
"vehicledata": [
{
"12345678901234567": {
"Process": "SPA",
"Status": 0
}
},
{
"12345678901234567": {
"Process": "Road",
"Status": 0
}
},
或者,你可以使用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 docs,JsonQ基本上没有引擎盖下同样的事情。
根据您提供您需要将您的代码更改为以下的jsonq docs示例:
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)