如何调整C#类适配JSON响应以解决反序列化错误?
解决JSON反序列化错误及提取目标字段的方案
错误根源
你遇到的核心问题是类结构和实际JSON结构不匹配:
- 你原本把
responseDetails定义为单个BankRepDet对象,但API返回的是数组,所以反序列化时会报"无法将数组反序列化为对象"的错误; - 给
BankRepDet加JsonArray特性没用,因为这个类本身是对象类型,不是数组容器,自然会报无法创建列表的错误; - 另外
accountObject是oneOf类型(卡片/储蓄账户),直接用单一类接收会丢失数据或报错。
方案1:修正类结构适配JSON(规范写法)
步骤1:调整LinkResponseDetails的responseDetails类型
把原来的单个对象改成列表,匹配API返回的数组:
public class LinkResponseDetails { // 保留你原来的其他属性,比如statusCode等 [JsonProperty("responseDetails")] public List<BankRepDet> ResponseDetails { get; set; } }
步骤2:处理accountObject的oneOf特性
因为它可能是两种类型(卡片/储蓄账户),用抽象基类+子类的方式区分,配合Newtonsoft的JsonSubTypes特性自动识别:
- 先安装NuGet包:
Newtonsoft.Json.SubTypes - 定义类结构:
// 抽象基类,作为accountObject的统一类型 public abstract class AccountObject { } // 卡片账户类型(根据API实际返回的卡片字段补充属性) public class CardAccount : AccountObject { [JsonProperty("cardNumber")] public string CardNumber { get; set; } // 其他卡片相关属性... } // 储蓄账户类型,包含你需要的savingType和accountId public class SavingAccount : AccountObject { [JsonProperty("savingType")] public string SavingType { get; set; } [JsonProperty("accountId")] public string AccountId { get; set; } [JsonProperty("benefits")] public List<string> Benefits { get; set; } // 其他储蓄账户属性... } // 修正BankRepDet类,使用AccountObject作为accountObject的类型 public class BankRepDet { [JsonProperty("accountObject")] // 通过savingType字段判断类型:存在该字段则为SavingAccount,否则为CardAccount [JsonSubtypes.KnownSubTypeWithProperty(typeof(SavingAccount), "savingType")] [JsonSubtypes.KnownSubType(typeof(CardAccount))] public AccountObject AccountObject { get; set; } // 保留BankRepDet的其他属性... }
步骤3:反序列化并提取目标数据
var response = JsonConvert.DeserializeObject<LinkResponseDetails>(jsonResponse); // 遍历responseDetails,找到savingType匹配的accountId string targetAccountId = response.ResponseDetails .Select(det => det.AccountObject as SavingAccount) .Where(saving => saving != null && saving.SavingType == "THIS CONDITION") .Select(saving => saving.AccountId) .FirstOrDefault();
方案2:直接用JObject提取(快速写法,无需完整类结构)
如果你只需要提取accountId,不需要完整的类对象,直接用Newtonsoft的JObject解析更高效:
var jsonObj = JObject.Parse(jsonResponse); var responseDetails = (JArray)jsonObj["responseDetails"]; string targetAccountId = null; foreach (var item in responseDetails) { var accountObj = item["accountObject"]; // 判断是否是储蓄账户且savingType匹配 if (accountObj["savingType"]?.ToString() == "THIS CONDITION") { targetAccountId = accountObj["accountId"]?.ToString(); break; } }
这个写法不需要定义一堆类,适合快速解决提取特定字段的需求。
内容的提问来源于stack exchange,提问作者catInTheBox
相关产品推荐
相关产品推荐

