Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查询时如何正确设置json的嵌套dict路径_Python_Json_Jsonq - Fatal编程技术网

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)