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

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 496
Благодарностей
1 304
Баллы
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
Сообщения
902
Благодарностей
934
Баллы
93
скинь сам json. поиграюсь, может какое решение и скину
 

doc

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

Gunjubasik

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

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

Вложения

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

Oleg1987

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

Gunjubasik

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

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

volody00

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

Вложения

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
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;
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 496
Благодарностей
1 304
Баллы
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 684
Благодарностей
4 641
Баллы
113

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