如何用Newtonsoft.Json反序列化含嵌套字典的JSON为C#对象?
用Newtonsoft.Json反序列化你的JSON数据
看起来你已经有了初步的类结构思路,我来帮你完善它,让你能顺利完成反序列化。
首先分析下你的JSON结构:
- 最外层是一个包含
data属性的对象 data本身是一个动态对象,键是数字字符串(比如"50014992"),每个键对应的值是包含value1、value2、value3的实体
方案一:最简强类型结构(推荐)
不需要额外的Data类,直接把Test类的data属性定义为Dictionary<int, RecordItem>,Newtonsoft.Json会自动处理字符串键到int的转换:
using Newtonsoft.Json; public class Test { public Dictionary<int, RecordItem> data { get; set; } } public class RecordItem { public string value1 { get; set; } // value2是Unix时间戳,用long避免int溢出(当前时间戳已经超过int最大值) public long value2 { get; set; } public long value3 { get; set; } }
方案二:保留你最初的Data类结构
如果你坚持要把data封装在Data类里,可以使用[JsonExtensionData]特性来捕获所有动态的数字键,再转换为强类型字典:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Linq; public class Test { public Data data { get; set; } public class Data { // 捕获所有动态的键值对 [JsonExtensionData] private Dictionary<string, JToken> _dynamicItems; // 提供强类型的访问方法 public Dictionary<int, RecordItem> GetItems() { return _dynamicItems.ToDictionary( kvp => int.Parse(kvp.Key), kvp => kvp.Value.ToObject<RecordItem>() ); } } } public class RecordItem { public string value1 { get; set; } public long value2 { get; set; } public long value3 { get; set; } }
反序列化代码示例
不管用哪个方案,反序列化的代码都很简单:
// 你的JSON字符串 string json = @"{""data"": { ""50014992"": { ""value1"": ""fr"", ""value2"": 1378928660, ""value3"": 500149927 }, ""500149928"": { ""value1"": ""fr"", ""value2"": 1378928660, ""value3"": 500149927 }, ""50014999"": { ""value1"": ""fr"", ""value2"": 1378928660, ""value3"": 500149927 }, ""50014991"": { ""value1"": ""fr"", ""value2"": 1378928660, ""value3"": 500149927 } } }"; // 方案一的反序列化 var testObj = JsonConvert.DeserializeObject<Test>(json); // 访问第一个item var firstItem = testObj.data[50014992]; // 方案二的反序列化 var testObjWithData = JsonConvert.DeserializeObject<Test>(json); var items = testObjWithData.data.GetItems();
注意事项
- 确保你已经安装了
Newtonsoft.JsonNuGet包(可以通过NuGet包管理器搜索安装) - 属性名称要和JSON中的键完全一致,如果需要修改C#属性名,可以使用
[JsonProperty("value1")]特性来映射 value2是Unix时间戳,建议用long类型存储,避免int溢出问题
内容的提问来源于stack exchange,提问作者Cambaru
相关产品推荐
相关产品推荐

