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

如何在C#中用Newtonsoft解析深层嵌套JSON并获取指定结果值

嘿,我来帮你搞定这两个Newtonsoft JSON解析的问题!

问题1:如何在C#中使用Newtonsoft解析层级非常深的JSON?

解析深层JSON,Json.NET(也就是你说的Newtonsoft)有几种实用的方案,根据你的场景选就行:

  • 直接用JSON Path表达式定位:这是最高效的方式,用.逐层访问嵌套对象,[]访问数组元素,不管层级多深,只要路径写对就能直接拿到目标值。比如你的JSON层级是a.b.c.d[0].value,直接调用jo.SelectToken("a.b.c.d[0].value")就能精准获取。

  • 递归遍历所有节点:如果不确定具体路径,或者需要批量处理深层节点,可以写个递归方法遍历所有JToken:

void TraverseDeepNodes(JToken token)
{
    if (token.Type == JTokenType.Object)
    {
        foreach (JProperty prop in token.Children<JProperty>())
        {
            Console.WriteLine($"当前键:{prop.Name}");
            TraverseDeepNodes(prop.Value);
        }
    }
    else if (token.Type == JTokenType.Array)
    {
        foreach (JToken item in token.Children())
        {
            TraverseDeepNodes(item);
        }
    }
    else
    {
        Console.WriteLine($"当前值:{token.ToString()}");
    }
}

调用时传入根JObject就能遍历所有深层节点。

  • 强类型映射:如果JSON结构固定,直接定义对应嵌套类,用JsonConvert.DeserializeObject<T>反序列化,之后通过对象属性链就能轻松访问深层值。比如针对你的JSON结构定义类:
public class Root
{
    public string Type { get; set; }
    public string Msg { get; set; }
    public Result Result { get; set; }
}

public class Result
{
    [JsonProperty("execution-results")]
    public ExecutionResults ExecutionResults { get; set; }
}

public class ExecutionResults
{
    public List<ResultItem> Results { get; set; }
}

public class ResultItem
{
    public object Value { get; set; }
    public string Key { get; set; }
}

之后直接var root = JsonConvert.DeserializeObject<Root>(json);,就能通过root.Result.ExecutionResults.Results[1].Value拿到目标值。

问题2:如何访问指定JSON中目标value值?

你的代码之所以失败,核心问题是JSON Path路径不完整!看你的JSON结构:results数组在execution-results对象里,而execution-results又嵌套在result对象下,根节点里根本没有直接的results键,所以你的路径找不到任何匹配项。

给你几个可行的解决方法:

  1. 精准定位第二个元素的value:
JObject jo = JObject.Parse(Resource1.samplejson);
// 注意带连字符的键要用单引号包裹,避免语法错误
var targetValue = jo.SelectToken("result['execution-results'].results[1].value");
// 判断是否存在且等于1
bool hasTargetValue = targetValue != null && targetValue.Value<int>() == 1;
  1. 遍历数组判断是否存在value=1的元素:
    如果不确定索引,或者要批量检查,用SelectTokens遍历所有results的value:
var hasValue1 = jo.SelectTokens("result['execution-results'].results[*].value")
                  .Any(v => v.Type == JTokenType.Integer && v.Value<int>() == 1);
  1. 分步访问提升可读性:
    觉得长路径太绕?可以逐层获取节点:
JObject jo = JObject.Parse(Resource1.samplejson);
var executionResults = jo["result"]["execution-results"];
var resultsArray = executionResults["results"] as JArray;
if (resultsArray != null && resultsArray.Count > 1)
{
    var secondItem = resultsArray[1];
    int targetValue = secondItem["value"].Value<int>();
    // 这里可以处理拿到的value=1
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:08:11