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

包装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);
    }
}

使用方式

有两种方式启用转换器:

  1. 特性标记:直接在ListOfStringUtility类上添加特性
[JsonConverter(typeof(ListOfStringUtilityConverter))]
public class ListOfStringUtility {
  public List<string> Items { get; set; }
  // 业务方法
}
  1. 全局配置:在序列化/反序列化时传入配置选项
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);
    }
}

使用方式

同样支持两种启用方式:

  1. 特性标记:在ListOfStringUtility类上添加特性
[JsonConverter(typeof(ListOfStringUtilityConverter))]
public class ListOfStringUtility {
  public List<string> Items { get; set; }
  // 业务方法
}
  1. 全局配置:序列化/反序列化时传入配置
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:55:05