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

Python中如何在JSON序列化时排除指定字段且保留代码可访问性?

Python JSON序列化排除指定字段同时保留字段可访问性

方法1:将check_method设为类属性

如果check_method不需要随实例变化,直接定义为类属性是最简单的方案。类属性不会被json.dumps默认序列化(默认仅序列化实例__dict__中的属性),同时主代码可以通过类或实例直接访问该字段。

import json

class Host:
    # 类属性,在类定义时初始化,主代码可通过Host.check_method或实例访问
    check_method = "ping"

    def __init__(self, name, ip):
        self.name = name
        self.ip = ip

class AppConfig:
    def __init__(self, config_name):
        self.config_name = config_name
        self.hosts = [Host("web", "192.168.1.1"), Host("db", "192.168.1.2")]

    def get_hosts(self):
        return self.hosts

# 主代码访问check_method
config = AppConfig("prod")
print(config.get_hosts()[0].check_method)  # 输出: ping

# 序列化AppConfig,自动排除check_method
json_output = json.dumps(config, default=lambda o: o.__dict__)
print(json_output)
# 输出示例: {"config_name": "prod", "hosts": [{"name": "web", "ip": "192.168.1.1"}, {"name": "db", "ip": "192.168.1.2"}]}

方法2:自定义JSON编码器(适用于实例属性场景)

如果check_method必须是实例属性,可通过自定义JSON编码器精确控制序列化的字段,确保check_method在主代码可访问的同时,序列化时被排除。

import json

class Host:
    def __init__(self, name, ip, check_method):
        self.name = name
        self.ip = ip
        self.check_method = check_method  # 实例属性,主代码可直接访问

class AppConfig:
    def __init__(self, config_name):
        self.config_name = config_name
        self.hosts = [Host("web", "192.168.1.1", "ping"), Host("db", "192.168.1.2", "tcp")]

    def get_hosts(self):
        return self.hosts

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Host):
            # 只返回需要序列化的字段,排除check_method
            return {
                "name": obj.name,
                "ip": obj.ip
            }
        elif isinstance(obj, AppConfig):
            return {
                "config_name": obj.config_name,
                "hosts": obj.get_hosts()
            }
        # 其他类型沿用默认序列化逻辑
        return super().default(obj)

# 主代码访问check_method
config = AppConfig("prod")
print(config.get_hosts()[1].check_method)  # 输出: tcp

# 使用自定义编码器序列化
json_output = json.dumps(config, cls=CustomJSONEncoder)
print(json_output)
# 输出示例: {"config_name": "prod", "hosts": [{"name": "web", "ip": "192.168.1.1"}, {"name": "db", "ip": "192.168.1.2"}]}

方法3:在类中定义序列化字段过滤方法

给Host类添加一个返回序列化字段的方法,序列化时通过default参数调用该方法,灵活控制要输出的字段。

import json

class Host:
    def __init__(self, name, ip, check_method):
        self.name = name
        self.ip = ip
        self.check_method = check_method

    # 定义过滤逻辑,返回需要序列化的字段
    def serialize(self):
        return {k: v for k, v in self.__dict__.items() if k != "check_method"}

class AppConfig:
    def __init__(self, config_name):
        self.config_name = config_name
        self.hosts = [Host("web", "192.168.1.1", "ping"), Host("db", "192.168.1.2", "tcp")]

    def get_hosts(self):
        return self.hosts

# 主代码访问check_method
config = AppConfig("prod")
print(config.get_hosts()[0].check_method)  # 输出: ping

# 序列化时调用serialize方法
json_output = json.dumps(
    config,
    default=lambda o: o.serialize() if hasattr(o, "serialize") else o.__dict__
)
print(json_output)

内容的提问来源于stack exchange,提问作者Polikarpos Goldshtein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:24