如何在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键,所以你的路径找不到任何匹配项。
给你几个可行的解决方法:
- 精准定位第二个元素的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;
- 遍历数组判断是否存在value=1的元素:
如果不确定索引,或者要批量检查,用SelectTokens遍历所有results的value:
var hasValue1 = jo.SelectTokens("result['execution-results'].results[*].value") .Any(v => v.Type == JTokenType.Integer && v.Value<int>() == 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
相关产品推荐
相关产品推荐

