Выберите объект на основе условия внутри вложенного массива - PullRequest
2 голосов
/ 25 октября 2019

У меня есть Jarray ответа, и внутри Jarray есть массив Clients, и в зависимости от условия, которое мне нужно, чтобы выбрать объект в массиве Json:

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 в массиве ответов?

Ответы [ 3 ]

5 голосов
/ 25 октября 2019

На основании документации (https://www.newtonsoft.com/json/help/html/SelectToken.htm) возможное решение может быть:

response.SelectTokens("$..ClientInfo[?(@.InternalID=='98367')]").ToList();
2 голосов
/ 29 октября 2019

Вы можете запросить JSON с помощью LINQ, как показано ниже:

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();
0 голосов
/ 25 октября 2019

Если вы не хотите использовать класс, вам нужно что-то вроде этого:

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>, который будет объектом ClientInfo с указанным идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...