我正在使用WebAPI,该WebAPI从请求中返回此json
{
"apps": {
"570": {
"228983": {
"8124929965194586177": "available"
},
"228990": {
"1829726630299308803": "available"
},
"373301": {
"840315559245085162": "available"
},
"373302": {
"688854584180787739": "available"
},
"373303": {
"3675525977143063913": "available"
},
"373305": {
"4435851250675935801": "available"
},
"381451": {
"6984541794104259526": "available"
},
"381452": {
"1442783997179322635": "available"
},
"381453": {
"6878143993063907778": "available"
},
"381454": {
"7824447308675043012": "available"
},
"381455": {
"5681120743357195246": "available"
}
},
"674940": {
"674941": {
"6246860772952658709": "available"
}
}
}
}
它返回一个AppID(int)列表,其中包含另一个DepotID列表,其中包含一个ManifestID(键),以及是否可用(值)。
我想反序列化为一类,以使其易于使用,但我无法想象如何做到这一点。我是C / C ++的C#新手
答案 0 :(得分:3)
您可以使用Json.NET,它是C#的流行JSON库。参见Deserialize an Object。
示例:
public class MyData
{
public Dictionary<long, Dictionary<long, Dictionary<long, string>>> apps { get; set; }
}
var data = JsonConvert.DeserializeObject<MyData>(json);
// Use 'data.apps'
答案 1 :(得分:2)
您可以使用Newtonsoft.Json NuGet包并将数据反序列化为嵌套字典,如下所示:
var data = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, string>>>>>(File.ReadAllText("Data.json"));
为确保获得正确的数据,可以运行以下代码以将其打印出来:
foreach (var a in data)
{
Console.WriteLine(a.Key);
foreach (var b in a.Value)
{
Console.WriteLine("\t" + b.Key);
foreach (var c in b.Value)
{
Console.WriteLine("\t\t" + c.Key);
foreach (var d in c.Value)
{
Console.WriteLine("\t\t\t" + d.Key + ": " + d.Value);
}
}
}
}
不太确定如何将此数据反序列化为类,因为它没有太多的属性名称...
答案 2 :(得分:2)
我不确定将其建模为C#类而没有属性名称(超出Json的“应用”级别)会获得多少收益,但是您可以这样做:
使用以下类为您的Json建模:
public class AppIds : Dictionary<string, DepotId> { }
public class DepotId : Dictionary<string, ManifestId> { }
public class ManifestId : Dictionary<string, string> { }
然后您可以使用Newtonsoft.Json
class Program
{
static void Main(string[] args)
{
string jsonPath = @"c:\debug\data.json";
System.IO.Stream s = new System.IO.FileStream(jsonPath,System.IO.FileMode.Open, System.IO.FileAccess.Read);
AppIds data = JsonConvert.DeserializeObject<Dictionary<string, AppIds>>(File.ReadAllText(jsonPath))["apps"];
}
}