如何展平无命名属性的交替式嵌套JSON结构?
解决无命名交替结构JSON的展平问题
这个JSON的files字段设计比较特殊——它是一个交替混合类型的数组:每隔一个元素是文件哈希字符串,下一个元素就是对应哈希的文件列表数组。这种结构没法直接用强类型类反序列化,因为强类型期望的是对象数组,而这里是字符串和数组交替出现,这就是你遇到序列化异常的核心原因。
用Newtonsoft.Json的Linq to JSON(JObject/JArray)来处理是最灵活的方案,直接操作JSON的原始结构,不用纠结强类型映射。下面是具体实现代码:
using Newtonsoft.Json.Linq; // 替换成你的原始JSON字符串 string jsonStr = @"{ ""build"": 44396, ""files"": [""00005DC8F14C92FFA13E7FDF1C9C35E4684F8B7A"", [ [""file1.zip"", 462485959, 462485959, 2, 0, 883, true, 266716, 1734, 992, 558, 0], [""file1.doc"", 521042, 521042, 2, 0, 883, true, 266716, 1734, 992, 558, 0] ], ""0001194B90612DFB5E8D363249719FB62E221430"", [ [""file2.iso"", 501163544, 501163544, 2, 0, 956, true, 194777, 2573, 0, 0, 0] ], ""0002B5245B0897BEA7D7F426E104B6D24FF368DE"", [ [""file3.mp4"", 284564707, 284564707, 2, 0, 543, true, 205165, 1387, 853, 480, 0] ]] }"; var jsonObj = JObject.Parse(jsonStr); var filesArray = (JArray)jsonObj["files"]; var flattenedParts = new List<string>(); // 步长为2遍历:每次取哈希字符串 + 对应的文件列表数组 for (int i = 0; i < filesArray.Count; i += 2) { // 提取当前组的文件哈希 string fileHash = filesArray[i].Value<string>(); // 提取当前组的文件列表 JArray fileList = (JArray)filesArray[i + 1]; // 遍历每个文件条目,提取需要的字段 foreach (JArray fileEntry in fileList) { string fileName = fileEntry[0].Value<string>(); // 用long存储文件大小,避免大文件溢出int范围 long fileSize = fileEntry[1].Value<long>(); flattenedParts.Add($"{fileHash} {fileName} {fileSize}"); } } // 拼接成最终的空格分隔字符串 string finalOutput = string.Join(" ", flattenedParts); Console.WriteLine(finalOutput);
代码说明:
- 解析JSON:用
JObject.Parse把原始JSON字符串转换成可操作的JSON对象,摆脱强类型的束缚。 - 遍历交替数组:因为
files是哈希和文件列表交替的结构,所以遍历的时候步长设为2,每次处理一组(哈希+文件列表)。 - 提取目标字段:每个文件条目是一个无命名数组,我们直接按索引取第0位的文件名和第1位的文件大小即可。
- 健壮性优化:如果JSON格式可能存在异常,可以加一些类型检查(比如判断
filesArray[i]是否是JValue,filesArray[i+1]是否是JArray),避免运行时崩溃。
这种方式不需要定义复杂的强类型类,完全适配这种无命名的交替数组结构,能快速得到你需要的展平格式。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

