从多个URL进行python 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%",

我有两个URL或json文件,它们都有相同的ID

文件1

文件2

我想从URL搜索两个json上的学生姓名以获得分数。
例如,我想搜索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}