You need to enable JavaScript to run this app. C# 如何从含嵌套转义的API响应JSON数组提取商品详情列表
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何从含嵌套转义的API响应JSON数组提取商品详情列表

C# 从多层嵌套转义JSON中提取商品详情的实现方案

核心解析难点

对应给出的API响应报文,直接做反序列化大概率会触发格式错误,主要原因是:

  • shipping_address、payment_status、delivery_status、product_details 这些字段的返回值不是原生JSON结构,是经过转义的字符串,不能直接映射成对象/数组
  • product_details 数组内的每个元素,外层包裹了一个无固定规则的哈希随机键,结构为{"随机哈希值":{真实商品对象}},没有固定属性名,无法直接通过强类型类映射
  • 商品对象内的option字段,本身又是一层嵌套的转义JSON字符串

具体实现流程

目前C#生态中处理这类多层嵌套JSON最稳妥的工具是Newtonsoft.Json,通过Nuget安装即可,安装命令为:
Install-Package Newtonsoft.Json

第一步:定义外层固定结构的模型类

只对结构固定的外层字段做强类型映射,减少手写解析的工作量:

// 最外层API响应模型
public class ApiResponse
{
    public string Status { get; set; }
    public List<OrderInfo> Result { get; set; }
}

// 单个订单的基础模型
public class OrderInfo
{
    public string order_id { get; set; }
    public string order_amount { get; set; }
    public string delivery_api_status { get; set; }
    // 注意:product_details的元素是字符串,不要直接定义成商品对象列表
    public List<string> product_details { get; set; }
    // 其他需要用到的订单字段按需补充即可
}

// 最终需要的商品详情模型
public class ProductItem
{
    public string id { get; set; }
    public int qty { get; set; }
    public decimal price { get; set; }
    public string name { get; set; }
    public string image { get; set; }
    public string rowid { get; set; }
    public decimal subtotal { get; set; }
    // 其他需要的商品字段按需补充即可
}

第二步:逐层级解包转义的JSON结构

因为存在多层嵌套转义,需要逐层拆分解析:

// 假设jsonResponse是从API拿到的完整响应字符串
var baseResponse = JsonConvert.DeserializeObject<ApiResponse>(jsonResponse);
var finalProductList = new List<ProductItem>();

foreach (var order in baseResponse.Result)
{
    // 遍历每个商品的转义字符串
    foreach (var productWrapStr in order.product_details)
    {
        // 第一层解包:把转义字符串解析为动态对象,拿到随机哈希键对应的真实商品节点
        var wrapNode = JObject.Parse(productWrapStr);
        // 因为哈希键是随机生成的,直接取第一个属性的子节点即可
        var realProductNode = wrapNode.Properties().First().Value;
        // 转换为强类型商品对象,加入最终列表
        var product = realProductNode.ToObject<ProductItem>();
        finalProductList.Add(product);
    }
}

灵活解析提示:如果不想提前定义大量模型类,也可以直接用JObject/JArray动态取值,适配性更强:

  • 解析转义的对象字符串(比如shipping_address字段):用JObject.Parse(字段值)转成动态对象后直接按属性名取值
  • 解析转义的数组字符串(比如payment_status、delivery_status字段):用JArray.Parse(字段值)转成动态数组后遍历取值
  • 商品内嵌套的option字段:拿到字符串值后用JObject.Parse解包即可

内容的提问来源于stack exchange,提问作者Venkatesh S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 13:36:07