【问题标题】:How to access JSON elements in a subarray using C#如何使用 C# 访问子数组中的 JSON 元素
【发布时间】:2021-02-18 14:18:22
【问题描述】:

目前我正在使用 C# 从体育统计 API 访问特定端点

class GetPlayerData
{
    public string retrievePlayerStats()
    {
        var URL = new UriBuilder("https://statsapi.web.nhl.com/api/v1/people/8471698/stats?stats=statsSingleSeason&season=20202021");

        var client = new WebClient();

        dynamic PlayerData = JObject.Parse(client.DownloadString(URL.ToString()));

        string PlayerStats = PlayerData.stats.ToString();

        return PlayerStats;
    }
}

调用没有问题,返回以下链接格式的以下结果:

https://statsapi.web.nhl.com/api/v1/people/8471698/stats?stats=statsSingleSeason&season=20202021

我的问题是如何访问子数组“拆分”中的项目。我希望能够为球员恢复一个单一的统计数据,比如进球或冰上时间。如果我尝试下面的注释选项,我会收到一条错误消息,提示“无法对空引用执行运行时绑定”。我对 C# 相当陌生,因此希望答案很简单,并且非常感谢有关如何做到这一点的任何帮助(甚至完全是其他选项)。

public string retrievePlayerStats()
{
    var URL = new UriBuilder("https://statsapi.web.nhl.com/api/v1/people/8471698/stats?stats=statsSingleSeason&season=20202021");

    var client = new WebClient();

    dynamic PlayerData = JObject.Parse(client.DownloadString(URL.ToString()));

    string PlayerName = PlayerData.stats.ToString();
    //string PlayerName = PlayerData.splits.ToString(); --null reference error
    //string PlayerName = PlayerData.stats.splits.ToString(); --null reference error

    return PlayerName;
}

谢谢!

【问题讨论】:

标签: c# json .net


【解决方案1】:

您可以像这样使用JObject-s 和JArray-s 而不是dynamic-s:

JObject PlayerData = JObject.Parse(client.DownloadString(URL.ToString()));

var stats = PlayerData["stats"] as JArray;

foreach (JObject stat in stats)
{
    var splits = stat["splits"] as JArray;
    foreach (JObject split in splits)
    {
        var splitStat = split["stat"] as JObject;
        // Now you have access to the "stat"
        // Do whatever you want
        // Here is a sample for accessing the goals 
        var goals = splitStat["goals"].ToString();
        Console.WriteLine(goals);
    }
}

这是一个示例: https://dotnetfiddle.net/6uKPYf

附:一般来说,我会创建一个类,进行适当的反序列化并处理这些类,但上面的解决方案应该可以解决您的问题。

【讨论】:

  • 这很好用!非常感谢您添加此解决方案!
  • 很高兴为您提供帮助。请考虑将此标记为答案,以便其他人也可以轻松找到它:)
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2017-12-10
相关资源
最近更新 更多