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

如何为JavaScriptSerializer添加映射生成自定义精简JSON(不使用JsonProperty)

自定义JavaScriptSerializer实现外部类属性映射精简键名

因为无法修改外部库的Address类,也不能使用特性标记,我们可以通过**自定义JavaScriptConverter**来实现属性到精简键名的映射,具体步骤如下:

1. 实现自定义JavaScriptConverter子类

创建一个继承自JavaScriptConverter的类,重写序列化方法,手动完成属性与目标键名的映射:

public class AddressConverter : JavaScriptConverter
{
    // 指定转换器处理的目标类型
    public override IEnumerable<Type> SupportedTypes
    {
        get { return new List<Type> { typeof(Address) }; }
    }

    // 自定义序列化逻辑
    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        var address = obj as Address;
        if (address == null)
            return new Dictionary<string, object>();

        return new Dictionary<string, object>
        {
            { "NMB", address.Number },
            { "STR", address.Street },
            { "CTY", address.City },
            { "CNT", address.Country }
        };
    }

    // 若无需反序列化Address,直接返回null即可;需要的话可补充对应逻辑
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        return null;
        // 反序列化示例(可选):
        // var address = new Address();
        // address.Number = dictionary.TryGetValue("NMB", out var nmb) ? nmb as string : null;
        // address.Street = dictionary.TryGetValue("STR", out var str) ? str as string : null;
        // address.City = dictionary.TryGetValue("CTY", out var cty) ? cty as string : null;
        // address.Country = dictionary.TryGetValue("CNT", out var cnt) ? cnt as string : null;
        // return address;
    }
}

2. 注册转换器并执行序列化

在使用JavaScriptSerializer时,注册自定义转换器即可触发映射逻辑:

// 初始化序列化器并注册转换器
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new List<JavaScriptConverter> { new AddressConverter() });

// 准备Address实例
var addressObj = new Address
{
    Number = "No 25",
    Street = "Main Street",
    City = "Matale",
    Country = "Sri Lanka"
};

// 执行序列化,得到目标格式的JSON
string resultJson = serializer.Serialize(addressObj);

执行后得到的JSON就是你期望的精简键名格式:

{
    "NMB": "No 25",
    "STR": "Main Street",
    "CTY": "Matale",
    "CNT": "Sri Lanka"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:55:20