Python面试必考重点之数据存储第三关——如何将一个JSON文档映射为Python对象

179 阅读3分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。

面试题第三关:

第一部分——考点:

  • loads函数的用法。

第二部分——面试题:

1.面试题一:如何将一个JSON文档映射为Python对象?


第三部分——解析:

面试题一 之 将一个JSON文档映射为Python对象:

第一种方法:

  • 供我们读取的JSON文件是test.json,文件内容如下:
{
  "name": "孤寒者",
  "age": 18,
  "height": 130
}

首先,我们可以通过json模块的loads()方法将JSON文档转为Python字典类型:

# coding=utf-8
# _author__ = 孤寒者
import json

with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()

    product = json.loads(jsonStr)
    print(type(product))
    print(product['name'])

在这里插入图片描述

我们在loads()方法里使用对象钩子即可实现将一个JSON文档映射为Python对象。分析思路:

  • 我们使用对象钩子实质上总共做了两步:先通过loads()方法将JSON文档转换为dict对象,然后将这个dict对象同时创建Product对象->将dict对象作为参数传入Product对象的构造方法__init__()方法中的第二个参数,即d。而这个d其实就是包含了这个JSON文档的字典对象,我们又在__init__()方法中将d赋值给了__dict__(就相当于你一个个写类里面的属性名=属性值),这就会将字典里的key和value映射为Product对象里的属性和属性值。
# coding=utf-8
# _author__ = 孤寒者
import json

class Product:
    def __init__(self, d):
        self.__dict__ = d

with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()

    product = json.loads(jsonStr, object_hook=Product)
    print(type(product))
    # print(product['name'])        # 这样就不行了~
    print(product.name)

在这里插入图片描述

第二种方法:

也是使用了对象钩子,不过与第一种方法不同的是,此时对象钩子指定的不再是类,而是指定一个转换函数,通过这个函数返回对象。

# coding=utf-8
# _author__ = 孤寒者
import json

class Product:
    def __init__(self, d):
        self.__dict__ = d

with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()

    def json2Product(d):
        return Product(d)
    product1 = json.loads(jsonStr, object_hook=json2Product)
    
    print(type(product1))
    print(product1.name)

在这里插入图片描述


第四部分——总结:

  • json模块的loads函数可以装载JSON文档,并将其转换为JSON对象。关键需要通过object_hook参数指定钩子对象,然后在类的构造方法中将传入的JSON对象赋给内部变量__init__

🔆In The End!

👑有关于Me

个人简介:我是一个硬件出身的计算机爱好者,喜欢program,源于热爱,乐于分享技术与所见所闻所感所得。文章涉及Python,C,单片机,HTML/CSS/JavaScript及算法,数据结构等。

从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多技术文哦~

如有错误或者言语不恰当的地方可在评论区指出,谢谢!
如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !