C#中List<CustomClass>序列化为JSON返回空数组问题排查
关于Newtonsoft.Json序列化List返回空数组的问题
嘿,这个问题我之前也碰到过好几次,Newtonsoft.Json本身没有限制自定义类List的序列化,大概率是你的代码里有细节没注意到,我给你梳理几个最常见的排查方向:
1. 访问修饰符问题(最可能的原因)
Newtonsoft.Json默认只会序列化**公共(public)**的成员,不管是类的属性/字段,还是包含List的字段:
- 检查你的
User类:如果里面的属性/字段都是private或internal,序列化时会直接被忽略,最终导致每个User对象被序列化成空对象,整个List看起来就像空数组(如果User类本身是internal,也可能被序列化器忽略)。
解决办法:要么把成员改成public,要么给需要序列化的私有成员加上[JsonProperty]特性,比如:class User { [JsonProperty] private string Username; // 强制序列化私有字段 } - 检查UserCreator类里的
List<User>字段:如果这个字段是private,默认也不会被序列化,同样需要改成public或者添加[JsonProperty]。
2. List本身是空的?
别笑,有时候真的是我们自己的GenerateList方法没正确填充数据!先在WriteList方法里加个调试断点,确认List里确实有User对象,别冤枉了序列化器😂
3. 自定义序列化配置干扰
如果你在序列化时用了自定义的JsonSerializerSettings,比如修改了ContractResolver,可能会意外过滤掉需要序列化的成员:
比如下面的配置会改变默认序列化规则,可能导致异常:
var settings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { IgnoreSerializableAttribute = true, // 其他可能影响的配置 } }; JsonConvert.SerializeObject(userCreator, settings);
可以暂时去掉自定义配置,试试能不能正常序列化。
4. User类的构造函数问题(相对少见)
虽然序列化本身不需要无参构造函数,但如果你的User类只有带参数的构造函数,且没有标记[JsonConstructor]特性,在某些复杂场景下也可能导致序列化异常。不过这个更多影响反序列化,但也可以排查一下——给User类加个无参构造函数试试。
内容的提问来源于stack exchange,提问作者Vaethin
相关产品推荐
相关产品推荐

