You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中双向链表如何序列化?如何编写通用双向链表JSON编码器

双向链表JSON序列化通用方案

双向链表序列化的核心障碍是prev/next带来的循环引用,最优方案是先将链表拍平为有序节点数组,再做序列化,反序列化时重新构建双向关联即可,这种方案结构简洁、性能损耗极低。

编写通用的双向链表编码器完全可行,核心逻辑是自动识别双向链表节点(判断是否同时存在prev、next属性),过滤关联字段后提取所有业务属性,不需要为每个节点类单独编写定制逻辑,实现代码如下:

from json import JSONEncoder

class GenericLinkedNodeEncoder(JSONEncoder):
    def default(self, o):
        # 匹配双向链表节点的特征
        if hasattr(o, "prev") and hasattr(o, "next"):
            # 过滤关联字段,提取所有业务属性
            return {
                k: v for k, v in o.__dict__.items()
                if k not in ("prev", "next")
            }
        # 非节点类型走默认序列化逻辑
        return super().default(o)

使用方法

序列化

先将双向链表转换为有序节点列表,再调用编码器即可:

import json

# 工具方法:双向链表转有序列表
def linked_list_to_array(head):
    nodes = []
    current = head
    while current:
        nodes.append(current)
        current = current.next
    return nodes

# 调用示例,支持所有带prev/next的节点类
head = ... # 你的双向链表头节点
node_arr = linked_list_to_array(head)
json_str = json.dumps(node_arr, cls=GenericLinkedNodeEncoder)

反序列化

反序列化后重新构建双向关联即可,同样是通用逻辑:

# 工具方法:属性列表转双向链表
def array_to_linked_list(attr_arr, node_cls):
    nodes = [node_cls(**attrs) for attrs in attr_arr]
    for e1, e2 in zip(nodes, nodes[1:]):
        e1.next = e2
        e2.prev = e1
    return nodes[0] if nodes else None

# 调用示例
loaded_attr_arr = json.loads(json_str)
loaded_head = array_to_linked_list(loaded_attr_arr, DataNode)

方案优势

  • 完全通用,适配所有符合「带prev/next属性的纯数据节点」模式的类,不需要重复编写编码器
  • 彻底避免循环引用问题,序列化后的JSON结构无冗余
  • 序列化、反序列化逻辑轻量,额外性能开销可忽略

内容的提问来源于stack exchange,提问作者Mark Lumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 15:45:04