使用Json.Net解析JSON数组:读取sites节点数据遇阻求助
解决JSON中
sites节点读取问题 看起来你在解析这段赛事JSON的sites节点时遇到了小麻烦,我来帮你梳理下怎么搞定它~
首先先明确你的JSON结构层级:
"events"→"Arsenal_West Ham United"→"sites"→ 包含williamhill等博彩站点数据
下面分两种常用的解析场景给出解决方案:
场景1:动态解析(无实体类,适合快速读取)
如果你用的是Newtonsoft.Json(Json.NET),可以通过JToken/JObject来动态读取节点:
// 假设你的原始JSON字符串为jsonStr JObject rootJson = JObject.Parse(jsonStr); // 先定位到具体的赛事对象(Arsenal对阵West Ham United的那场) JToken match = rootJson["events"]["Arsenal_West Ham United"]; // 直接读取sites节点,注意要转换成JObject类型 JObject sites = (JObject)match["sites"]; // 如果你需要进一步读取williamhill的赔率数据 JObject williamhillSite = (JObject)sites["williamhill"]; JArray h2hOdds = (JArray)williamhillSite["odds"]["h2h"]; // 示例:打印h2h赔率 foreach (var odd in h2hOdds) { Console.WriteLine($"赔率:{odd.ToString()}"); }
如果你的代码里用了match.Value<...>,要注意**Value<T>()是用来读取当前JToken的原始值,而sites是一个嵌套对象,所以应该先通过match["sites"]定位到这个对象节点,再进行类型转换**,而不是直接对match调用Value。
场景2:强类型解析(更规范,适合长期维护)
如果是用System.Text.Json或者Newtonsoft.Json的强类型序列化,可以先定义对应的数据类,再直接反序列化读取:
1. 定义匹配JSON结构的实体类
// 顶级对象 public class EventRoot { public Dictionary<string, MatchDetail> events { get; set; } } // 单场赛事详情 public class MatchDetail { public string sport { get; set; } public string sport_display { get; set; } public List<string> participants { get; set; } public string home_team { get; set; } public string commence { get; set; } public string status { get; set; } public Dictionary<string, SiteDetail> sites { get; set; } } // 博彩站点详情 public class SiteDetail { public Dictionary<string, List<string>> odds { get; set; } public long last_update { get; set; } }
2. 反序列化并读取sites
// System.Text.Json方式 EventRoot root = JsonSerializer.Deserialize<EventRoot>(jsonStr); MatchDetail targetMatch = root.events["Arsenal_West Ham United"]; var sites = targetMatch.sites; // 这里直接拿到sites的字典对象 // 读取williamhill的h2h赔率 var williamhillH2hOdds = sites["williamhill"].odds["h2h"];
这样处理后,你就能轻松获取到sites节点下的所有数据啦~
内容的提问来源于stack exchange,提问作者Geordey Gatt
相关产品推荐
相关产品推荐

