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

使用Json.NET反序列化带字符串后备字段的List<string>遇空列表问题

解决EF中List反序列化为空的问题

我来帮你分析一下问题所在,以及对应的解决办法:

核心原因:JSON序列化属性不匹配

你的代码里用了[JsonProperty](Newtonsoft.Json的特性),但如果你的项目是.NET Core 3.0+或.NET 5+,默认使用的是System.Text.Json序列化库,这个库不识别[JsonProperty]属性,只会识别[JsonPropertyName]。这就导致反序列化时,JSON里的UpdatedIdentifiers数组无法映射到你的类属性,setter根本没被调用,iUpdatedIdentifiers始终为null,最终getter返回空列表。

解决方案

根据你使用的序列化库,选择对应的修正方式:

方案1:改用System.Text.Json的属性(推荐,适合.NET Core/.NET 5+)

把[JsonProperty("UpdatedIdentifiers")]替换为[JsonPropertyName("UpdatedIdentifiers")],同时确保iUpdatedIdentifiers的[JsonIgnore]也是System.Text.Json的:

using System.Text.Json.Serialization;

// 替换为System.Text.Json的JsonPropertyName
[JsonPropertyName("UpdatedIdentifiers")]
[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public List<string> UpdatedIdentifiers {
    get {
        try {
            // 优化Split方式,避免歧义
            return string.IsNullOrEmpty(iUpdatedIdentifiers) 
                ? new List<string>() 
                : iUpdatedIdentifiers.Split(new[] {"###"}, StringSplitOptions.None).ToList();
        } catch {
            return new List<string>();
        }
    }
    set {
        // 用string.Join优化拼接逻辑,避免末尾多余的###
        iUpdatedIdentifiers = string.Join("###", value ?? new List<string>());
    }
}

// 替换为System.Text.Json的JsonIgnore
[JsonIgnore]
public string iUpdatedIdentifiers { get; set; }

方案2:继续使用Newtonsoft.Json(如果项目依赖它)

如果你的项目明确使用Newtonsoft.Json(比如通过AddNewtonsoftJson()配置),确保属性标记正确的同时,优化setter逻辑:

using Newtonsoft.Json;

[JsonProperty("UpdatedIdentifiers")]
[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public List<string> UpdatedIdentifiers {
    get {
        try {
            return string.IsNullOrEmpty(iUpdatedIdentifiers) 
                ? new List<string>() 
                : iUpdatedIdentifiers.Split(new[] {"###"}, StringSplitOptions.None).ToList();
        } catch {
            return new List<string>();
        }
    }
    set {
        iUpdatedIdentifiers = string.Join("###", value ?? new List<string>());
    }
}

[JsonIgnore]
public string iUpdatedIdentifiers { get; set; }

另外,ASP.NET Core项目需要在Program.cs/Startup.cs中配置Newtonsoft.Json为默认序列化器:

services.AddControllers().AddNewtonsoftJson();

额外优化点

  • 避免末尾多余分隔符:原来的循环拼接会在最后多一个###,用string.Join可以完美解决,避免分割后出现多余空元素。
  • 空值处理:在getter和setter中加入空值判断,避免NullReferenceException。
  • Split参数优化:使用数组形式的分隔符,避免Split方法的重载歧义。

这样修改后,反序列化JSON时UpdatedIdentifiers的setter会被正确调用,把数组转成存储用的分隔字符串,之后读取时也能正确还原出包含空元素的列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:37:15