You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:55:21