Python - JSON模块如何查询嵌套对象

时间:2017-11-02 22:35:48

标签: python json database

我正在尝试构建一个数据库支持的系统,使用Python作为引擎,JSON作为DB文件。目前,有三个文件:

# functions.py
import json
from pprint import pprint

with open('db.json') as data_file:
    data = json.load(data_file)


def getStudentByUsername(username, record):
    detail = json.load(open('db.json'))["students"][username][record]
    pprint(detail)

# main.py
import functions


functions.getStudentByUsername('youngh', 'age')

{ // db.json
  "students": {
    "youngh": {
      "name": "Hayden Young",
      "age": 13,
      "email": "user@school.county.sch.uk"
    }
  }
}

但是,我找不到像这样改变学生对象的方法,仍然按用户名查询:

{ //db.json "students": [
  {
    "username": "youngh",
    "name": "Hayden Young"
  }]
}

有什么想法吗?我是Python 3这种类型的新手。

2 个答案:

答案 0 :(得分:0)

在第二个示例中,您在列表中的字典中拥有用户属性。

您需要遍历列表并使用您寻找的用户名获取字典。

with open('db.json') as dbfile:
    for student in json.load(dbfile)["students"]:
        if student["username"] == username:
            return(student)

请记住,因为用户名包含在他们自己的单独词典中,所以现在可以有重复的用户名,而for循环方法只会返回第一个匹配。

答案 1 :(得分:0)

我认为你可以使用lambda:

#let this var be your file output after parsing to json
users = { 
    "students": 
    [
       {
            "username": "youngh",
            "name": "Hayden Young"
        }
    ]
}

def getStudentByUsername(username, record):    
    detail= filter(lambda user: username == user['username'], users["students"])
    print (next(detail)[record])

对于重复的用户名,您可以执行以下操作:

def getStudentByUsername(username, record):    
    detail= filter(lambda user: username.lower() == user['username'].lower(), users["students"])    
    while True:
        try:
            print (next(detail)[record])
        except StopIteration:
            return