Python中JSON与对象互转的完整指南
本文详细介绍Python内置json库的使用方法,涵盖json.dumps、loads、dump、load四个核心API。重点解析字典与JSON字符串的互转,以及如何处理自定义类对象的序列化与反序列化问题,包括解决TypeError错误的default参数用法和object_hook回调机制。
Python JSON模块概述
Python标准库中内置了json模块,使用十分便捷。在当前开发环境中,JSON格式已成为数据交换的必备标准。
将Python对象转换为JSON字符串时,需遵循特定的类型映射规则。
Python与JSON类型转换规则
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
将JSON字符串解析为Python对象时,同样需要遵循对应的转换规则。
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true True | |
| false | False |
| null | None |
json模块核心API介绍
json模块主要提供以下四个核心API接口:
- json.loads():用于将JSON字符串解析为Python字典。
- json.dumps():用于将Python字典序列化为JSON字符串。
- json.load():用于从JSON文件中读取内容并转换为Python字典。
- json.dump():用于将Python字典写入指定的JSON文件(如person.json)。
需要注意的是,上述操作中的字典也可以由自定义类对象的属性构成。
字典与JSON字符串互转
演示如何将字典转换为JSON字符串。
import json
person = {
'name': 'jack',
'age': 15,
'email': 'jack@litets.com'
}
print('dict:', person)
person_json = json.dumps(person) # 转换为json
print('json:', person_json)
运行结果如下:
dict: {'name': 'jack', 'age': 15, 'email': 'jack@litets.com'} json: {"name": "jack", "age": 15, 'email': 'jack@litets.com'}
演示如何将JSON字符串转换回字典。
import json
person_dict = json.loads('{"name": "jack", "age": 15, "email": "jack@litets.com"}')
print('person dict:', person_dict)
运行结果如下:
person dict: {'name': 'jack', 'age': 15, 'email': 'jack@litets.com'}
类对象序列化与反序列化
演示如何将自定义类对象转换为JSON字符串。
import json
class Person:
def __init__(self, name, age, email):
self.name = name
self.age = age
self.email = email
person = Person('tom', 38, 'tom@litets.com')
person_json = json.dumps(person.__dict__)
print('person json:', person_json)
运行结果如下:
person json: {"name": "tom", 'age': 38, 'email': 'tom@litets.com'}
若直接调用json.dumps()传递类实例,会触发TypeError: Object of type Person is not JSON serializable错误。为避免此错误,需采用以下修改方案:
import json
class Person:
def __init__(self, name, age, email):
self.name = name
self.age = age
self.email = email
# 将person转换为dict
def convert2json(person):
return {
'name': person.name,
'age': person.age,
'email': person.email
}
person = Person('tom', 38, 'tom@litets.com')
# 第二个参数传递转换函数,或者使用default=lambda o: o.__dict__
person_json = json.dumps(person, default=convert2json)
print('person json:', person_json)
演示如何将JSON字符串转换回类对象。
import json
class Person:
def __init__(self, name, age, email):
self.name = name
self.age = age
self.email = email
def convert2json(dict_json):
return Person(dict_json['name'], dict_json['age'], dict_json['email'])
person = json.loads('{"name": "tom", "age": 38, "email": "tom@litets.com"}', object_hook=convert2json)
print('person:', person)
运行结果如下:
person: <__main__.Person object at 0x10a7230b8>
loads函数仅能将JSON字符串转换为字典,若需恢复为对象,需手动进行转换处理。
JSON文件读写操作
演示如何将字典或对象数据写入JSON文件。
import
person = {"name": "tom", "age": 38, "email": "tom@litets.com"}
with open('person.json', 'w') as f:
json.dump(person, f)
执行后当前目录下将生成person.json文件,其内容如下:
{"name": "tom", 'age': 38, 'email': 'tom@litets.com'}
演示如何将JSON文件内容读取并转换为字典或对象。
import json
with open('person.json', 'r') as f:
print(json.load(f))
运行结果如下:
{'name': 'tom', 'age': 38, 'email': 'tom@litets.com'}
以上内容为本文的全部介绍,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









