如何将含多数组的JSON反序列化为C#的Manager、Servers和Admins对象?
首先,你的JSON存在语法错误:"Admins": [...] 末尾缺少逗号,导致JSON无法被正确解析,先修正为:
{ "Manager":{ "ServerIp":"ServerIP", "ServerPort":"6000" }, "Admins":[ { "Name":"AdminUserName", "ID":"AdminID" } ], "Servers":[ { "ServerName":"servername", "Path":"executablepath", "IP":"ip", "Port":"port", "Password":"pass" } ] }
以下提供两种可行的反序列化实现方式,适配主流C# JSON处理库:
方式一:创建根对象类(推荐)
定义一个匹配JSON顶层结构的根类,一次性完成反序列化后提取目标变量:
// 新增根类,对应JSON的整体结构 public class ConfigRoot { public Manager? Manager { get; set; } public List<Admins>? Admins { get; set; } public List<Servers>? Servers { get; set; } } // 你的原有类保持不变 public class Manager { public string? ServerIp { get; set; } public string? ServerPort { get; set; } } public class Admins { public string? Name { get; set; } public string? ID { get; set; } } public class Servers { public string? ServerName { get; set; } public string? Path { get; set; } public string? IP { get; set; } public string? Port { get; set; } public string? Password { get; set; } }
基于 Newtonsoft.Json(Json.NET)实现
using Newtonsoft.Json; // 假设jsonString为你的JSON内容字符串 var root = JsonConvert.DeserializeObject<ConfigRoot>(jsonString); Manager manager = root.Manager; List<Admins> admins = root.Admins; List<Servers> servers = root.Servers;
基于 System.Text.Json(.NET Core/.NET 5+ 内置)实现
using System.Text.Json; var root = JsonSerializer.Deserialize<ConfigRoot>(jsonString); Manager manager = root.Manager; List<Admins> admins = root.Admins; List<Servers> servers = root.Servers;
方式二:直接解析JSON节点(无需根类)
如果不想新增根类,可以直接解析JSON的各个节点再分别反序列化:
基于 Newtonsoft.Json 实现
using Newtonsoft.Json; using Newtonsoft.Json.Linq; var jObject = JObject.Parse(jsonString); Manager manager = jObject["Manager"].ToObject<Manager>(); List<Admins> admins = jObject["Admins"].ToObject<List<Admins>>(); List<Servers> servers = jObject["Servers"].ToObject<List<Servers>>();
基于 System.Text.Json 实现
using System.Text.Json; using var doc = JsonDocument.Parse(jsonString); var rootElement = doc.RootElement; Manager manager = rootElement.GetProperty("Manager").Deserialize<Manager>(); List<Admins> admins = rootElement.GetProperty("Admins").Deserialize<List<Admins>>(); List<Servers> servers = rootElement.GetProperty("Servers").Deserialize<List<Servers>>();
额外优化建议
你的类命名存在歧义:Admins 和 Servers 是单个实体的类名,建议改为 Admin 和 Server,集合使用 List<Admin> 和 List<Server>,代码可读性会更强。例如:
public class Admin { public string? Name { get; set; } public string? ID { get; set; } } public class Server { public string? ServerName { get; set; } public string? Path { get; set; } public string? IP { get; set; } public string? Port { get; set; } public string? Password { get; set; } } // 根类同步调整 public class ConfigRoot { public Manager? Manager { get; set; } public List<Admin>? Admins { get; set; } public List<Server>? Servers { get; set; } }
内容的提问来源于stack exchange,提问作者Toni
相关产品推荐
相关产品推荐

