大家好,欢迎来到IT知识分享网。
一、什么是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 的广泛应用和标准化支持,使其成为现代开发中的重要工具,大大简化了数据交换和处理过程,提高了开发效率和系统的互操作性。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118630.html