包装List<>成员为工具类时保留JSON序列化/反序列化逻辑
问题背景
原有可反序列化JSON的类X定义如下:
public class X { public int A; public List<string> B; }
对应的JSON结构示例:
{ "A": 123, "B": ["str1", "str2"] }
现在需要将List<string>替换为包含业务工具方法的ListOfStringUtility类,修改后的类定义如下:
public class X { public int A; public ListOfStringUtility B; } public class ListOfStringUtility { public List<string> Items { get; set; } // 业务相关工具方法 }
要求实现:
- 反序列化时,JSON中的"B"数组直接映射到
ListOfStringUtility的Items成员 - 序列化时,
X实例的B字段输出为数组而非包含Items的对象
System.Text.Json 实现方式
核心方案:自定义JsonConverter
通过实现JsonConverter<ListOfStringUtility>来处理双向转换逻辑:
using System.Text.Json; using System.Text.Json.Serialization; public class ListOfStringUtilityConverter : JsonConverter<ListOfStringUtility> { public override ListOfStringUtility Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化:将JSON数组转为List<string>,赋值给Items var items = JsonSerializer.Deserialize<List<string>>(ref reader, options); return new ListOfStringUtility { Items = items }; } public override void Write(Utf8JsonWriter writer, ListOfStringUtility value, JsonSerializerOptions options) { // 序列化:直接输出Items数组 JsonSerializer.Serialize(writer, value.Items, options); } }
使用方式
有两种方式启用转换器:
- 特性标记:直接在
ListOfStringUtility类上添加特性
[JsonConverter(typeof(ListOfStringUtilityConverter))] public class ListOfStringUtility { public List<string> Items { get; set; } // 业务方法 }
- 全局配置:在序列化/反序列化时传入配置选项
var options = new JsonSerializerOptions(); options.Converters.Add(new ListOfStringUtilityConverter()); // 序列化示例 X x = new X { A = 1, B = new ListOfStringUtility { Items = new List<string> { "a", "b" } } }; string json = JsonSerializer.Serialize(x, options); // 反序列化示例 string jsonStr = "{\"A\":2,\"B\":[\"c\",\"d\"]}"; X deserializedX = JsonSerializer.Deserialize<X>(jsonStr, options);
Newtonsoft.Json 实现方式
核心方案:自定义JsonConverter
实现JsonConverter<ListOfStringUtility>处理转换逻辑:
using Newtonsoft.Json; public class ListOfStringUtilityConverter : JsonConverter<ListOfStringUtility> { public override ListOfStringUtility ReadJson(JsonReader reader, Type objectType, ListOfStringUtility existingValue, bool hasExistingValue, JsonSerializer serializer) { // 反序列化:将JSON数组转为List<string> var items = serializer.Deserialize<List<string>>(reader); return new ListOfStringUtility { Items = items }; } public override void WriteJson(JsonWriter writer, ListOfStringUtility value, JsonSerializer serializer) { // 序列化:直接输出Items数组 serializer.Serialize(writer, value.Items); } }
使用方式
同样支持两种启用方式:
- 特性标记:在
ListOfStringUtility类上添加特性
[JsonConverter(typeof(ListOfStringUtilityConverter))] public class ListOfStringUtility { public List<string> Items { get; set; } // 业务方法 }
- 全局配置:序列化/反序列化时传入配置
var settings = new JsonSerializerSettings(); settings.Converters.Add(new ListOfStringUtilityConverter()); // 序列化示例 X x = new X { A = 1, B = new ListOfStringUtility { Items = new List<string> { "x", "y" } } }; string json = JsonConvert.SerializeObject(x, settings); // 反序列化示例 string jsonStr = "{\"A\":3,\"B\":[\"m\",\"n\"]}"; X deserializedX = JsonConvert.DeserializeObject<X>(jsonStr, settings);
内容的提问来源于stack exchange,提问作者James Craig Burley
相关产品推荐
相关产品推荐

