C#反序列化API返回的多对象JSON字符串失败求助
解决C#中反序列化包含多个对象的JSON问题
我来帮你搞定这个反序列化的坑!首先看你提供的JSON结构,核心是一个包含purchaseOrders数组的根对象,咱们一步步来解决:
第一步:定义匹配的C#实体类
反序列化失败最常见的原因就是实体类和JSON结构不匹配,咱们先把对应类写出来:
// 根对象类,对应整个JSON的最外层 public class PurchaseOrderRoot { // 对应JSON里的purchaseOrders数组 public List<PurchaseOrder> PurchaseOrders { get; set; } } // 采购订单类,对应数组里的每个订单对象 public class PurchaseOrder { public string SupplierId { get; set; } public string CurrencyCode { get; set; } public string CompanyId { get; set; } public string CompanyName { get; set; } // 订单行数组 public List<PurchaseOrderLine> PurchaseOrderLines { get; set; } public string OrderIdentifier { get; set; } // 如果还有其他字段,直接在这里补充对应的属性就行 } // 采购订单行类 public class PurchaseOrderLine { public string LineNumber { get; set; } public string ItemNumber { get; set; } public string ItemDescription { get; set; } // 这里用decimal比double更适合金额类型 public decimal UnitPrice { get; set; } public int Quantity { get; set; } public bool IsServiceBased { get; set; } public string TaxIndicator1 { get; set; } public string TaxIndicator2 { get; set; } public string Unit { get; set; } public List<object> DeliveryLines { get; set; } public List<object> SupplierItems { get; set; } public bool IsActive { get; set; } }
如果你的JSON字段是小驼峰命名(比如supplierId)而C#用的是大驼峰(SupplierId),别担心,只需要给属性加个特性映射就行:
- 用
System.Text.Json的话,加[JsonPropertyName("supplierId")] - 用
Newtonsoft.Json的话,加[JsonProperty("supplierId")]
第二步:执行反序列化操作
下面给你两种最常用的反序列化方案:
方案1:用.NET自带的System.Text.Json(推荐.NET Core/.NET 5+使用)
using System.Text.Json; // 假设你的JSON字符串存在jsonStr变量里 string jsonStr = "你的完整JSON字符串"; // 反序列化到根对象 var result = JsonSerializer.Deserialize<PurchaseOrderRoot>(jsonStr); // 之后就可以正常访问数据了,比如遍历所有采购订单 foreach (var order in result.PurchaseOrders) { Console.WriteLine($"订单编号:{order.OrderIdentifier}"); foreach (var line in order.PurchaseOrderLines) { Console.WriteLine($"商品编号:{line.ItemNumber},单价:{line.UnitPrice}"); } }
如果遇到大小写不匹配的问题,可以配置序列化选项:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 忽略大小写匹配 WriteIndented = true }; var result = JsonSerializer.Deserialize<PurchaseOrderRoot>(jsonStr, options);
方案2:用Newtonsoft.Json(Json.NET,老项目常用)
如果你的项目还在用.NET Framework,或者需要更灵活的序列化功能,就用这个:
首先需要通过NuGet安装Newtonsoft.Json包,然后执行代码:
using Newtonsoft.Json; string jsonStr = "你的完整JSON字符串"; var result = JsonConvert.DeserializeObject<PurchaseOrderRoot>(jsonStr); // 同样可以遍历数据 foreach (var order in result.PurchaseOrders) { Console.WriteLine($"供应商ID:{order.SupplierId}"); }
常见问题排查
如果还是反序列化失败,先检查这几点:
- 确保你的JSON是完整且语法正确的(你提供的JSON末尾有
"...",要确认实际API返回的是完整的JSON,没有语法错误) - 实体类的属性类型和JSON字段完全匹配:比如JSON里的
unitPrice是数字,别在C#里写成string;quantity是整数,别写成decimal - 如果API返回的JSON有一些你不需要的字段,可以配置反序列化忽略未知字段:
- System.Text.Json:在JsonSerializerOptions里加
IgnoreUnknownFields = true - Newtonsoft.Json:用
JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore }
- System.Text.Json:在JsonSerializerOptions里加
内容的提问来源于stack exchange,提问作者Pedro Lopes
相关产品推荐
相关产品推荐

