Найти номер нужной "строки" в JSON

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 617
Благодарностей
1 214
Баллы
113
Суть следующая. Есть JSON, допустим, с размерами товара.
У разных товаров количество "блоков" в JSON может отличаться, потому как у каждого могут быть свои размеры.
При этом один и тот же размер у разных товаров имеет один и тот же ID - допустим S13.
Как можно быстро найти, скажем так, номер этого блока а-ля {-Json.data.items[ВОТ ТУТ НОМЕР].size_id-}, чтобы потом можно было по этому же номеру собрать остальные данные?
Понятно, что можно в цикле пройтись по всем "до совпадения" (и это самый очевидный вариант), но хочется чуть упростить процесс, тем более, что искать в каждом товаре надо будет несколько "размеров". Т.е., хочется взять JSON, взять из списка ID размеров, по каждому ID найти свой блок и вставить данные по нему в таблицу (ну или нули вставить, если не нашел).
Хочется обойтись без дополнительных библиотек. Может, каким-то сниппетом просто находить нужный номер по этому условному S13.

ps. Хотя, посмотрел, можно поэкспериментировать на предмет парсинга через промежуточную таблицу, где уже просто забирать данные из строки с нужным значением (хотя, по сути, там тот же цикл). Но, наверное, можно и без этого обойтись.
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
103928


C#:
// генерируем демо данные
var items = new List<object> {
    new { size_id = "S_13" },
    new { size_id = "S_14" },
    new { size_id = "S_13" },
    new { size_id = "S_15" },
    new { size_id = "S_13" },
    new { size_id = "S_16" }
};

var d = new { data = new { items } };
string json = Global.ZennoLab.Json.JsonConvert.SerializeObject(d,  Global.ZennoLab.Json.Formatting.None);
project.Json.FromString(json);// чтобы посмотреть в переменных зенно

// разбираем результат
var ob = Global.ZennoLab.Json.Linq.JObject.Parse(json);
var nums = ob.SelectTokens("$.data.items[*].size_id")
    .Select((b, i) => {
        int n = -1;
        var num = (string)b == "S_15" ? Regex.Match(b.Path, @"(?<=\[).*?(?=])" ).Value : null; // забираем между
        return int.TryParse(num, out n) ? n : -1;
    })
    .Where(n => n >= 0);

return string.Join(" ", nums.Select(x=>x.ToString()));
 
  • Спасибо
Реакции: Moonwalker и Alexmd

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 617
Благодарностей
1 214
Баллы
113
О, спасибо за вариант! Затестю вечером..
 
  • Спасибо
Реакции: BAZAg

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 617
Благодарностей
1 214
Баллы
113
С демо-данными работает, осталось разобраться, как обрабатывать результат, который уже после кубика "Парсинг JSON" )))
Пошел копать. За направление - спасибо.

update: В общем, запихал пока просто переменную с JSON'ом в
C#:
var ob = Global.ZennoLab.Json.Linq.JObject.Parse(project.Variables["product_json"].Value);
Находит верно ))) В моем случае - сойдет. На будущее уже разберусь с остальным. Еще раз огромное спасибо )))
 
Последнее редактирование:
  • Спасибо
Реакции: BAZAg

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