You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.Json NuGet包(可以通过NuGet包管理器搜索安装)
  • 属性名称要和JSON中的键完全一致,如果需要修改C#属性名,可以使用[JsonProperty("value1")]特性来映射
  • value2是Unix时间戳,建议用long类型存储,避免int溢出问题

内容的提问来源于stack exchange,提问作者Cambaru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:40:38