Json.NET获得嵌套的jToken值
发布时间:2020-12-16 19:47:31 所属栏目:百科 来源:网络整理
导读:我正在使用Json.NET解析json http响应并且有工作代码,但我很确定我会以过于复杂的方式处理它.我的问题是,是否有一种更直接的方法可以通过路径获取子节点jToken和/或在不预先处理每个级别的情况下对其进行反序列化. 我试过这种方法,但它返回null: JObject jO
|
我正在使用Json.NET解析json http响应并且有工作代码,但我很确定我会以过于复杂的方式处理它.我的问题是,是否有一种更直接的方法可以通过路径获取子节点jToken和/或在不预先处理每个级别的情况下对其进行反序列化.
我试过这种方法,但它返回null: JObject jObj = JObject.Parse( text ); JToken myVal; jObj.TryGetValue( "response.docs",out myVal ); 这是我的工作过于复杂的代码,包括反序列化: JObject jObj = JObject.Parse( text );
foreach( var kv in jObj ) {
if( kv.Key == "response" ) {
foreach( JToken jt in kv.Value ) {
if( jt.Path == "response.docs" ) {
JEnumerable<JToken> children = jt.Children();
foreach( JToken t in children ) {
//THIS WORKS BUT IS NOT ELEGANT
Solr_User[] su = t.ToObject<Solr_User[]>();
}
}
}
}
}
这里是JSON原始响应仅供参考: {
"responseHeader":{
"status":0,"QTime":0,"params":{
"q":"*:*","indent":"on","wt":"json"}},"response":{"numFound":4,"start":0,"docs":[
{
"id":3,"first_name":"Bob","_version_":"1558902640594649088"},{
"id":4,"first_name":"Sam","_version_":"1558902640613523456"},{
"id":2,"first_name":"Fred","_version_":"1558902640613523457"},{
"id":1,"first_name":"Max","_version_":"1558902640613523458"}]
}}
您可以使用
SelectToken()从LINQ-to-JSON层次结构中深入选择令牌以进行反序列化:
var su = (jObj.SelectToken("response.docs") ?? JValue.CreateNull()).ToObject<Solr_User []>();
样本fiddle. 在c#6或更高版本中,您可以使用null conditional operator: var su = jObj.SelectToken("response.docs")?.ToObject<Solr_User []>();
甚至 var su = jObj?["response"]?["docs"]?.ToObject<Solr_User []>(); 请注意,SelectTokens()比 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
