无法将返回的Json解析为对象,对象最终为null

时间:2014-06-09 20:45:24

标签: c# json json.net

所以我有一些json我试图使用Newtonsoft Json库进入一个可引用的对象,但我真的很难过这个。基本上,我的数据看起来像这样:

{
    "43086": [{
        "name": "Karthus's Brigands",
        "tier": "SILVER",
        "queue": "RANKED_SOLO_5x5",
        "entries": [{
            "playerOrTeamId": "43086",
            "playerOrTeamName": "Testy Test",
            "division": "IV",
            "leaguePoints": 77,
            "wins": 130,
            "isHotStreak": false,
            "isVeteran": true,
            "isFreshBlood": false,
            "isInactive": false
        }]
    }]
}

当我尝试创建一个对象来保存这些数据并使用DeserializeObject函数时,我的对象总是以null结尾,并且不会抛出任何异常。

我尝试手工创建对象,但是一旦遇到麻烦,我通过json2csharp运行返回的json,它给了我这个:

public class Entry

{

public string playerOrTeamId { get; set; }

public string playerOrTeamName { get; set; }

public string division { get; set; }

public int leaguePoints { get; set; }

public int wins { get; set; }

public bool isHotStreak { get; set; }

public bool isVeteran { get; set; }

public bool isFreshBlood { get; set; }

public bool isInactive { get; set; }

}

public class invalid_type43086

{

public string name { get; set; }

public string tier { get; set; }

public string queue { get; set; }

public List<Entry> entries { get; set; }

}

public class RootObject

{

public List<invalid_type43086> invalid_name43086 { get; set; }

}

我在这个API上遇到了其他问题,其中对象无法被转换器识别,所以我清理了这些,但仍然没有骰子。

这是我用于反序列化的代码行:

var leagueStats = JsonConvert.DeserializeObject<SummonerClasses.RootObject>(returnedData);

如上所述,leagueStats在此之后立即结束为null。我已经确认returnedData实际上拥有上面的json,所以我不确定问题是什么,特别是因为它没有抛出任何异常。单步执行代码并没有提供任何见解。

我也尝试使用newtonsoft库中的PopulateObject方法,并构建一个字典,但也失败了(我得到一个错误,它无法序列化为不可索引的对象,但我我不确定具体的错误是什么,因为一旦明确它也不会成功,我就会吹掉那段代码。

有人有什么建议吗?我对这个API的其他端点使用相同的实现,并且它没有问题。我注意到的唯一区别是此响应的列表值包含在[{括号中,其中其他端点仅使用{括号返回列表值。

1 个答案:

答案 0 :(得分:2)

您可以尝试反序列化为Dictionary<int, Item[]>,该using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; public class Entry { public string PlayerOrTeamId { get; set; } public string PlayerOrTeamName { get; set; } public string Division { get; set; } public int LeaguePoints { get; set; } public int Wins { get; set; } public bool IsHotStreak { get; set; } public bool IsVeteran { get; set; } public bool IsFreshBlood { get; set; } public bool IsInactive { get; set; } } public class Item { public string Name { get; set; } public string Tier { get; set; } public string Queue { get; set; } public List<Entry> Entries { get; set; } } static class Program { static void Main() { string returnedData = @"{ ""43086"": [{ ""name"": ""Karthus's Brigands"", ""tier"": ""SILVER"", ""queue"": ""RANKED_SOLO_5x5"", ""entries"": [{ ""playerOrTeamId"": ""43086"", ""playerOrTeamName"": ""Testy Test"", ""division"": ""IV"", ""leaguePoints"": 77, ""wins"": 130, ""isHotStreak"": false, ""isVeteran"": true, ""isFreshBlood"": false, ""isInactive"": false }] }] }"; var leagueStats = JsonConvert.DeserializeObject<Dictionary<int, Item[]>>(returnedData); Console.WriteLine(leagueStats.Count); } } 应与您在问题中显示的JSON文件相对应:

invalid_name43086

所以基本上不要相信任何为你生成像{{1}}这样的废话的自动工具,并且认为他们会代替你做你的工作。查看您正在使用的JSON对象,并考虑如何在C#对象中表示此JSON结构。然后JSON序列化器将为您完成剩下的工作。