反序列化含逗号分隔值的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
相关产品推荐
相关产品推荐

