根据嵌套数组中的条件选择对象

时间:2019-10-25 13:57:05

标签: c# json json.net

我有一个响应的Jarray,并且在Jarray中有一个Clients数组,根据我需要在Array中选择对象的条件 杰森是

JArray response = JArray.Parse(@"[
                  {
                    'ProviderTransactionID': '4c4c5b43-0dd6-490c-9a59-062e25c04019',
                     'IsSuccess': 'False',
                     'ErrorMessages': 'Some error',
                      'ClientInfo': [
                       {
                         'InternalID': '98367',
                         'UniqueID': '',
                         'ErrorMessages': 'ERROR:'
                       },
                       {
                         'InternalID': '98368',
                         'UniqueID': '',
                         'ErrorMessages': 'ERROR:'
                       }
                     ]
                   }
            ]");

例如,我需要选择ClientInfo对象,其中InternalID = 98367

但是

response.SelectToken("ClientInfo") returning null

response.SelectToken("ClientInfo") as JArray returning null

response.SelectTokens("ClientInfo") not returning any result

response.Children().Where(lst=>lst.SelectToken("ClientInfo").HasValues) is throwing Arg_PlatformNotSupported exception

response.SelectTokens("ClientInfo").Where(lst=>lst.Value<int>()==98367).FirstOrDefault() is returning null

有人可以帮助我如何获取响应数组中所有与ClientInfo对象匹配的ID吗?

3 个答案:

答案 0 :(得分:5)

根据文档( https://www.newtonsoft.com/json/help/html/SelectToken.htm ),可能的解决方案可以是:

response.SelectTokens("$..ClientInfo[?(@.InternalID=='98367')]").ToList();

答案 1 :(得分:2)

您可以使用LINQ查询JSON,如下所示:

var Result = (from p in response
                           select new
                           {
                               Errors = (from z in p["ClientInfo"]
                                         where (string)z["InternalID"] == "98368"
                                         select new
                                         {
                                             InternalID = (string)z["InternalID"],
                                             UniqueID = (string)z["UniqueID"],
                                             ErrorMessages = (string)z["ErrorMessages"],
                                         }).ToList()

                           }).ToList();

我们可以使用匿名类型。net将在内部创建类。  如果要使用父数据元素,请同时说ProviderTransactionID  下面的代码也适用于

        var Result = (from p in response
                           select  (from z in p["ClientInfo"]
                                         where (int)z["InternalID"] == 98368
                                         select new
                                         {
                                             ProviderTransactionID = (string)p["ProviderTransactionID"],
                                             InternalID = (int)z["InternalID"],
                                             UniqueID = (string)z["UniqueID"],
                                             ErrorMessages = (string)z["ErrorMessages"],
                                         }
                                         ).ToList()

                           ).ToList();

答案 2 :(得分:0)

如果您不想使用课程,则需要这样的东西:

JArray jArray = JArray.Parse("[\r\n                  {\r\n                    'ProviderTransactionID': '4c4c5b43-0dd6-490c-9a59-062e25c04019',\r\n                     'IsSuccess': 'False',\r\n                     'ErrorMessages': 'Some error',\r\n                      'ClientInfo': [\r\n                       {\r\n                         'InternalID': '98367',\r\n                         'UniqueID': '',\r\n                         'ErrorMessages': 'ERROR:'\r\n                       },\r\n                       {\r\n                         'InternalID': '98368',\r\n                         'UniqueID': '',\r\n                         'ErrorMessages': 'ERROR:'\r\n                       }\r\n                     ]\r\n                   }\r\n            ]");

const string internalId = "98367";

foreach (JToken obj in jArray)
{
    IEnumerable<JToken> clientInfoObjects = obj.SelectToken("ClientInfo").Where(clientInfoJToken => clientInfoJToken["InternalID"].Value<string>() == internalId);
}

因此,由于要解析为JArray,因此需要遍历对象(尽管在您的情况下只有一个)。

然后,您处于对象级别,因此可以使用.SelectToken("ClientInfo"),它为您提供了一个JToken(JArray),使您可以使用.Where()来过滤满足您要求的对象。

结果是一个IEnumerable<JToken>,它将是具有您指定ID的ClientInfo对象。