【问题标题】:Parse data from multiple json arrays in c#在 C# 中解析来自多个 json 数组的数据
【发布时间】:2016-11-24 11:04:48
【问题描述】:

我正在尝试搜索此 Json 代码以查找统计信息:

{
    "summonerId": 32033681,
    "modifyDate": 1403658807000,
    "champions": [{
        "id": 40,
        "stats": {
            "totalSessionsPlayed": 1,
            "totalSessionsLost": 0,
            "totalSessionsWon": 1,
            "totalChampionKills": 1,
            "totalDamageDealt": 27006,
            "totalDamageTaken": 9924,
            "mostChampionKillsPerSession": 1,
            "totalMinionKills": 17,
            "totalDoubleKills": 0,
            "totalTripleKills": 0,
            "totalQuadraKills": 0,
            "totalPentaKills": 0,
            "totalUnrealKills": 0,
            "totalDeathsPerSession": 2,
            "totalGoldEarned": 8383,
            "mostSpellsCast": 0,
            "totalTurretsKilled": 2,
            "totalPhysicalDamageDealt": 8957,
            "totalMagicDamageDealt": 18049,
            "totalFirstBlood": 0,
            "totalAssists": 13,
            "maxChampionsKilled": 1,
            "maxNumDeaths": 2
        }
    },
    {
        "id": 36,
        "stats": {
            "totalSessionsPlayed": 1,
            "totalSessionsLost": 1,
            "totalSessionsWon": 0,
            "totalChampionKills": 0,
            "totalDamageDealt": 14267,
            "totalDamageTaken": 7649,
            "mostChampionKillsPerSession": 0,
            "totalMinionKills": 33,
            "totalDoubleKills": 0,
            "totalTripleKills": 0,
            "totalQuadraKills": 0,
            "totalPentaKills": 0,
            "totalUnrealKills": 0,
            "totalDeathsPerSession": 5,
            "totalGoldEarned": 3258,
            "mostSpellsCast": 0,
            "totalTurretsKilled": 0,
            "totalPhysicalDamageDealt": 4992,
            "totalMagicDamageDealt": 9165,
            "totalFirstBlood": 0,
            "totalAssists": 0,
            "maxChampionsKilled": 0,
            "maxNumDeaths": 5
        }
    }]
}

在以下示例中,我希望能够搜索 id 36 的 totalSessionsWon。我尝试访问数据,我一直在访问其他 JSON 文件中的数据,但它不允许我指定我的冠军的 id我正在寻找:

string jsonInput = new WebClient().DownloadString(@usableurl); //Reads the JSON from the API
string usableJson = @"JObject.Parse(jsonInput)"; //converts the JSON from the API to a usable form
var usableJson["champions"]["stats"]["totalSessionWon"];

有没有一种方法可以让我根据之前的 id 选择特定的统计数据?

我是使用 JSON 和 C# 的新手,因此特别感谢您的帮助!

【问题讨论】:

  • JSON 的结构看起来不错。看起来您需要了解更多关于 JSON 以及如何使用 C# 读取/写入它的信息。如果您在网上搜索它,可以找到很多关于该主题的教程。如果您只是在寻找教程,它们是 Stack Overflow 上的 off topic。但是,如果您发布当前尝试的代码,我们可以帮助您找出在访问所需数据时出错的地方。
  • @Plutonix 那个负鼠对你做了什么?
  • @AsadSaeeduddin 她忽略了右侧相关下所有评价很高的链接。 ;)
  • 令人惊讶的是,一个问题的变化如此之快......就像 “有没有办法可以将统计信息移动到 id 下方?” 被编辑为 “有没有一种方法可以让我根据之前的 id 选择一个特定的统计数据?” ...小心你的下一个问题@Dan :-)

标签: c# json json.net


【解决方案1】:

