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
您的代码不起作用,因为0和1令牌只是一个属性,而不是数组的物品(你没有方括号[]周围)。您可以使用手动将这些值解析为所需的结构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>按原样使用)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |