从多个URL进行python json搜索
我有两个URL或json文件,它们都有相同的ID 文件1 文件2 我想从URL搜索两个json上的学生姓名以获得分数。从多个URL进行python json搜索,python,json,Python,Json,我有两个URL或json文件,它们都有相同的ID 文件1 文件2 我想从URL搜索两个json上的学生姓名以获得分数。 例如,我想搜索John,我应该同时得到John Doe和Bill,您的JSON无效。您可以使用验证JSON,并修复任何错误 验证后,您的JSON应如下所示: { "code": 200, "students": [ { "student": "John", "Total Marks": "79%",
例如,我想搜索John,我应该同时得到John Doe和Bill,您的JSON无效。您可以使用验证JSON,并修复任何错误 验证后,您的JSON应如下所示:
{
"code": 200,
"students": [
{
"student": "John",
"Total Marks": "79%",
"math": 55,
"Sience": 56
},
{
"student": "Jame",
"Total Marks": "99%",
"math": 55,
"Sience": 56
}
]
}
正如您所见,JSON缺少两个“
引号,并且每个对象中都有额外的,
逗号,这将在将JSON反序列化为对象时导致错误。出于演示目的,我将演示如何从名为data.JSON
的文件中读取JSON
首先,我们可以创建一个函数,该函数通过JSON数组并根据给定的名称查找学生:
我们还可以让它使用列表理解返回名称列表:
然后,我们可以使用上下文管理器打开JSON文件,并使用反序列化JSON。然后,我们可以在students
JSON数组上调用get_student()
:
from json import load
from json import JSONDecodeError
with open("C:\\data.json") as json_file:
try:
data = load(json_file)
print(get_student(data["students"], 'John'))
except JSONDecodeError as ex:
print(ex)
返回以下学生对象:
{'student': 'John', 'Total Marks': '79%', 'math': 55, 'Sience': 56}
如果没有找到学生,get_student()
将简单地返回None
。我还使用了try..except
捕获并打印JSON反序列化的任何错误,如果JSON文件无效,将触发异常
根据问题更新
为了使以上内容适用于多个JSON文件(本例中仅2个,如您的问题中所更新),您可以尝试以下代码。它添加了额外的逻辑,将名称按拆分,“
并比较名字。为了确保像John
和John
这样的名字被认为是相等的,我们可以使用.lower()
将两个名字都小写。此外,更好的设计是将名字和姓氏分开
from json import load
from json import JSONDecodeError
def get_student_by_firstname(data, first_name):
for item in data:
try:
firstname, _ = map(str.strip, item["student"].split(","))
except ValueError:
firstname = item["student"].strip()
if firstname.lower() == first_name.lower():
return item
files = [
"C:\\data1.json",
"C:\\data2.json"
]
for path in files:
with open(path) as json_file:
try:
json_data = load(json_file)
print(get_student_by_firstname(json_data["students"], first_name="John"))
except JSONDecodeError as ex:
print(ex)
输出:
{'student': 'John, Doe', 'Total Marks': '79%', 'math': 55, 'Sience': 56}
{'student': 'John, Bill', 'Total Marks': '69%', 'math': 58, 'Sience': 46}
from json import load
from json import JSONDecodeError
with open("C:\\data.json") as json_file:
try:
data = load(json_file)
print(get_student(data["students"], 'John'))
except JSONDecodeError as ex:
print(ex)
{'student': 'John', 'Total Marks': '79%', 'math': 55, 'Sience': 56}
from json import load
from json import JSONDecodeError
def get_student_by_firstname(data, first_name):
for item in data:
try:
firstname, _ = map(str.strip, item["student"].split(","))
except ValueError:
firstname = item["student"].strip()
if firstname.lower() == first_name.lower():
return item
files = [
"C:\\data1.json",
"C:\\data2.json"
]
for path in files:
with open(path) as json_file:
try:
json_data = load(json_file)
print(get_student_by_firstname(json_data["students"], first_name="John"))
except JSONDecodeError as ex:
print(ex)
{'student': 'John, Doe', 'Total Marks': '79%', 'math': 55, 'Sience': 56}
{'student': 'John, Bill', 'Total Marks': '69%', 'math': 58, 'Sience': 46}