一、什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简单、易读、易写而被广泛采用。它通过键值对和数组的方式表示数据,能够高效地在前后端之间传输数据,并且大多数编程语言都支持 JSON 格式。JSON 主要用于前后端数据交换、配置文件存储和 API 设计等场景,使得数据处理变得直观和一致。
二、序列化
序列化就是将对象转换为JSON格式的字符串。在python中可以直接导入JSON模块使用,这里以python为例
import json
class Person:
def __init__(self, name, age,gender):
self.name = name
self.age = age
self.gender = gender
def __str__(self) -> str:
return f"Person(name = {self.name},age = {self.age},gender = {self.gender})"
def test(self):
print("My name is ",self.name)
if __name__ == "__main__":
p = Person("张三", 20,"男")
json_string = json.dumps(p.__dict__,ensure_ascii=False)
print(json_string)
#输出结果为{"name": "张三", "age": 20, "gender": "男"}
可以看到将python中的一个对象转为了JSON字符串,但是由于JSON默认采用的编码为ASCII,所以在出现中文时,可能会出现一段类似于"\u5f20\u4e09"
的字符串,但是这并不影响,因为反序列化时,也使用ASCII,一人会被正确显示。如果觉得影响,可以禁用ASCII使用UTF-8,这样就可以正常显示中文。
在Python中通过函数dumps
将python对象转换为JSON
字符串。
序列化的底层原理就是数据类型检查与处理、递归处理复杂数据结构。
首先识别数据的类型,例如字典、列表、字符串、数字、布尔值等。将其转换为JSON中对应的对象。例如字典和列表会被转换为对应的 JSON 对象和 JSON 数组。如果遇到数据嵌套,会不断向下递归。如果遇到无法处理的数据类型,会调用默认的default()
方法进行处理。再通过指定编码为字符串返回。
二、反序列化
import json
class Person:
def __init__(self, name, age,gender):
self.name = name
self.age = age
self.gender = gender
def __str__(self) -> str:
return f"Person(name = {self.name},age = {self.age},gender = {self.gender})"
def test(self):
print("My name is ",self.name)
if __name__ == "__main__":
p = Person("张三", 20,"男")
json_string = json.dumps(p.__dict__,ensure_ascii=False)
object_dict = json.loads(json_string)
p1 = Person(**object_dict)
p1.test()
#输出My name is 张三
注意这里的反序列化返回的是一个字典对象,而不是Person对象。
四、自定义序列化
import json
class PersonEncoder(json.JSONEncoder):
def default(self, obj):
'''自定义序列化器'''
if isinstance(obj, Person):
return obj.__dict__
return super().default(obj)
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def __str__(self) -> str:
return f"Person(name={self.name}, age={self.age}, gender={self.gender})"
def test(self):
print("My name is", self.name)
def person_decoder(obj):
'''自定义解码器'''
try:
return Person(**obj)
except TypeError as e:
raise TypeError(f"类型 {type(obj)} 无法被正确解码: {e}")
if __name__ == "__main__":
p = Person("张三", 20, "男")
json_string = json.dumps(p, cls=PersonEncoder, ensure_ascii=False)
print(json_string)
person_obj = json.loads(json_string, object_hook=person_decoder)
person_obj.test()
自定义序列化器通过继承 json.JSONEncoder
类并重写 default
方法,来实现对特定对象类型的定制化 JSON 序列化。default
方法接收一个对象作为参数,并将该对象转换为可序列化的基本数据类型(如字典、列表、字符串等)。如果 default
方法遇到不支持的类型,可以调用父类的 default
方法以处理其他情况。通过这种方式,自定义序列化器可以将复杂的用户定义对象转换为 JSON 字符串,从而满足特定的序列化需求。
五、总结
JSON广泛应用于现代软件开发中,尤其是在前后端数据交互和配置文件处理方面。其主要特点包括易于阅读和编写、格式简洁且结构明确。JSON 支持基本数据类型,如字符串、数字、布尔值、数组、对象和 null
,使得它能够灵活地表示复杂的数据结构。由于 JSON 是纯文本格式,它能够与多种编程语言和平台兼容,并且被绝大多数开发环境和框架所支持。
JSON 常用于 Web 开发中,作为客户端与服务器之间的数据传输格式,便于实现动态网页和响应式设计。在 Web API 中,JSON 作为标准的数据返回格式,使得不同系统和应用程序能够高效地交换信息。此外,JSON 还被广泛用作应用程序的配置文件格式(如 package.json
和 tsconfig.json
),因其易于编辑和解析。JSON 的广泛应用和标准化支持,使其成为现代开发中的重要工具,大大简化了数据交换和处理过程,提高了开发效率和系统的互操作性。