如何查询我正确地设置一个JSON嵌套字典路径

问题描述 投票:1回答:2

我得到的错误:

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
            }
        },
python json jsonq
2个回答
1
投票

或者,你可以使用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基本上没有引擎盖下同样的事情。


1
投票

根据您提供您需要将您的代码更改为以下的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)
© www.soinside.com 2019 - 2024. All rights reserved.