使用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
相关产品推荐
相关产品推荐

