访问JSON C#动态变量中的数据

访问JSON C#动态变量中的数据,c#,json,parsing,C#,Json,Parsing,我正在处理/使用以下数据:(可以在Firefox中轻松打开以查看。) 我可以通过以下操作访问C#中的数据: 数据是json数据 dynamic players = JArray.Parse(data); var p = players[0]; Console.Write(p.personaName); 然而,我在访问JSON数据中的部分时遇到了困难:“dataInteger”例如“TotalUnitSkilling” “p.dataInteger[0].TotalUnitSkilleed”不起

我正在处理/使用以下数据:(可以在Firefox中轻松打开以查看。)

我可以通过以下操作访问C#中的数据: 数据是json数据

dynamic players = JArray.Parse(data);
var p = players[0];
Console.Write(p.personaName);
然而,我在访问JSON数据中的部分时遇到了困难:“dataInteger”例如“TotalUnitSkilling”

“p.dataInteger[0].TotalUnitSkilleed”不起作用

如何在C#中访问该数据

非常感谢你的帮助

沃伦


您的JSON字符串错误

[{"personaLadderId":"371eaf1c-4cfe-4873-af41-56e0cb9fcf91","rank":1,"personaId":"55834d01-13f3-445e-861f-0bc4769d87cc","personaName":"Amelie","avatarUrl":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg","avatarUrlSmall":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg","avatarUrlMedium":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_medium.jpg","avatarUrlLarge":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg","ladderType":"Ranked","ladderId":"de5bfc9a-9092-4014-b52e-89151de42646","seasonId":"fd7dd807-4ac2-40ec-8476-a4b2937f70af","bracketId":0,"bracketName":"Legendary","rankingScore":38,"secondaryScore":2054,"ruleTypeId":1,"wins":374,"losses":32,"ties":0,"tieStreak":0,"winStreak":8,"lossStreak":0,"longestTieStreak":0,"longestWinStreak":61,"longestLossStreak":3,"bracketMaxScore":0,"bracketScore":0,"updateDate":"2018-03-03T14:13:09.647Z","totalMatchesPlayed":406,"dataInteger":{"totalUnitsKilled ":92615,"totalTitansKilled":14,"totalTimePlayed":294676,"substrate-TotalGamesPlayed":127,"phC-TotalGamesPlayed":6,"lastReplayVersion":265301040,"replayUploadedCount":160}},{"personaLadderId":"f0dd3482-f057-44d6-a626-9c9389ad2583","rank":2,"personaId":"b53815ab-d753-4415-9ea6-03a4519c3222","personaName":"Rebellions","avatarUrl":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b.jpg","avatarUrlSmall":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b.jpg","avatarUrlMedium":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b_medium.jpg","avatarUrlLarge":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b_full.jpg","ladderType":"Ranked","ladderId":"de5bfc9a-9092-4014-b52e-89151de42646","seasonId":"fd7dd807-4ac2-40ec-8476-a4b2937f70af","bracketId":0,"bracketName":"Legendary","rankingScore":38,"secondaryScore":2049,"ruleTypeId":1,"wins":767,"losses":188,"ties":0,"tieStreak":0,"winStreak":3,"lossStreak":0,"longestTieStreak":0,"longestWinStreak":52,"longestLossStreak":6,"bracketMaxScore":0,"bracketScore":0,"updateDate":"2017-10-29T18:03:33.92Z","totalMatchesPlayed":955,"dataInteger":{"totalUnitsKilled ":293274,"totalTitansKilled":88,"totalTimePlayed":924881,"phC-TotalGamesPlayed":4,"substrate-TotalGamesPlayed":350,"lastReplayVersion":250285270,"replayUploadedCount":703}}]
public class DataInteger
{
    public int __invalid_name__totalUnitsKilled  { get; set; }
    public int totalTitansKilled { get; set; }
    public int totalTimePlayed { get; set; }
    public int __invalid_name__substrate-TotalGamesPlayed { get; set; }
    public int __invalid_name__phC-TotalGamesPlayed { get; set; }
    public int lastReplayVersion { get; set; }
    public int replayUploadedCount { get; set; }
}

public class RootObject
{
    public string personaLadderId { get; set; }
    public int rank { get; set; }
    public string personaId { get; set; }
    public string personaName { get; set; }
    public string avatarUrl { get; set; }
    public string avatarUrlSmall { get; set; }
    public string avatarUrlMedium { get; set; }
    public string avatarUrlLarge { get; set; }
    public string ladderType { get; set; }
    public string ladderId { get; set; }
    public string seasonId { get; set; }
    public int bracketId { get; set; }
    public string bracketName { get; set; }
    public int rankingScore { get; set; }
    public int secondaryScore { get; set; }
    public int ruleTypeId { get; set; }
    public int wins { get; set; }
    public int losses { get; set; }
    public int ties { get; set; }
    public int tieStreak { get; set; }
    public int winStreak { get; set; }
    public int lossStreak { get; set; }
    public int longestTieStreak { get; set; }
    public int longestWinStreak { get; set; }
    public int longestLossStreak { get; set; }
    public int bracketMaxScore { get; set; }
    public int bracketScore { get; set; }
    public DateTime updateDate { get; set; }
    public int totalMatchesPlayed { get; set; }
    public DataInteger dataInteger { get; set; }
}
json密钥名(“TotalUnitSkill”)中有一个空格,它最终被转换为变量名

