背景:如果一个复杂的json对象,如果只是想获取其中一个key的值,建立一个 "Model"类,进行反序列化操作太麻烦,慢慢分析json结构,再提取也很麻烦。 在这里记录一下 提供的一个比较方便的方法轻易获取。
代码参考:c# - Searching for a specific JToken by name in a JObject hierarchy - Stack Overflow

public static partial class Extensions { /// <summary> /// JToken对象转换具体值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="containerToken"></param> /// <param name="name"></param> /// <returns></returns> public static T FindFirstTokenValue<T>(this JToken containerToken, string name) { return FindFirstToken(containerToken, name).Value<T>(); } /// <summary> /// JToken集合 对象转换具体值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="containerToken"></param> /// <param name="name"></param> /// <returns></returns> public static T FindTokensValues<T>(this JToken containerToken, string name) { return FindTokens(containerToken, name).Value<T>(); } /// <summary> /// 根据Json的Key获取包含Value的JToken对象,返回对象集合中的默认一个,不存在返回Null。 /// </summary> /// <param name="containerToken"></param> /// <param name="name"></param> /// <returns>返回对象集合中的默认一个 JToken </returns> public static JToken FindFirstToken(this JToken containerToken, string name) { return FindTokens(containerToken, name).FirstOrDefault(); } /// <summary> /// 根据Json的Key获取包含Value的JToken对象,返回对象集合。 /// </summary> /// <param name="containerToken"></param> /// <param name="name"></param> /// <returns></returns> public static List<JToken> FindTokens(this JToken containerToken, string name) { List<JToken> matches = new List<JToken>(); FindTokens(containerToken, name, matches); return matches; } private static void FindTokens(JToken containerToken, string name, List<JToken> matches) { if (containerToken.Type == JTokenType.Object) { foreach (JProperty child in containerToken.Children<JProperty>()) { if (child.Name == name) { matches.Add(child.Value); } FindTokens(child.Value, name, matches); } } else if (containerToken.Type == JTokenType.Array) { foreach (JToken child in containerToken.Children()) { FindTokens(child, name, matches); } } } }