亲宝软件园·资讯

展开

JSON映射

​ 孤寒者   ​ 人气:0

前言:

如何将一个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对象。分析思路:

# 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()函数,关键点是使用转换函数~

# 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数组

[
  {
    "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))

总结

加载全部内容

相关教程
猜你喜欢
用户评论