Как я могу найти индекс объекта в JArray на основе соответствующего поиска? - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь найти индекс объекта внутри JArray на основе поиска.

Что я хочу получить, так это возможность сделать это

JArray articles = (JArray)DetailedData["product"]["articlesList"][x]

Проблемая не знаю, как найти то, что х

JSON выглядит следующим образом (сильно сокращен)

 "articlesList": [
                {
                    "code": "0587026001",

Я хочу найти индекс х, где код = 0587026001, но я не могу понять,

Я пытался

var index = articlesList.IndexOf("$.[?(@.<code>=='0587026001')]");

, но это вернуло -1

Как я могу найти индекс x, где код соответствует описанному выше?

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Надеюсь, я правильно понял ваш вопрос. Вы можете найти индекс следующим образом

var result = JObject.Parse(json);
var selectedIndex = result["articlesList"].Select((x,index)=> new { Code= x.Value<string>("code"), Node = x, Index = index})
                                         .Single(x=>x.Code == "0587026003")
                                         .Index;
1 голос
/ 31 октября 2019

Вы можете использовать SelectTokens для поиска соответствующих токенов на основе критериев фильтра.

Приведенный ниже код выбирает все токены в articleList, код которых равен '0587026001'

IEnumerable<JToken> tokens = o.SelectTokens("$..articlesList[?(@.Code == '0587026001')]");

Проверьте эту скриптовую точку - https://dotnetfiddle.net/EJvyfp, которая демонстрирует ее использование.

Пример кода:

public class Program
{
    public static void Main()
    {
        JArray o = JArray.Parse(@"[{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'articlesList': [
    {
      'Code': '0587026001',
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Code': '456',
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
},
{
'Stores': [
    'ABD',
    'XYZ'
  ],
  'articlesList': [
    {
    'Code': '789',
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
    'Code': '1234',
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}]");

        //Console.WriteLine(o);

        IEnumerable<JToken> tokens = o.SelectTokens("$..articlesList[?(@.Code == '0587026001')]");
        Console.WriteLine(tokens.Count());
        Console.WriteLine(tokens.First());
        Console.WriteLine("Hello World");
    }
}

Приведенная выше программа возвращает вывод в виде

{
  "Code": "0587026001",
  "Name": "Acme Co",
  "Products": [
    {
      "Name": "Anvil",
      "Price": 50
    }
  ]
}
0 голосов
/ 31 октября 2019

Вот как вы можете это сделать:

private static int GetIndex(string code)
        {
            string json = "{\"product\": {\"articleList\": [{\"code\": \"0587026001\"}, {\"code\": \"0587026002\"}]}}";
            var jObject = JObject.Parse(json);
            var articleList = JArray.Parse(jObject["product"]["articleList"].ToString());
            var requiredArticle = articleList.First(a => a["code"].ToString().Equals(code));
            return articleList.IndexOf(requiredArticle);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...