更正JSON密钥名将解决此问题。还有其他键也有错误

你可以在。无论它在哪里“无效_name”,键名都是错误的

[{"personaLadderId":"371eaf1c-4cfe-4873-af41-56e0cb9fcf91","rank":1,"personaId":"55834d01-13f3-445e-861f-0bc4769d87cc","personaName":"Amelie","avatarUrl":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg","avatarUrlSmall":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb.jpg","avatarUrlMedium":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_medium.jpg","avatarUrlLarge":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/fe/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg","ladderType":"Ranked","ladderId":"de5bfc9a-9092-4014-b52e-89151de42646","seasonId":"fd7dd807-4ac2-40ec-8476-a4b2937f70af","bracketId":0,"bracketName":"Legendary","rankingScore":38,"secondaryScore":2054,"ruleTypeId":1,"wins":374,"losses":32,"ties":0,"tieStreak":0,"winStreak":8,"lossStreak":0,"longestTieStreak":0,"longestWinStreak":61,"longestLossStreak":3,"bracketMaxScore":0,"bracketScore":0,"updateDate":"2018-03-03T14:13:09.647Z","totalMatchesPlayed":406,"dataInteger":{"totalUnitsKilled ":92615,"totalTitansKilled":14,"totalTimePlayed":294676,"substrate-TotalGamesPlayed":127,"phC-TotalGamesPlayed":6,"lastReplayVersion":265301040,"replayUploadedCount":160}},{"personaLadderId":"f0dd3482-f057-44d6-a626-9c9389ad2583","rank":2,"personaId":"b53815ab-d753-4415-9ea6-03a4519c3222","personaName":"Rebellions","avatarUrl":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b.jpg","avatarUrlSmall":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b.jpg","avatarUrlMedium":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b_medium.jpg","avatarUrlLarge":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/b9/b9847c92d44896304cc2d673e1fbe7bc99af7f5b_full.jpg","ladderType":"Ranked","ladderId":"de5bfc9a-9092-4014-b52e-89151de42646","seasonId":"fd7dd807-4ac2-40ec-8476-a4b2937f70af","bracketId":0,"bracketName":"Legendary","rankingScore":38,"secondaryScore":2049,"ruleTypeId":1,"wins":767,"losses":188,"ties":0,"tieStreak":0,"winStreak":3,"lossStreak":0,"longestTieStreak":0,"longestWinStreak":52,"longestLossStreak":6,"bracketMaxScore":0,"bracketScore":0,"updateDate":"2017-10-29T18:03:33.92Z","totalMatchesPlayed":955,"dataInteger":{"totalUnitsKilled ":293274,"totalTitansKilled":88,"totalTimePlayed":924881,"phC-TotalGamesPlayed":4,"substrate-TotalGamesPlayed":350,"lastReplayVersion":250285270,"replayUploadedCount":703}}]
public class DataInteger
{
    public int __invalid_name__totalUnitsKilled  { get; set; }
    public int totalTitansKilled { get; set; }
    public int totalTimePlayed { get; set; }
    public int __invalid_name__substrate-TotalGamesPlayed { get; set; }
    public int __invalid_name__phC-TotalGamesPlayed { get; set; }
    public int lastReplayVersion { get; set; }
    public int replayUploadedCount { get; set; }
}

public class RootObject
{
    public string personaLadderId { get; set; }
    public int rank { get; set; }
    public string personaId { get; set; }
    public string personaName { get; set; }
    public string avatarUrl { get; set; }
    public string avatarUrlSmall { get; set; }
    public string avatarUrlMedium { get; set; }
    public string avatarUrlLarge { get; set; }
    public string ladderType { get; set; }
    public string ladderId { get; set; }
    public string seasonId { get; set; }
    public int bracketId { get; set; }
    public string bracketName { get; set; }
    public int rankingScore { get; set; }
    public int secondaryScore { get; set; }
    public int ruleTypeId { get; set; }
    public int wins { get; set; }
    public int losses { get; set; }
    public int ties { get; set; }
    public int tieStreak { get; set; }
    public int winStreak { get; set; }
    public int lossStreak { get; set; }
    public int longestTieStreak { get; set; }
    public int longestWinStreak { get; set; }
    public int longestLossStreak { get; set; }
    public int bracketMaxScore { get; set; }
    public int bracketScore { get; set; }
    public DateTime updateDate { get; set; }
    public int totalMatchesPlayed { get; set; }
    public DataInteger dataInteger { get; set; }
}
您可以使用JSON.Net属性定义与JSON键名相关的C#变量。查看更多详细信息

