所以我有一些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
}]
}]
}
当我尝试创建一个对象来保存此数据并使用反序列化对象函数时,我的对象总是以 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
在此之后立即变为空。我已经确认returnedData
实际上持有上述 json,所以我不确定问题是什么,特别是因为它没有引发任何异常。单步执行代码没有提供任何见解。
我还尝试使用 newtonsoft 库中的 PopulateObject
方法,并构建字典,但这也失败了(我收到一个关于它无法序列化为不可索引对象的错误,但我不确定具体错误是什么,因为一旦很明显它也不会成功,我就吹走了该代码(。
有人有什么建议吗?我正在针对此 API 的其他端点使用相同的实现,并且它可以正常工作。我注意到的唯一区别是此响应的列表值同时包装在[
和{
括号中,而其他端点仅使用{
括号返回列表值。
尝试反序列化为一个Dictionary<int, Item[]>
,该应该与您在问题中显示的JSON文件相对应:
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);
}
}
所以基本上不要相信任何自动工具,这些工具会为你生成像invalid_name43086
这样的废话,并认为他们会代替你完成工作。查看您拥有的 JSON 对象,并考虑如何在 C# 对象中表示此 JSON 结构。然后,JSON 序列化程序将为您完成其余的工作。