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

C#使用NewtonSoft.Json反序列化JSON为dynamic的最佳方法

C# Newtonsoft.Json 反序列化dynamic提取results数组简化方案

你原有代码的冗余问题主要来自不必要的二次反序列化、靠索引位置取字段的非结构化访问,Newtonsoft.Json反序列化返回的dynamic对象原生支持命名属性直接访问,不需要额外转换。

核心优化点

  • 仅需一次根节点反序列化,无需对results字段做字符串转义后二次反序列化
  • 直接通过属性名访问字段,完全替代靠数组位置取id的脆弱写法,避免接口字段顺序变动导致的逻辑错误
  • 保留原有业务校验逻辑,不改动删除图片的核心流程

简化后实现代码

var searchprod = wscli.BuscarImagensPorProdutoId(prodSku.ToString());
// 单次反序列化拿到根节点动态对象
dynamic root = JsonConvert.DeserializeObject(searchprod.Result.ToString());
// 直接访问results属性拿到数组,无需额外转换
JArray results = root.results;

if (results != null && results.HasValues)
{
    foreach (dynamic item in results)
    {
        // 命名属性直接取id,无需依赖字段顺序
        string id = item.id?.ToString();
        if (!string.IsNullOrEmpty(id))
        {
            var res = await wscli.ExcluirImagemProduto(id);

            if (res == null || res is string)
            {
                throw new Exception($"图片{id}删除失败,详情:{(res == null ? "返回结果为空" : res.ToString())}");
            }

            if (res.status == null || res.status.ToString() != "OK")
            {
                throw new Exception($"图片{id}删除失败,关联商品SKU:{prodSku},详情:{JsonConvert.SerializeObject(res)}");
            }
        }
    }
}

非dynamic通用对象替代写法

如果需要完全不使用dynamic,用Newtonsoft内置的通用JToken对象处理逻辑完全一致,同样不需要定义强类型类:

JObject root = JObject.Parse(searchprod.Result.ToString());
JArray results = (JArray)root["results"];

if (results != null && results.HasValues)
{
    foreach (JObject item in results)
    {
        string id = item["id"]?.ToString();
        // 后续业务逻辑和上面完全相同
    }
}

说明:Newtonsoft.Json反序列化dynamic时,底层实际返回的是JObject/JArray类型,动态属性访问本质是对JObject["属性名"]索引器的封装,不存在额外性能损耗,比二次反序列化、索引取字段的写法性能更高、可维护性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:39:27