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

如何在C#/.NET中获取外部API返回JSON的动态索引值?

解决方案:C#/.NET中获取JSON动态键值

刚好之前对接第三方API时遇到过几乎一模一样的问题——对方返回的错误结构里用动态数字键标记出错的条目,强类型反序列化完全抓不到这些键。给你两个在C#/.NET里最常用的解决方案:

方法1:使用Newtonsoft.Json(Json.NET)

这是.NET生态里老牌的JSON处理库,对动态JSON的支持非常灵活:

using Newtonsoft.Json.Linq;

// 假设apiResponse是你从外部API拿到的JSON字符串
var errorJson = JObject.Parse(apiResponse);

// 导航到errors.items节点(注意空值判断,避免空引用异常)
var itemsErrorNode = errorJson["errors"]?["items"] as JObject;

if (itemsErrorNode != null)
{
    // 遍历items下的所有动态属性,每个属性的Name就是你要的索引值
    foreach (var errorProperty in itemsErrorNode.Properties())
    {
        string dynamicIndex = errorProperty.Name; // 这里就是"0""2""19"这类动态索引
        var errorDetails = errorProperty.Value["id"]?[0];
        
        // 可选:获取对应的错误信息
        string errorMessage = errorDetails?["message"]?.ToString();
        string errorCode = errorDetails?["code"]?.ToString();

        Console.WriteLine($"条目索引 {dynamicIndex} 出错:{errorMessage}(错误码:{errorCode})");
    }
}

方法2:使用System.Text.Json(.NET Core 3.0+/.NET 5+原生库)

如果你用的是较新的.NET版本,推荐用官方原生的JSON库,无需额外安装NuGet包:

using System.Text.Json;

// 解析JSON文档(建议用using语句自动释放资源)
using var jsonDoc = JsonDocument.Parse(apiResponse);
var rootElement = jsonDoc.RootElement;

// 逐层导航到errors.items节点,做足空值和类型判断
if (rootElement.TryGetProperty("errors", out var errorsElement) &&
    errorsElement.TryGetProperty("items", out var itemsElement) &&
    itemsElement.ValueKind == JsonValueKind.Object)
{
    // 枚举items下的所有动态属性
    foreach (var property in itemsElement.EnumerateObject())
    {
        string dynamicIndex = property.Name; // 动态索引值
        var errorEntry = property.Value;

        // 可选:提取错误详情
        if (errorEntry.TryGetProperty("id", out var idErrors) &&
            idErrors.ValueKind == JsonValueKind.Array &&
            idErrors.GetArrayLength() > 0)
        {
            var firstError = idErrors[0];
            string errorMessage = firstError.GetProperty("message").GetString();
            string errorCode = firstError.GetProperty("code").GetString();

            Console.WriteLine($"条目索引 {dynamicIndex} 出错:{errorMessage}(错误码:{errorCode})");
        }
    }
}

简化技巧:仅获取所有动态索引值

如果不需要错误详情,只想拿到所有动态索引的集合,可以直接简化代码:

Newtonsoft.Json版本:

var allIndexes = itemsErrorNode.Properties().Select(p => p.Name).ToList();

System.Text.Json版本:

var allIndexes = itemsElement.EnumerateObject().Select(p => p.Name).ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:23:13