JSON 是一种轻量级的数据交换格式。在使用 JSON 进行数据交互时,我们常常需要进行 JSON 的序列化和反序列化操作。而 JSON 反序列化中的循环引用问题也是一个普遍存在的问题。
什么是循环引用呢?简单来说就是对象之间存在相互引用的情况。例如,A 对象引用了 B 对象,而 B 对象又引用了 A 对象,这样就形成了循环引用。
对于循环引用的情况,我们需要对数据进行特殊处理,以保证反序列化的正确性。下面,我们通过 Python 中的 JSON 库来看一下如何处理循环引用。
import json class Person: def __init__(self, name, age): self.name = name self.age = age self.friend = None person1 = Person('Tom', 18) person2 = Person('John', 20) person1.friend = person2 person2.friend = person1 data = json.dumps(person1, default=lambda obj: obj.__dict__) # 报错信息: # TypeError: <__main__.person object="" at=""> is not JSON serializable # 上面的代码会报错,因为 JSON 默认处理不了循环引用的情况。 # 我们可以通过将 friend 属性设置为 None,就可以避免循环引用的问题了。 class Person: def __init__(self, name, age): self.name = name self.age = age self.friend = None person1 = Person('Tom', 18) person2 = Person('John', 20) person1.friend = person2 person2.friend = None data = json.dumps(person1, default=lambda obj: obj.__dict__) print(data) # 输出: # {"name": "Tom", "age": 18, "friend": {"name": "John", "age": 20, "friend": null}}
我们可以发现,上面的代码通过将 friend 属性设置为 None,成功地避免了循环引用的问题,同时也完成了 JSON 的序列化操作。