如何将含动态根名称的JSON转换为C# List
提取动态根节点JSON中的Items数组为C# List的实现方案
你可以通过以下几种常用方式实现,根据项目使用的JSON库选择即可:
一、先定义对应实体类(两种方案通用)
不管用哪种JSON处理库,都需要先定义对应Items条目的实体类,以及必要的嵌套类:
// 对应Items数组中的单个数据条目 public class MeasurementItem { public DateTime Timestamp { get; set; } public double Value { get; set; } public string UnitsAbbreviation { get; set; } } // 对应JSON中的Content节点 public class ApiContent { public List<MeasurementItem> Items { get; set; } } // 对应动态GUID节点下的完整响应结构 public class ApiResponse { public int Status { get; set; } public Dictionary<string, string> Headers { get; set; } public ApiContent Content { get; set; } }
二、使用Newtonsoft.Json(Json.NET)
如果你的项目引用了Newtonsoft.Json NuGet包,可按以下步骤处理:
using Newtonsoft.Json; using System.Linq; // 将JSON字符串反序列化为字典,键为动态GUID字符串 var responseDict = JsonConvert.DeserializeObject<Dictionary<string, ApiResponse>>(stringResult); // 获取字典中的第一个响应对象(假设根节点仅包含一个GUID条目) var targetResponse = responseDict.Values.FirstOrDefault(); // 提取Items列表,为空时返回空列表 List<MeasurementItem> itemsList = targetResponse?.Content?.Items ?? new List<MeasurementItem>();
三、使用System.Text.Json(.NET内置)
如果使用.NET Core 3.0+或.NET 5+自带的System.Text.Json,代码如下:
using System.Text.Json; using System.Linq; // 反序列化为字典 var responseDict = JsonSerializer.Deserialize<Dictionary<string, ApiResponse>>(stringResult); // 获取第一个响应对象 var targetResponse = responseDict.Values.FirstOrDefault(); // 提取Items列表 List<MeasurementItem> itemsList = targetResponse?.Content?.Items ?? new List<MeasurementItem>();
四、简化方案(无需完整定义ApiResponse类)
如果不想定义完整的嵌套类,也可以直接解析JSON节点:
用Newtonsoft.Json的JObject
using Newtonsoft.Json.Linq; using System.Linq; var jsonObject = JObject.Parse(stringResult); // 定位到Content下的Items节点 var itemsToken = jsonObject.Values().First()["Content"]["Items"]; // 转换为List List<MeasurementItem> itemsList = itemsToken.ToObject<List<MeasurementItem>>();
用System.Text.Json的JsonDocument
using System.Text.Json; using var jsonDoc = JsonDocument.Parse(stringResult); // 遍历根节点的第一个属性(动态GUID节点) var rootNode = jsonDoc.RootElement.EnumerateObject().First().Value; // 定位到Items节点并反序列化 var itemsElement = rootNode.GetProperty("Content").GetProperty("Items"); List<MeasurementItem> itemsList = JsonSerializer.Deserialize<List<MeasurementItem>>(itemsElement);
内容的提问来源于stack exchange,提问作者Priyanka Mane-Patil
相关产品推荐
相关产品推荐

