利用python实现JSON文档与Python对象互相转换

 更新时间:2022年06月13日 10:29:01   作者:​ 孤寒者   ​  
这篇文章主要介绍了利用python实现JSON文档与Python对象互相转换,通过对将一个JSON文档映射为Python对象问题的展开介绍主题内容,需要的朋友可以参考一下

前言:

如何将一个JSON文档映射为Python对象主要包括一下三个部分:

  • 考点:loads函数的用法。
  • 面试题:如何将一个JSON文档映射为Python对象?
  • 解析

一、将一个JSON文档映射为Python对象

第一种方法

供我们读取的JSON文件是test.json,文件内容如下:

{
  "name": "孤寒者",
  "age": 18,
  "height": 130
}

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

# coding=utf-8
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
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
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__

二、将一个Python对象转换为对应的JSON字符串

包括以下三点考点:

  • dumps函数的用法。
  • 面试题
    • 1.面试题一:将一个Python对象转换为对应的JSON字符串。
    • 2.面试题二:将对象列表转换为JSON数组。
  • 解析:面试题一 之 将一个Python对象转换为对应的JSON字符串:

使用dumps()函数,关键点是使用转换函数~

# coding=utf-8
import json
class Product:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height
product = Product('孤寒者', 18, 130)

def product2Dict(obj):
    return {
        'name': obj.name,
        'age': obj.age,
        'height': obj.height
    }
# dumps()方法的default参数指定转换函数。
jsonStr = json.dumps(product, default=product2Dict, ensure_ascii=False)
print(jsonStr)
print(type(jsonStr))

面试题二 之 将对象列表转换为JSON数组

  • 为了实现这一功能,我们需要一个对象列表,所以我们将JSON文档(如下test.json文件)先转为对象列表(上一题中我们已经知道如何操作了~),然后再给它转为JSON数组。
[
  {
    "name": "孤寒者",
    "age": 18,
    "height": 130
  },
  {
    "name": "小张",
    "age": 18,
    "height": 80
  }
]
# coding=utf-8
import json
class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    products = json.loads(jsonStr, object_hook=Product)
    print(products)

上面截图可以看出来我们确实已经将JSON文档转为对象列表了~ 下面开始解题:

# coding=utf-8
import json
class Product:
    def __init__(self, d):
        self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
    jsonStr = f.read()
    products = json.loads(jsonStr, object_hook=Product)
    print(products)
    for product in products:
        print(product.name)
    print("*"*25)
    # 解题部分:
    def product2Dict(obj):
        return {
            'name': obj.name,
            'age': obj.age,
            'height': obj.height
        }
    jsonStr = json.dumps(products, default=product2Dict, ensure_ascii=False)
    print(jsonStr)
    print(type(jsonStr))

总结

  • json模块的dumps函数用于将对象转换为JSON字符串。
  • 通过default参数指定一个转换函数,可以在该函数中提取对象的属性值,并生成JSON对象,最后dumps负责将转换函数返回的JSON对象转换为JSON字符串。

到此这篇关于利用python实现JSON文档与Python对象互相转换的文章就介绍到这了,更多相关JSON映射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Jupyter Notebook切换conda虚拟环境的实现步骤

    Jupyter Notebook切换conda虚拟环境的实现步骤

    本文主要介绍了Jupyter Notebook切换conda虚拟环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • python实现程序重启和系统重启方式

    python实现程序重启和系统重启方式

    这篇文章主要介绍了python实现程序重启和系统重启方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python 使用OpenCV进行简单的人像分割与合成

    python 使用OpenCV进行简单的人像分割与合成

    这篇文章主要介绍了python 使用OpenCV进行简单的人像分割与合成的方法,帮助大家更好的利用python处理图像,感兴趣的朋友可以了解下
    2021-02-02
  • Pycharm搭建Django项目详细教程(看完这一篇就够了)

    Pycharm搭建Django项目详细教程(看完这一篇就够了)

    这篇文章主要给大家介绍了关于Pycharm搭建Django项目的详细教程,想要学习的小伙伴看完这一篇就够了,pycharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,需要的朋友可以参考下
    2023-11-11
  • python3 配置logging日志类的操作

    python3 配置logging日志类的操作

    这篇文章主要介绍了python3 配置logging日志类的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python比较2个时间大小的实现方法

    Python比较2个时间大小的实现方法

    下面小编就为大家分享一篇Python比较2个时间大小的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python神经网络使用Keras进行模型的保存与读取

    python神经网络使用Keras进行模型的保存与读取

    这篇文章主要为大家介绍了python神经网络使用Keras进行模型的保存与读取,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 一篇文章搞懂Python的文件路径操作

    一篇文章搞懂Python的文件路径操作

    这篇文章主要给大家介绍了关于Python文件路径操作的相关资料,在python中我们会经常的对文件使用路径,文件路径通常有两种,分别为绝对路径、相对路径,需要的朋友可以参考下
    2023-07-07
  • CoAtNet实战之对植物幼苗图像进行分类(pytorch)

    CoAtNet实战之对植物幼苗图像进行分类(pytorch)

    谷歌的最新模型CoAtNet做了卷积 + Transformer的融合,在ImageNet-1K数据集上取得88.56%的成绩。本文主要介绍如何用CoAtNet实现植物幼苗图像的分类。感兴趣的小伙伴可以学习一下
    2021-12-12
  • Python+SeaTable实现生成条形码图片并写入表格

    Python+SeaTable实现生成条形码图片并写入表格

    不管是录入信息时需要用扫码器扫码录入,还是有别的生成条形码的需要,这在 SeaTable 表格中用 Python 脚本就可以轻松实现,本文就来为大家详细讲解一下
    2022-07-07

最新评论