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

反序列化含逗号分隔值的JSON时LinkNames为空,求解决方案

解决JSON反序列化时逗号分隔值转列表为null的问题

你遇到的核心问题是:JSON中不存在LinkNames字段,默认反序列化器无法自动将Link和LinkDisplayName的逗号分隔值转换为LinkNames列表,导致该属性始终为null。要实现需求,需通过自定义JSON转换器手动处理字段拆分逻辑。

输入JSON

{
  "SolutionTabletSubSectionUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "SolutionTabletSubSectionId": 1,
  "SolutionTabletUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "Title": "string",
  "SubTitle": "string",
  "Description": "string",
  "Link": "www.google.com,www.facebook.com",
  "LinkDisplayName": "DisplayName1,DisplayName2",
  "SolutionTabletConfigurationUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "SolutionTabletTemplateUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "ImageName": "string",
  "ImagePath": "string",
  "DisplayOrderId": 0,
  "TemplateComponentUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "FooterTitle": "string",
  "FooterDescription": "string"
}

现有类定义(问题点)

当前MyClass的LinkNames无对应JSON字段,反序列化后默认赋值为null:

public class MyClass
{
    public Guid SolutionTabletSubSectionUId { get; set; }
    public int SolutionTabletSubSectionId { get; set; }
    public string LinkDisplayName { get; set; }
    public string Link { get; set; }
    public List<LinkNamesNode> LinkNames { get; set; }
}

public class LinkNamesNode
{
    public string LinkDisplayName { get; set; }
    public string Link { get; set; }
}

解决方案

1. 自定义JSON转换器

创建继承自JsonConverter<MyClass>的转换器,在反序列化过程中拆分逗号分隔字段并生成LinkNames列表:

public class MyClassConverter : JsonConverter<MyClass>
{
    public override MyClass ReadJson(JsonReader reader, Type objectType, MyClass existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        var myClass = new MyClass();

        // 自动映射基础字段
        serializer.Populate(jObject.CreateReader(), myClass);

        // 拆分逗号分隔值,生成LinkNames列表
        var links = myClass.Link?.Split(',', StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty<string>();
        var displayNames = myClass.LinkDisplayName?.Split(',', StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty<string>();

        myClass.LinkNames = new List<LinkNamesNode>();
        var maxCount = Math.Max(links.Length, displayNames.Length);
        for (int i = 0; i < maxCount; i++)
        {
            myClass.LinkNames.Add(new LinkNamesNode
            {
                Link = i < links.Length ? links[i].Trim() : null,
                LinkDisplayName = i < displayNames.Length ? displayNames[i].Trim() : null
            });
        }

        return myClass;
    }

    public override void WriteJson(JsonWriter writer, MyClass value, JsonSerializer serializer)
    {
        // 如需序列化回JSON,可在此实现反向合并逻辑
        serializer.Serialize(writer, value);
    }
}

2. 修改MyClass添加转换器特性

在MyClass上标注自定义转换器,并忽略原逗号分隔字段(避免最终输出冗余内容):

[JsonConverter(typeof(MyClassConverter))]
public class MyClass
{
    public Guid SolutionTabletSubSectionUId { get; set; }
    public int SolutionTabletSubSectionId { get; set; }
    
    // 标记为忽略,不在最终输出中保留原字段
    [JsonIgnore]
    public string LinkDisplayName { get; set; }
    
    [JsonIgnore]
    public string Link { get; set; }
    
    public List<LinkNamesNode> LinkNames { get; set; }
}

public class LinkNamesNode
{
    public string LinkDisplayName { get; set; }
    public string Link { get; set; }
}

// 补充MySubClass定义
public class MySubClass
{
    public string LoggedInUser { get; set; }
    public List<MyClass> Data { get; set; }
}

3. 反序列化代码调整

直接使用JsonConvert.DeserializeObject,转换器会自动生效:

// input为你的JSON字符串
var myClass = JsonConvert.DeserializeObject<MyClass>(input);
var list = new List<MyClass> { myClass };

MySubClass resultSet = new MySubClass();
resultSet.Data = list;
resultSet.LoggedInUser = "string";

// 验证输出结果
var outputJson = JsonConvert.SerializeObject(resultSet, Formatting.Indented);

最终输出JSON

运行后将得到符合预期的结果:

{
  "LoggedInUser": "string",
  "Data": [
    {
      "SolutionTabletSubSectionUId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "SolutionTabletSubSectionId": 1,
      "LinkNames": [
        {
          "LinkDisplayName": "DisplayName1",
          "Link": "www.google.com"
        },
        {
          "LinkDisplayName": "DisplayName2",
          "Link": "www.facebook.com"
        }
      ]
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:55:00