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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:56:34