C#中Newtonsoft/JSON.Net无法正确反序列化JSON数组至列表
问题原因与解决方案
你的问题出在类中列表字段的访问权限和Newtonsoft.Json的序列化规则上:
Newtonsoft.Json默认只会反序列化公共(public)的字段或属性,而你定义的essential、required、forbidden都是默认私有(private)的字段,所以JSON里的对应数据无法被映射到这些字段中,导致列表为空。
修复方案(两种可选)
方案1:将字段改为公共访问权限
直接给列表字段加上public修饰符,让Newtonsoft可以访问到它们:
public class MaterialTemplate : INamed { public string name = "defaultMTemplate"; // 添加public修饰符 public List<string> essential = new List<string>(); public List<string> required = new List<string>(); public List<string> forbidden = new List<string>(); // 其余方法保持不变 public List<MaterialData> FindMaterials() { return DataController.SearchByTag<MaterialData>(essential, required, forbidden); } public string OutputData() { string output = $"Name: {name}; "; output += "Required: "; foreach(string tag in required) { output += tag + ";"; } output += " Essential: "; foreach (string tag in essential) { output += tag + ";"; } output += " Forbidden: "; foreach (string tag in forbidden) { output += tag + ";"; } return output; } public string GetName() { return name; } }
方案2:封装为公共属性(推荐,符合C#编码规范)
将字段封装成带get/set的公共属性,这是更规范的C#写法,也能被Newtonsoft正常处理:
public class MaterialTemplate : INamed { public string name = "defaultMTemplate"; // 封装为公共属性 public List<string> essential { get; set; } = new List<string>(); public List<string> required { get; set; } = new List<string>(); public List<string> forbidden { get; set; } = new List<string>(); // 其余方法保持不变 public List<MaterialData> FindMaterials() { return DataController.SearchByTag<MaterialData>(essential, required, forbidden); } public string OutputData() { string output = $"Name: {name}; "; output += "Required: "; foreach(string tag in required) { output += tag + ";"; } output += " Essential: "; foreach (string tag in essential) { output += tag + ";"; } output += " Forbidden: "; foreach (string tag in forbidden) { output += tag + ";"; } return output; } public string GetName() { return name; } }
验证
修改后,重新执行反序列化操作,调用OutputData()就能得到预期结果:Name: normalFloor; Required: wood;tile;carpet; Essential: floor; Forbidden:
内容的提问来源于stack exchange,提问作者William Rave
相关产品推荐
相关产品推荐

