Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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
Json 循环通过API多个参数_Json_Python 3.x_If Statement_Url_Python Requests - Fatal编程技术网

Json 循环通过API多个参数

Json 循环通过API多个参数,json,python-3.x,if-statement,url,python-requests,Json,Python 3.x,If Statement,Url,Python Requests,我有网站的API文档,我要找到在某个城市的学校学习过的所有用户(id为2)。通过运行此代码(all_users是一个包含上一个任务中用户的主要信息的列表): 我得到这样的数据(这里是输出的一小部分,填充了许多字段): 因此,我在参数“schools”中包含了一个参数“city”,我只需要提取那些具有此参数的用户“city”:2。我试过这个密码: school=[] for user in all_users: user_id=user.get('id') url = f'htt

我有网站的API文档,我要找到在某个城市的学校学习过的所有用户(id为2)。通过运行此代码(
all_users
是一个包含上一个任务中用户的主要信息的列表):

我得到这样的数据(这里是输出的一小部分,填充了许多字段):

因此,我在参数“schools”中包含了一个参数“city”,我只需要提取那些具有此参数的用户
“city”:2
。我试过这个密码:

school=[]
for user in all_users:
    user_id=user.get('id') 
    url = f'http://json-homework.task-sss.krasilnikov.spb.ru/api/user/get?api_key=9f66a575a6cfaaf7e43177317461d057&user_id={user_id}&fields=schools'
    data = rq.get(url)
    school=school+json.loads(data.text)["response"]
school_norm=json_normalize(school)
schools = school_norm.get('schools')
school2=[]
for i in schools:
        if "'city' : 2" in i:
            school2.append(json.loads(data.text)["response"])
sch=pd.DataFrame(school2)
但是如果i:中的“'city':2”,则它不接受这样的条件
。那么我如何才能完成这项任务呢

我的第一个任务代码是

all_users = []
for page in range(1,42):
    url=f'http://json-homework.task-sss.krasilnikov.spb.ru/api/groups/getmembers?api_key=9f66a575a6cfaaf7e43177317461d057&group_id=4508123&page={page}'
    data=rq.get(url)
    all_users = all_users + json.loads(data.text)["response"]
json_normalize(all_users)
group_data = pd.DataFrame(all_users, columns=['id','first_name','last_name']) 
group_data = group_data.sort_values('id')
group_data = group_data.set_index('id')
group_data 
以及输出:
因此,在我上面写的任务的输出中,我需要类似于这个数据框架,但只针对那些学校城市id=2的人,正如我之前解释的那样,下面的内容有点复杂,但至少应该让你离你想去的地方足够近。请注意,它假设您的数据是有效的json格式(在您的问题中不是;您必须单独处理它-

无论如何,考虑到这一点,我个人认为处理这类问题的最佳方法是使用jsonpath for python

假设您的数据由两个(有效json)组成,其中一个满足城市id为2的条件,另一个不满足:

schls ="""
[
  {
    "id": 136840302,
    "first_name": "Marina",
    "last_name": "Kushnir",
    "is_closed": "False,",
    "schools": [
      {
        "id": "352496",
        "country": 1,
        "city": 57,
        "name": "Лицей ИГУ",
        "year_from": 2015,
        "year_to": 2019,
        "class": "",
        "type": 2,
        "type_str": "Lyceum"
      }
    ]
  },
  {
    "id": 5555555555555,
    "first_name": "Marino",
    "last_name": "Kush",
    "is_closed": "False,",
    "schools": [
      {
        "id": "355556",
        "country": 1,
        "city": 2,
        "name": "Лице ИГ",
        "year_from": 2016,
        "year_to": 2018,
        "class": "",
        "type": 4,
        "type_str": "Lyceu"
      }
    ]
  }
]
"""
让我们来处理数据:

import pandas as pd
import json
from jsonpath_ng import jsonpath, parse

data = json.loads(schls)
jsn_search = parse('$..schools') #this is your search string; looking for info in the "schools" entry
match = jsn_search.find(data) #search for the search string in the loaded json
schools = []
for m in match:
    if m.context.value.get('schools')[0].get('city')== 2: #this is your condition!
        schools.append(m.context.value) #condition met; append all surrounding info to list
df=pd.DataFrame(schools)
sch = df.drop(['is_closed' , 'schools'] , axis='columns')
sch
输出:

        id      first_name  last_name
0   5555555555555   Marino  Kush

你收到了什么错误消息?TypeError:类型为“float”的参数是不可编辑的。虽然当我通过
.dtypes
检查时,“schools”列有对象类型,而不是float,但我想我有办法,但我不确定数据框应该是什么样子。根据上面的数据,你能编辑问题并显示df sh是什么吗你看起来像吗?从先前的相关任务中编辑并添加了一点。还有一个问题:在你上面的数据中,“Marina”有两个id:一个似乎是她自己的,一个似乎是她的学校id。哪个id进入你的df?我获取
索引器:如果m.context.value.get('schools')[0]。获取('city'),则在这一行
列出索引超出范围==2:
@DianaPavlova-是您的实际数据错误还是我在答案中发布的数据错误?@DianaPavlova我再试了一次,效果很好。请尝试
打印(len(匹配))
并让我知道它是否输出了
2
。如果没有,您在粘贴数据或语句时有一些输入错误。嗯,它输出1@DianaPavlova请参见此处的演示:
import pandas as pd
import json
from jsonpath_ng import jsonpath, parse

data = json.loads(schls)
jsn_search = parse('$..schools') #this is your search string; looking for info in the "schools" entry
match = jsn_search.find(data) #search for the search string in the loaded json
schools = []
for m in match:
    if m.context.value.get('schools')[0].get('city')== 2: #this is your condition!
        schools.append(m.context.value) #condition met; append all surrounding info to list
df=pd.DataFrame(schools)
sch = df.drop(['is_closed' , 'schools'] , axis='columns')
sch
        id      first_name  last_name
0   5555555555555   Marino  Kush