您的新类应该如下所示:

public class DataInteger
{
    [JsonProperty(PropertyName = "totalUnitsKilled ")]
    public int totalUnitsKilled { get; set; }
    public int totalTitansKilled { get; set; }
    public int totalTimePlayed { get; set; }
    [JsonProperty(PropertyName = "substrate-TotalGamesPlayed")]
    public int substrateTotalGamesPlayed { get; set; }
    [JsonProperty(PropertyName = "phC-TotalGamesPlayed")]
    public int phCTotalGamesPlayed { get; set; }
    public int lastReplayVersion { get; set; }
    public int replayUploadedCount { get; set; }
}

Kinldy看一下我在您的问题中的评论,基于该链接,您需要使用
JsonProperty
映射具有特殊字符的密钥,并根据需要手动命名它

不管怎样,你可以做以下事情来实现你所需要的

  • 将您的链接复制到
  • 复制生成的Quicktypes并将其粘贴到代码中
  • 使用
    JsonProperty
    在属性上指示名称的属性,并手动重命名包含无效\u名称的属性
  • 反序列化对象
    对象
  • 代码如下:

    从生成的quicktypes声明类。

    public class DataInteger
    {
        [JsonProperty(PropertyName = "totalUnitsKilled ")]
        public int totalUnitsKilled { get; set; }
        public int totalTitansKilled { get; set; }
        public int totalTimePlayed { get; set; }
        [JsonProperty(PropertyName = "substrate-TotalGamesPlayed")]
        public int SubstrateTotalGamesPlayed { get; set; }
        [JsonProperty(PropertyName = "phC-TotalGamesPlayed")]
        public int PHCTotalGamesPlayed { get; set; }
        public int lastReplayVersion { get; set; }
        public int replayUploadedCount { get; set; }
    }
    
    public class RootObject
    {
        public string personaLadderId { get; set; }
        public int rank { get; set; }
        public string personaId { get; set; }
        public string personaName { get; set; }
        public string avatarUrl { get; set; }
        public string avatarUrlSmall { get; set; }
        public string avatarUrlMedium { get; set; }
        public string avatarUrlLarge { get; set; }
        public string ladderType { get; set; }
        public string ladderId { get; set; }
        public string seasonId { get; set; }
        public int bracketId { get; set; }
        public string bracketName { get; set; }
        public int rankingScore { get; set; }
        public int secondaryScore { get; set; }
        public int ruleTypeId { get; set; }
        public int wins { get; set; }
        public int losses { get; set; }
        public int ties { get; set; }
        public int tieStreak { get; set; }
        public int winStreak { get; set; }
        public int lossStreak { get; set; }
        public int longestTieStreak { get; set; }
        public int longestWinStreak { get; set; }
        public int longestLossStreak { get; set; }
        public int bracketMaxScore { get; set; }
        public int bracketScore { get; set; }
        public DateTime updateDate { get; set; }
        public int totalMatchesPlayed { get; set; }
        public DataInteger dataInteger { get; set; }
    }
    
    调用API(魔法从这里开始)


    希望这将对您有所帮助。

    正如其他用户所建议的,如果您将属性名称“TotalUnitSkilling”更改为“TotalUnitSkilling”,则属性名称中会有一个空格。下面的代码可以正常工作:-

    Console.WriteLine(p.dataInteger.totalUnitsKilled);
    

    为什么要创建整个类?json结果可以由对象解析。@JericCruz我只是提供了查找错误的示例。在json2csharp.com中,您可以创建类,还可以检查json键中的任何错误。这是合理和明智的使用该网站。这不能成为否决我答案的理由。提供一些适当的理由或删除否决票。你可以在“我如何写出一个好的答案?”链接@JericCruz谢谢。尽管我已经读过了,我还是要再读一遍。你可以建议我的答案是否需要修改。如果是好的,我一定接受。可能是Hi的副本。我没有创建RESTAPI。我正在尝试使用它。所以我不能改变来源。我只是想知道如何获取例如“dataInteger”中的数据,我不知道如何获取。看看我的答案。非常感谢!可以使用而不使用强类型类吗?已将答案更新为使用
    JArray
    ,并通过JSON中指示的键访问数据,看起来更小更容易。@user1605822很高兴它能帮助您,但如果您将其标记为已回答,那就太好了。
    Console.WriteLine(p.dataInteger.totalUnitsKilled);