使用System.Text.Json反序列化List<Element>时触发JsonException求助
问题原因
你的JSON根结构是一个包含elements数组的对象,但代码中直接尝试将整个JSON反序列化为List<Element>,两者类型不匹配,导致抛出JsonException。另外,Element类中大部分属性没有指定与JSON键的映射关系,System.Text.Json默认大小写敏感,会导致这些属性反序列化后值为null或默认值。
解决方案
1. 创建匹配JSON根结构的类
新增一个根类来对应JSON的顶层结构:
public class ElementsRoot { [JsonPropertyName("elements")] public List<Element>? Elements { get; set; } }
2. 修正Element类的属性映射
为每个属性添加JsonPropertyName特性,匹配JSON中的小写键:
public class Element { [JsonPropertyName("group")] public string? Group { get; set; } [JsonPropertyName("position")] public int Position { get; set; } [JsonPropertyName("name")] public string? Name { get; set; } [JsonPropertyName("number")] public int Number { get; set; } [JsonPropertyName("small")] public string? Sign { get; set; } [JsonPropertyName("molar")] public double Molar { get; set; } [JsonPropertyName("electrons")] public IList<int>? Electrons { get; set; } public override string ToString() { return $"{Sign} - {Name}"; } }
3. 修改反序列化代码
将JSON反序列化为ElementsRoot类型,再取出其中的元素列表:
public List<Element> LoadJson() { using (StreamReader r = new StreamReader("jsondata/elements.json")) { string json = r.ReadToEnd(); var rootObject = JsonSerializer.Deserialize<ElementsRoot>(json); // 空值处理,避免返回null return rootObject?.Elements ?? new List<Element>(); } }
可选:开启大小写不敏感匹配
如果你不想逐个添加JsonPropertyName,也可以通过配置开启大小写不敏感的属性匹配:
public List<Element> LoadJson() { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; using (StreamReader r = new StreamReader("jsondata/elements.json")) { string json = r.ReadToEnd(); var rootObject = JsonSerializer.Deserialize<ElementsRoot>(json, options); return rootObject?.Elements ?? new List<Element>(); } }
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

