如何为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
相关产品推荐
相关产品推荐

