Json.NET获得嵌套的jToken值

前端之家收集整理的这篇文章主要介绍了Json.NET获得嵌套的jToken值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Json.NET解析json http响应并且有工作代码,但我很确定我会以过于复杂的方式处理它.我的问题是,是否有一种更直接的方法可以通过路径获取子节点jToken和/或在不预先处理每个级别的情况下对其进行反序列化.

我试过这种方法,但它返回null:

  1. JObject jObj = JObject.Parse( text );
  2. JToken myVal;
  3. jObj.TryGetValue( "response.docs",out myVal );

这是我的工作过于复杂的代码,包括反序列化:

  1. JObject jObj = JObject.Parse( text );
  2.  
  3. foreach( var kv in jObj ) {
  4. if( kv.Key == "response" ) {
  5. foreach( JToken jt in kv.Value ) {
  6. if( jt.Path == "response.docs" ) {
  7. JEnumerable<JToken> children = jt.Children();
  8. foreach( JToken t in children ) {
  9. //THIS WORKS BUT IS NOT ELEGANT
  10. Solr_User[] su = t.ToObject<Solr_User[]>();
  11. }
  12. }
  13. }
  14. }
  15. }

这里是JSON原始响应仅供参考:

  1. {
  2. "responseHeader":{
  3. "status":0,"QTime":0,"params":{
  4. "q":"*:*","indent":"on","wt":"json"}},"response":{"numFound":4,"start":0,"docs":[
  5. {
  6. "id":3,"first_name":"Bob","_version_":"1558902640594649088"},{
  7. "id":4,"first_name":"Sam","_version_":"1558902640613523456"},{
  8. "id":2,"first_name":"Fred","_version_":"1558902640613523457"},{
  9. "id":1,"first_name":"Max","_version_":"1558902640613523458"}]
  10. }}
您可以使用 SelectToken()从LINQ-to-JSON层次结构中深入选择令牌以进行反序列化:
  1. var su = (jObj.SelectToken("response.docs") ?? JValue.CreateNull()).ToObject<Solr_User []>();

样本fiddle.

在c#6或更高版本中,您可以使用null conditional operator

  1. var su = jObj.SelectToken("response.docs")?.ToObject<Solr_User []>();

甚至

  1. var su = jObj?["response"]?["docs"]?.ToObject<Solr_User []>();

请注意,SelectTokens()比JToken index operator更宽容,因为SelectTokens()将为错误类型的查询返回null(例如,如果“response”的值是字符串文字而不是嵌套对象),而索引运算符将抛出异常.

猜你在找的Json相关文章