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

如何在C#中使用Newtonsoft反序列化嵌套数组并提取名称

解决混合类型JSON数组的反序列化与名称提取问题

我懂你现在的困扰——这个JSON是个混合类型的异构数组,里面既有数字、普通数组,又嵌套了对象和数组,常规的强类型类反序列化方案确实完全不适用。下面给你两种用Newtonsoft.Json(Json.NET)实现的可行方法,轻松提取出你需要的名称:

方法一:使用JArray(LINQ to JSON)灵活解析

这种方法通过LINQ to JSON API直接操作JSON节点,类型安全且可控性强,专门适配结构不规则的JSON:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

class JsonParsingDemo
{
    static void Main()
    {
        // 你的目标JSON字符串
        string targetJson = @"[ 2074, [ 0, 0, 0, 1, 0, 0, 0 ], 0, [ { ""886"":[ ""Anna Bay"" ], ""3971"":[ ""Dmitry Khraponenkov"" ] }, [ 3971, 886 ] ] ]";
        
        // 将JSON解析为JArray根节点
        JArray rootArray = JArray.Parse(targetJson);
        
        // 定位到第四个元素(索引从0开始),它是包含名称对象的子数组
        JArray innerContainer = (JArray)rootArray[3];
        
        // 获取子数组中的第一个元素——存储名称的键值对对象
        JObject nameStore = (JObject)innerContainer[0];
        
        // 提取所有名称到集合中
        List<string> extractedNames = new List<string>();
        foreach (JProperty property in nameStore.Properties())
        {
            // 每个属性的值是一个单元素数组,取第一个元素作为名称
            extractedNames.Add(property.Value[0].ToString());
        }
        
        // 输出结果
        foreach (var name in extractedNames)
        {
            Console.WriteLine("提取到的名称:" + name);
        }
        // 输出内容:
        // 提取到的名称:Anna Bay
        // 提取到的名称:Dmitry Khraponenkov
    }
}

方法二:使用动态类型(dynamic)快速实现

如果追求开发效率,不想写太多类型转换代码,可以用dynamic类型反序列化,代码更简洁,适合快速验证需求:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

class DynamicJsonDemo
{
    static void Main()
    {
        string targetJson = @"[ 2074, [ 0, 0, 0, 1, 0, 0, 0 ], 0, [ { ""886"":[ ""Anna Bay"" ], ""3971"":[ ""Dmitry Khraponenkov"" ] }, [ 3971, 886 ] ] ]";
        
        // 反序列化为动态类型数组
        dynamic dynamicRoot = JsonConvert.DeserializeObject(targetJson);
        
        // 直接通过索引定位到名称存储对象
        dynamic nameStore = dynamicRoot[3][0];
        
        List<string> extractedNames = new List<string>();
        foreach (var property in nameStore)
        {
            extractedNames.Add(property.Value[0].ToString());
        }
        
        // 输出提取结果
        foreach (var name in extractedNames)
        {
            Console.WriteLine(name);
        }
    }
}

为什么常规强类型反序列化不适用?

因为这个JSON的结构是异构数组:数组内的元素类型完全不同(数字、数组、嵌套对象),无法映射到一个固定结构的C#类。而上面两种方法都是基于“动态解析节点”的思路,避开了强类型的限制,完美适配这种不规则的JSON结构。

内容的提问来源于stack exchange,提问作者Muhamad Dwi Susanto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:16