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

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 }

内容的提问来源于stack exchange,提问作者Pedro Lopes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:22:05