使用System.Text.Json反序列化JSONElement数组为List<MyItem>失败
问题分析与解决方案
核心问题
你遇到的列表项属性全为默认值(看起来像空实例)的问题,根源是System.Text.Json默认区分大小写:
- JSON中的字段是小写开头的
id、number、name - 你的
MyItem类属性是大写开头的Id、Number、Name
序列化器无法匹配字段,导致属性值未被赋值,最终得到的列表项属性都是类型默认值(int为0,string为null)。
另外你的代码存在无意义的重复操作:先把result序列化再用JsonDocument.Parse,完全可以简化流程。
解决方案
方案1:显式指定字段映射(推荐)
给MyItem的属性添加JsonPropertyName特性,明确对应JSON字段名:
using System.Text.Json.Serialization; public class MyItem { [JsonPropertyName("id")] public int Id { get; set; } [JsonPropertyName("number")] public int Number { get; set; } [JsonPropertyName("name")] public string Name { get; set; } }
方案2:配置反序列化器不区分大小写
如果不想修改类定义,可以在反序列化时设置JsonSerializerOptions:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; // 简化后的反序列化代码(跳过多余的序列化+解析步骤) var data = JsonSerializer.Deserialize<List<MyItem>>(jsonString, options); // 如果你坚持用原来的JsonDocument方式: using var doc = JsonDocument.Parse(jsonString); var e = doc.RootElement.GetProperty("data"); var data = JsonSerializer.Deserialize<List<MyItem>>(e, options);
代码优化建议
直接反序列化整个JSON结构会更清晰,建议定义根模型类:
using System.Text.Json.Serialization; public class RootModel { [JsonPropertyName("data")] public List<MyItem> Data { get; set; } [JsonPropertyName("totalCount")] public int TotalCount { get; set; } [JsonPropertyName("groupCount")] public int GroupCount { get; set; } [JsonPropertyName("summary")] public object Summary { get; set; } } // 使用方式 var root = JsonSerializer.Deserialize<RootModel>(jsonString, options); var data = root.Data;
内容的提问来源于stack exchange,提问作者Ivan-Mark Debono
相关产品推荐
相关产品推荐

