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

ASP.NET Core 3.1中Json反序列化List<long>失败问题排查

问题原因与解决方案

嘿,我一眼就发现问题的核心了——你的JSON结构和目标POCO类的层级不匹配!

问题根源

你提供的JSON字符串最外层是一个包含idsModel属性的根对象:

{"idsModel":{"IdsToDraft":[792,793,794]}}

但你直接把它反序列化为IdsModel类型,这相当于告诉序列化器“整个JSON就是一个IdsModel实例”,但实际上IdsModel是嵌套在根对象的idsModel字段里面的。这就导致序列化器找不到匹配IdsModel类的属性,所以虽然实例被创建了,但IdsToDraft自然就是null。

解决方法

有两种简单的方式可以修复这个问题:

方法一:创建根类匹配JSON结构

定义一个包含IdsModel属性的根类,让它和JSON的层级完全对应:

public class RootObject
{
    public IdsModel IdsModel { get; set; }
}

然后反序列化到这个根类,再取出内层的IdsModel:

// 使用Newtonsoft.Json
var root = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(body);
var idsModel = root.IdsModel; // 此时IdsToDraft会正确包含[792,793,794]

// 使用System.Text.Json
var root = System.Text.Json.JsonSerializer.Deserialize<RootObject>(body);
var idsModel = root.IdsModel;

方法二:直接定位内层节点反序列化

如果不想额外定义根类,可以先解析JSON,定位到idsModel节点后再反序列化:

// 使用Newtonsoft.Json的JObject
var jObject = Newtonsoft.Json.Linq.JObject.Parse(body);
var idsModel = jObject["idsModel"].ToObject<IdsModel>();

// 使用System.Text.Json的JsonDocument
using (var doc = System.Text.Json.JsonDocument.Parse(body))
{
    var idsModelElement = doc.RootElement.GetProperty("idsModel");
    var idsModel = idsModelElement.Deserialize<IdsModel>();
}

补充说明

你之前调整大小写没用的原因是:问题根本不在大小写匹配上(Newtonsoft默认支持驼峰和PascalCase的自动映射,System.Text.Json也可以通过配置JsonSerializerOptions.PropertyNameCaseInsensitive = true来忽略大小写)。真正的问题是JSON的层级和目标类不匹配,这才是导致IdsToDraft为null的关键。

内容的提问来源于stack exchange,提问作者Shawn de Wet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:42:50