如果Newtonsoft.Json; 对您来说是新的,那么您现在可以看看如何使用install Newtonsoft,一旦安装完成,我很想告诉您 XML、JSON 是一种使用人类可读的开放标准格式文本以传输由属性-值对组成的数据对象。从这种字符串中获取数据会像数据库一样容易。

为了轻松地从 json 字符串中获取数据,首先我们需要创建 json 字符串的对象来显示层次结构,因此我们需要查看我们的数据或 json 字符串的样子。因此,如果您看到最顶层的层次结构包含summonerIdmodifyDatechampionschampions 内部可能有n 的冠军详细信息数量,因此我们将冠军列表创建为champions

现在在层次结构的下一级,您可以看到冠军 id 和他的统计数据,因此统计数据将是创建关于冠军的另一个类。所以你的班级看起来像

public class Rootobject
{
    public int summonerId { get; set; }
    public long modifyDate { get; set; }
    public List<Champion> champions { get; set; }
}

public class Champion
{
    public int id { get; set; }
    public Stats stats { get; set; }
}

public class Stats
{
    public int totalSessionsPlayed { get; set; }
    public int totalSessionsLost { get; set; }
    public int totalSessionsWon { get; set; }
    public int totalChampionKills { get; set; }
    public int totalDamageDealt { get; set; }
    public int totalDamageTaken { get; set; }
    public int mostChampionKillsPerSession { get; set; }
    public int totalMinionKills { get; set; }
    public int totalDoubleKills { get; set; }
    public int totalTripleKills { get; set; }
    public int totalQuadraKills { get; set; }
    public int totalPentaKills { get; set; }
    public int totalUnrealKills { get; set; }
    public int totalDeathsPerSession { get; set; }
    public int totalGoldEarned { get; set; }
    public int mostSpellsCast { get; set; }
    public int totalTurretsKilled { get; set; }
    public int totalPhysicalDamageDealt { get; set; }
    public int totalMagicDamageDealt { get; set; }
    public int totalFirstBlood { get; set; }
    public int totalAssists { get; set; }
    public int maxChampionsKilled { get; set; }
    public int maxNumDeaths { get; set; }
}

现在,由于我们已经获得了结构,因此我们需要将字符串反序列化为我们类型的对象,即 Rootobject。这将转换该普通 json 字符串以填充对象。现在只需获取详细信息,例如吃蛋糕。

using Newtonsoft.Json;

Rootobject rt = JsonConvert.DeserializeObject<Rootobject>(jsonstr);
if(rt.champions[1].id == 36)
{
    Console.WriteLine(rt.champions[1].stats.totalSessionsWon);
}

【讨论】:

  • 考虑到问题的作者是 JSON 和 C# 的新手,最好包含一些关于此代码如何解决用户想要的问题的解释,而不是仅仅提供解决方案。 (换句话说就是解释代码中发生了什么)
  • 希望@Adrian 这个解释就足够了。 :)
  • 是的,我认为您在解释这如何解决问题方面做出了不错的尝试。
【解决方案2】:

由于问题的作者试图使用JObject 来查询他们的 JSON 对象,我想我会给出一个使用相同的解决方案。

JObject 用于使用Linq 查询 JSON。 Linq 是新 C# 程序员了解的半高级主题,但简而言之,它是一种用于从数据源检索数据的专用查询语言。 Mohit Shrivastrava 的回答中概述的方法对于新程序员来说更容易理解。

//converts the JSON from the API to a usable form
JObject usableJson = JObject.Parse(json); 

// retrieve champion objects
JToken champions = usableJson["champions"];

// retrieve the champion desired object using the Linq FirstOrDefault method. 
// This method will return the first object that matches the given query,
// or return null if it does not find a match.
JToken champion = champions.FirstOrDefault(c=> (int)c["id"] == 36);

if (champion != null)
{
    // retrieve the stats object
    JToken stats = champion["stats"];

    // read the totalSessionsWon field from the object.
    int totalSessionsWon = (int) stats["totalSessionsWon"];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多