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
相关产品推荐
相关产品推荐

