如何在C#中使用Newtonsoft反序列化嵌套数组并提取名称
解决混合类型JSON数组的反序列化与名称提取问题
我懂你现在的困扰——这个JSON是个混合类型的异构数组,里面既有数字、普通数组,又嵌套了对象和数组,常规的强类型类反序列化方案确实完全不适用。下面给你两种用Newtonsoft.Json(Json.NET)实现的可行方法,轻松提取出你需要的名称:
方法一:使用JArray(LINQ to JSON)灵活解析
这种方法通过LINQ to JSON API直接操作JSON节点,类型安全且可控性强,专门适配结构不规则的JSON:
using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; class JsonParsingDemo { static void Main() { // 你的目标JSON字符串 string targetJson = @"[ 2074, [ 0, 0, 0, 1, 0, 0, 0 ], 0, [ { ""886"":[ ""Anna Bay"" ], ""3971"":[ ""Dmitry Khraponenkov"" ] }, [ 3971, 886 ] ] ]"; // 将JSON解析为JArray根节点 JArray rootArray = JArray.Parse(targetJson); // 定位到第四个元素(索引从0开始),它是包含名称对象的子数组 JArray innerContainer = (JArray)rootArray[3]; // 获取子数组中的第一个元素——存储名称的键值对对象 JObject nameStore = (JObject)innerContainer[0]; // 提取所有名称到集合中 List<string> extractedNames = new List<string>(); foreach (JProperty property in nameStore.Properties()) { // 每个属性的值是一个单元素数组,取第一个元素作为名称 extractedNames.Add(property.Value[0].ToString()); } // 输出结果 foreach (var name in extractedNames) { Console.WriteLine("提取到的名称:" + name); } // 输出内容: // 提取到的名称:Anna Bay // 提取到的名称:Dmitry Khraponenkov } }
方法二:使用动态类型(dynamic)快速实现
如果追求开发效率,不想写太多类型转换代码,可以用dynamic类型反序列化,代码更简洁,适合快速验证需求:
using Newtonsoft.Json; using System; using System.Collections.Generic; class DynamicJsonDemo { static void Main() { string targetJson = @"[ 2074, [ 0, 0, 0, 1, 0, 0, 0 ], 0, [ { ""886"":[ ""Anna Bay"" ], ""3971"":[ ""Dmitry Khraponenkov"" ] }, [ 3971, 886 ] ] ]"; // 反序列化为动态类型数组 dynamic dynamicRoot = JsonConvert.DeserializeObject(targetJson); // 直接通过索引定位到名称存储对象 dynamic nameStore = dynamicRoot[3][0]; List<string> extractedNames = new List<string>(); foreach (var property in nameStore) { extractedNames.Add(property.Value[0].ToString()); } // 输出提取结果 foreach (var name in extractedNames) { Console.WriteLine(name); } } }
为什么常规强类型反序列化不适用?
因为这个JSON的结构是异构数组:数组内的元素类型完全不同(数字、数组、嵌套对象),无法映射到一个固定结构的C#类。而上面两种方法都是基于“动态解析节点”的思路,避开了强类型的限制,完美适配这种不规则的JSON结构。
内容的提问来源于stack exchange,提问作者Muhamad Dwi Susanto
相关产品推荐
相关产品推荐

