C#反序列化JSON后如何获取所有Variant类实例的EAN值
问题根因
两个核心问题导致无法获取Variant的ean属性值:
- 遍历逻辑错误:测试代码遍历的是手动新建的空
List<Variant>集合,没有引用反序列化后得到的实际数据,自然无法拿到任何属性结果 - 实体映射不匹配:自动生成的实体类将JSON中动态变化的数字商品ID硬编码为固定属性名,无法适配键名随数据变化的结构,反序列化阶段商品、变体数据就没有被正确映射到实体对象中
修正后的实体类定义
将原硬编码固定商品ID属性的Products类,替换为字典结构承接动态键值对,即可适配任意数字ID作为键的商品结构:
using System.Collections.Generic; using Newtonsoft.Json; public class Root { [JsonProperty("products")] public Dictionary<string, Product> Products { get; set; } } public class Product { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("variants")] public List<Variant> Variants { get; set; } // 其余和JSON结构匹配的属性可按需保留 } public class Variant { [JsonProperty("ean")] public string Ean { get; set; } // 其余和JSON结构匹配的属性可按需保留 }
正确遍历实现代码
不要手动初始化待遍历的变体集合,直接从反序列化完成的根实体中逐层读取数据即可:
using System; using Newtonsoft.Json; public class InventoryEanPrinter { public static void PrintAllEans(string jsonContent) { var inventoryRoot = JsonConvert.DeserializeObject<Root>(jsonContent); if (inventoryRoot?.Products == null || inventoryRoot.Products.Count == 0) { Console.WriteLine("无有效商品库存数据"); return; } foreach (var productItem in inventoryRoot.Products) { Console.WriteLine($"商品ID:{productItem.Key}"); if (productItem.Value.Variants == null || productItem.Value.Variants.Count == 0) { continue; } foreach (var variant in productItem.Value.Variants) { Console.WriteLine($"对应变体EAN:{variant.Ean}"); } } } }
注意事项
- 字典键类型固定使用
string:JSON对象的键本质为字符串类型,即使内容为纯数字,用string承接可避免数值类型转换导致的反序列化失败 - 若实体属性名和JSON键名完全一致(大小写、拼写完全匹配),可省略
[JsonProperty]特性,显式添加特性可规避命名风格差异(如驼峰/下划线命名)导致的映射失败 - 遍历前增加空值判断,避免JSON中部分商品无variants字段时触发空引用异常
内容的提问来源于stack exchange,提问作者Adam Zbudniewek
相关产品推荐
相关产品推荐

