如何从嵌套JSON数组提取数据并映射到C#对象?
从JSON提取数据到C# Score对象
需求说明
需要将给定JSON数据源中每个键对应的等级字符串、整数数组的第一个值、第二个值,分别映射到自定义的Score类的对应属性中:
- 等级字符串 →
Grade属性 - 整数数组第一个元素 →
PotentialPoints属性 - 整数数组第二个元素 →
ActualPoints属性
C# Score对象定义
public class Score { public string Grade { get; set; } // Bronze, Silver, Gold public int PotentialPoints { get; set; } // 对应整数数组第一个元素 public int ActualPoints { get; set; } // 对应整数数组第二个元素 }
数据源(修正后合法JSON)
[ 6, [ [], 4, { "time crunch": [ "Bronze", [228, 380] ], "3 rides": [ "Bronze", [1418, 2730] ], "4 rides": [ "Bronze", [180, 320] ], "[2 rides,2 runs]": [ "Silver", [220, 270] ] } ] ]
实现方案(使用Json.NET)
由于JSON结构嵌套且不规则,使用Newtonsoft.Json(Json.NET)的JObject/JArray进行灵活解析是最优方案:
1. 安装Json.NET包
通过NuGet安装:
Install-Package Newtonsoft.Json
2. 解析代码
using Newtonsoft.Json.Linq; using System.Collections.Generic; public static class ScoreParser { public static Dictionary<string, Score> ParseScores(string rawJson) { var scoreMap = new Dictionary<string, Score>(); // 解析根JSON数组 var root = JArray.Parse(rawJson); // 获取存储评分数据的对象(根数组第二个元素的第三个子项) var scoreContainer = root[1][2] as JObject; // 遍历所有评分项 foreach (var prop in scoreContainer.Properties()) { var valueArray = prop.Value as JArray; if (valueArray?.Count < 2) continue; // 提取等级 var grade = valueArray[0].Value<string>(); // 提取分数数组 var points = valueArray[1] as JArray; if (points?.Count < 2) continue; // 构建Score对象并加入字典 scoreMap.Add(prop.Name, new Score { Grade = grade, PotentialPoints = points[0].Value<int>(), ActualPoints = points[1].Value<int>() }); } return scoreMap; } }
3. 使用示例
// 假设jsonString是你的数据源JSON字符串 var scores = ScoreParser.ParseScores(jsonString); // 遍历输出结果 foreach (var kvp in scores) { Console.WriteLine($"项目:{kvp.Key}"); Console.WriteLine($"等级:{kvp.Value.Grade}"); Console.WriteLine($"潜力分:{kvp.Value.PotentialPoints}"); Console.WriteLine($"实际分:{kvp.Value.ActualPoints}\n"); }
输出结果示例:
项目:time crunch 等级:Bronze 潜力分:228 实际分:380 项目:3 rides 等级:Bronze 潜力分:1418 实际分:2730 ...
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

