API返回JSON反序列化报错,求正确C#实体类定义方法
解决Newtonsoft.Json反序列化验证错误JSON的问题
首先,咱们先定位异常的核心原因:你的实体类结构和返回的JSON完全不匹配,同时还有一个拼写错误需要修正。
问题分析
先看你拿到的JSON结构:
{ "errors":{"Email": ["This field should be filled in"], "Password": ["This field should be filled in"]}, "title":"One or more validation errors occurred.", "status":400, "traceId":"8000006c-0002-fe00-b63f-84710c7967bb" }
这里的errors是一个对象(键为字段名,值为字符串数组),但你在Content类里把Errors定义成了List<Error>——这是一个数组类型,Newtonsoft.Json自然无法把对象转换成列表,所以抛出了那个序列化异常。另外你还把Title拼写成了Tutle,这会导致该字段无法被正确映射。
正确的实体类定义
根据JSON结构,我们有两种可行的定义方式:
方式1:固定字段的实体类(适合已知错误字段的场景)
如果你的接口只会返回Email和Password这两个字段的错误,用这种方式最直观:
public class Content { public ErrorDetails Errors { get; set; } public string Title { get; set; } // 修正拼写错误 public int Status { get; set; } public string TraceId { get; set; } } public class ErrorDetails { // 每个字段对应JSON里的错误数组 public List<string> Email { get; set; } public List<string> Password { get; set; } }
这个定义完全匹配JSON结构:Errors是包含Email和Password的对象,每个属性都是字符串列表,和JSON里的["This field should be filled in"]完美对应。
方式2:字典类型(适合错误字段不固定的场景)
如果之后接口可能返回其他字段的错误(比如Username、Phone等),用字典类型会更灵活,不需要每次新增错误字段都修改实体类:
public class Content { // 键是错误字段名,值是对应的错误信息列表 public Dictionary<string, List<string>> Errors { get; set; } public string Title { get; set; } public int Status { get; set; } public string TraceId { get; set; } }
这种方式可以兼容任何字段的错误返回,扩展性更强。
额外提示
如果你的属性名和JSON键名不一致(比如想把traceId改成TraceIdentifier),可以用JsonProperty特性手动指定映射:
[JsonProperty("traceId")] public string TraceIdentifier { get; set; }
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

