Newton JSON - Как через C# обработать все подкатегории?

The_vAe

Client
Регистрация
30.05.2019
Сообщения
3 685
Благодарностей
1 438
Баллы
113
Доброго времени суток. Подскажите, пожалуйста, есть в переменной много обьектов Json, в которых нужно найти конечную переменную, которая может быть на разной глубине в обьекте:
85711
На скрине показано, что например name и type находится аж в 3-х переходах, сначала в data - 22 строка, потом в assets 30 строка, потом в format 12-13 строка. Т.е. как-то нужно перебрать все внутренности и найти на всех глубинах name и type например, но name и type, так же могут находится в разных дорогах:
Код:
data[0][assets][0]["name"]
data[0]["name"]
и т.д.
Потом при нахождении например name, нужно будет найти его брата type, который находится на его же дороге или в его же обьекте.


Парсинг по google, не дал желаемых результатов, додумался лишь методом палок к перебору через for, например так:

C#:
// Перебор в цикле всех обьектов в json - именно по вхождениям data
for (int i = 0; i < SpisokTovarov["data"].Count(); i++)
{
    // 2 Перебор всех обьектов в json - по вхождениям assets
    for (int i2 = 0; i2 < 100; i2++)
    {
        // Попытка найти нужное в Json
        try
        {
            // Если мы нашли нужный template_id, тогда записываем в список
            if (Convert.ToString(SpisokTovarov["data"][i]["assets"][i2]["name"]) == name)
            {
                // Запись совпадения!
                Spisok.Add(Convert.ToString(SpisokTovarov["data"][i]["assets"][i2]["name"]));
                  
            }

        }
     
        // Ловим ошибку если будет
        catch
        {
        }
    }

Как логичнее будет сделать через Newton JSON так, что бы оперативнее найти name на любом уровне, а потом, когда узнали name - найти его брата type?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
979
Благодарностей
1 067
Баллы
93

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113

The_vAe

Client
Регистрация
30.05.2019
Сообщения
3 685
Благодарностей
1 438
Баллы
113
задай условия в jsonpath
Пример можно пожалуйста по условиям? Например Newton JSON на сколько я понял, не позволяет использовать метод неизвестности, например: data[0], data[1] - использовать как data[*] что бы было универсально. Либо я не нашел такой метод.

скинь сам json. поиграюсь, может какое решение и скину
Прикрепил файл
 

Вложения

  • 959,4 КБ Просмотры: 83

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 286
Благодарностей
822
Баллы
113
Заходим сюда - https://app.quicktype.io Вставляем json. Копируем полученные классы в свой проект (вносим правки при необходимости). Получаем json -> десериализуем в объекты c# и работаем дальше как с объектами.
 

The_vAe

Client
Регистрация
30.05.2019
Сообщения
3 685
Благодарностей
1 438
Баллы
113
Заходим сюда - https://app.quicktype.io Вставляем json. Копируем полученные классы в свой проект (вносим правки при необходимости). Получаем json -> десериализуем в объекты c# и работаем дальше как с объектами.
Без сторонних ресурсов чисто на одной библиотеке+C# выехать нужно бы.

Есть возможность показать примеры, как делать, пожалуйста?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
979
Благодарностей
1 067
Баллы
93
раз нормальное решение никто не написал, попробуй вот такое супер костыльное решение. Авось сгодится
 

Вложения

  • 69,9 КБ Просмотры: 78

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113
C#:
var o = Global.ZennoLab.Json.Linq.JObject.Parse(@"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4,
          'count': 100
        }
      ]
    }
  ]
}");


var acme = o.SelectToken("..*[?(@.count && @.Price)]");
return acme.Path;
 
  • Спасибо
Реакции: The_vAe

The_vAe

Client
Регистрация
30.05.2019
Сообщения
3 685
Благодарностей
1 438
Баллы
113
C#:
var o = Global.ZennoLab.Json.Linq.JObject.Parse(@"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4,
          'count': 100
        }
      ]
    }
  ]
}");


var acme = o.SelectToken("..*[?(@.count && @.Price)]");
return acme.Path;
Спасибо конечно, но на сколько я вижу, это не Newton JSON , а зенновский, который прописан через кубик, верно? Меня интересовал именно Newton JSON, так как большой разницы что через кубик или что данный C# снипет не должно быть, верно?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 652
Баллы
113

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)