C#如何反序列化复杂JSON结构为自定义类实例?
JSON反序列化为自定义对象的实现方案
下面用.NET生态里最常用的两个JSON处理库来实现,步骤直接清晰:
方案一:使用Newtonsoft.Json(Json.NET)
这是.NET平台老牌且流行的JSON处理库,操作步骤如下:
- 打开NuGet包管理器,搜索并安装
Newtonsoft.Json包 - 编写反序列化代码:
using Newtonsoft.Json; using System.Collections.Generic; // 先将JSON内容转为字符串(如果是从文件读取,先把文件内容读入字符串即可) var jsonContent = @"[ { ""TimerDuration"": ""1"", ""UpdateDate"": ""a"", ""DataBinding"": [ { ""Name"": ""a"", ""Path"": ""b"" }, { ""Name"": ""a"", ""Path"": ""b"" } ] } ]"; // 反序列化为Settings对象的列表 var settingsList = JsonConvert.DeserializeObject<List<Settings>>(jsonContent); // 也可以反序列化成数组形式 var settingsArray = JsonConvert.DeserializeObject<Settings[]>(jsonContent); // 测试访问对象属性 foreach (var setting in settingsList) { Console.WriteLine($"定时时长:{setting.TimerDuration}"); foreach (var binding in setting.DataBinding) { Console.WriteLine($"绑定项:{binding.Name} -> {binding.Path}"); } }
方案二:使用System.Text.Json(.NET内置)
从.NET Core 3.0和.NET 5开始,微软内置了这个JSON处理库,无需额外安装包:
using System.Text.Json; using System.Collections.Generic; // 准备好JSON内容字符串 var jsonContent = @"[ { ""TimerDuration"": ""1"", ""UpdateDate"": ""a"", ""DataBinding"": [ { ""Name"": ""a"", ""Path"": ""b"" }, { ""Name"": ""a"", ""Path"": ""b"" } ] } ]"; // 反序列化为Settings对象列表 var settingsList = JsonSerializer.Deserialize<List<Settings>>(jsonContent); // 也可以反序列化成数组 var settingsArray = JsonSerializer.Deserialize<Settings[]>(jsonContent); // 访问属性示例 foreach (var setting in settingsList) { Console.WriteLine($"更新日期:{setting.UpdateDate}"); foreach (var binding in setting.DataBinding) { Console.WriteLine($"绑定名称:{binding.Name},路径:{binding.Path}"); } }
关键注意事项
- 你的JSON最外层是数组结构(用
[]包裹),所以反序列化的目标类型必须是List<Settings>或者Settings[],不能直接用Settings,否则会抛出序列化异常。 - 你的自定义类字段都是
public修饰的,两个库默认都能自动匹配JSON键名和类字段名,无需额外加特性配置。如果后续遇到键名不匹配的情况,可以用[JsonProperty("键名")](Newtonsoft.Json)或[JsonPropertyName("键名")](System.Text.Json)来指定映射关系。
内容的提问来源于stack exchange,提问作者Laurin Theisen
相关产品推荐
相关产品推荐

