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

作者:??孤寒者???? 时间:2023-01-02 01:30:46 

前言:

如何将一个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'])

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

我们在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)

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

第二种方法

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

# 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)

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

小结:

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))

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

面试题二 之 将对象列表转换为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)

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

上面截图可以看出来我们确实已经将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))

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

总结

  • json模块的dumps函数用于将对象转换为JSON字符串。

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

来源:https://juejin.cn/post/7066062062295711751

标签:JSON,文档,互转,Python,对象
0
投稿

猜你喜欢

  • 分析与比较五种MySQL数据库可靠性方案

    2009-07-30 08:25:00
  • pytorch的Backward过程用时太长问题及解决

    2022-12-11 00:16:06
  • Python中的random函数实例详解

    2021-01-09 13:01:49
  • Python zip()函数用法实例分析

    2022-10-28 21:39:53
  • 详解Python3迁移接口变化采坑记

    2022-12-25 14:29:49
  • 详解python 条件语句和while循环的实例代码

    2023-11-19 11:32:58
  • MySQL数据库中与 ALTER TABLE 有关的问题

    2009-01-14 11:57:00
  • 怎么用FSO生成一个UNICODE格式的文本文件

    2009-05-26 15:40:00
  • Python实现用户登录注册

    2021-01-12 17:03:42
  • 给验证码增加干扰的杂点

    2008-05-16 11:34:00
  • Go语言struct要使用 tags的原因解析

    2023-08-31 09:25:19
  • Scripting.Dictionary 对象

    2007-10-13 09:46:00
  • python中的元组与列表及元组的更改

    2023-10-19 07:28:04
  • XML简易教程之三

    2008-09-05 17:19:00
  • 让所有IE支持HTML5的解决方案

    2009-10-31 18:43:00
  • 阿里云ECS服务器部署django的方法

    2023-04-09 10:00:26
  • 响应浏览器地址栏#(hash/fragment)变化

    2009-12-28 10:45:00
  • asp Http_Referer,Server_Name和Http_Host

    2011-03-29 11:12:00
  • 在Dreamweaver中自动设置网页的水平线颜色

    2007-02-03 11:30:00
  • 谈谈从phpinfo中能获取哪些值得注意的信息

    2023-11-23 23:52:17
  • asp之家 网络编程 m.aspxhome.com