反序列化 Json 并访问结果

Lup*_*pus 5 c# json dictionary

我有这个 Json:

{
   "UpdatePack":"updatePacks\/1585654836.pack",
   "Updates":[
      {
         "Name":"MsgBoxEx",
         "version":"1.5.14.88",
         "ChangeLog":"BugFix: Form didn't resize correct.",
         "Hash":"5FB23ED83693A6D3147A0485CD13288315F77D3D37AAC0697E70B8F8C9AA0BB8"

},
      {
         "Name":"Utilities",
         "version":"2.5.1.58",
         "ChangeLog":"StringManagement updated.",
         "Hash":"05E6B3F521225C604662916F50A701E9783E13776DE4FCA27BE4B69705491AC5"

}

]
}
Run Code Online (Sandbox Code Playgroud)

我创建了 2 个用于反序列化它的类。

class UpdatesList
{
    public string Name { get; set; }
    public string Version { get; set; }
    public string ChangeLog { get; set; }
    public string Hash { get; set; }
}
class JsonObjectHolder
{
    public string UpdatePack { get; set; }
    //public Dictionary<int, MyData> { get; set; }
    public Dictionary<int, UpdatesList> Updates { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试访问字典时,我不断收到 Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. at " Console.WriteLine(jsonTest.Dict.Count);"

我反序列化是错误的,还是我需要做一些其他的事情来访问字典的结果?

我是 C# 和 Json 的新手。

我希望有人能指出我如何处理这个问题的正确方向。

我使用的是 Visual Studio 2019 最新更新和 .net 4.8。问候/LR

Pav*_*ski 6

您的代码不起作用,因为01令牌只是一个属性,而不是数组的物品(你没有方括号[]周围)。您可以使用手动将这些值解析为所需的结构JObject

var json = JObject.Parse(your_json_string);
var dict = new Dictionary<int, UpdatesList>();
foreach (var item in json.Properties())
{
    if (item.Value.Type == JTokenType.Object)
    {
        var index = int.Parse(item.Name);
        var updateList = item.Value.ToObject<UpdatesList>();
        dict.Add(index, updateList);
    }
}

var holder = new JsonObjectHolder
{
    UpdatePack = json["Updates"]?.Value<string>(),
    Dict = dict
};
Run Code Online (Sandbox Code Playgroud)

更新:根据 OP 对 JSON 所做的更改,它可能会更简单地反序列化

var list = json["Updates"]?.ToObject<List<UpdatesList>>();

var holder = new JsonObjectHolder
{
    UpdatePack = json["UpdatePack"]?.Value<string>(),
    Dict = list.Select((updatesList, index) => new { updatesList, index })
                    .ToDictionary(x => x.index, x => x.updatesList)
};
Run Code Online (Sandbox Code Playgroud)

这里的要点是这Updates是一个项目数组,而不是键值集合。它可以转换为Dictionary<int, UpdatesList>usingToDictionary方法 from System.Linq(或List<UpdatesList>按原样使用)