所以我有一些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的其他端点使用相同的实现,并且它没有问题。我注意到的唯一区别是此响应的列表值包含在[
和{
括号中,其中其他端点仅使用{
括号返回列表值。
答案 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序列化器将为您完成剩下的工作。