Паршу гетом json список. Как мне найти нужное условие?

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Паршу гетом json список. Как мне найти нужное условие, что цена <6 и количество >0
100648
 
  • Спасибо
Реакции: 5sdylt7

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
  • Спасибо
Реакции: 5sdylt7

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
  • Спасибо
Реакции: 5sdylt7

Wide

Client
Регистрация
04.02.2013
Сообщения
945
Благодарностей
257
Баллы
63
Нужно чтобы он все проверил
Для этого есть кубик иф и свитч. Свитч не уверен что понимает жсон переменные, возможно нужно будет перенести через "обработка переменных".
 
  • Спасибо
Реакции: 5sdylt7

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Паршу гетом json список. Как мне найти нужное условие, что цена <6 и количество >0
Посмотреть вложение 100648
Привет. Так как самого примера JSON нет, а представлена картинка. Это сильно отнимает время.
Не делайте так, пожалуйста! Создайте валидный кусок JSON и вставьте его здесь в блок кода JSON.

В решении я привел, как использовать JSONPath с условием когда список содержит несколько объектов с определенной ценой, а нужно только там где цена меньше 10.
По итогу, отработки сниппета в список попадет только состояние книг, где цена меньше 10.

Вот пример решения:
Сложить данные из JSON списка в список ZM по условию:
string json = project.Variables["json"].Value;

List<string> res = new List<string>();
var o = JObject.Parse(json);
try
{
    res = o.SelectTokens("$.store.book[?(@.price < 10)]", true).Select(x => x.ToString()).ToList();
}
catch (Exception e)
{
    throw new Exception($"{e.Message}");
}

project.Lists["listZM"].Clear();
project.Lists["listZM"].AddRange(res);
JSON из примера:
{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
Не забудьте подключить using!
В Директивы using и общий код → Директивы using → Верхнее поле → using Global.ZennoLab.Json.Linq;

upd: добавил подробнее описание.

Приложил ниже шаблон с примером ↓
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: 5sdylt7, Sho и AndreyAAA

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
@AndreyAAA, я тут подумал и решил :ce: , все же воссоздать ваш пример выше, а то у меня сложилось чувство не завершенности.

JSONPath: google.zimbabwe[?(@.price < 6 && @.count > 0)] или лучше $..zimbabwe[?(@.price < 6 && @.count > 0)].
Пример JSON:
{
  "google": {
    "zimbabwe": [
        {
            "category": "Nokia old",
            "count": 2,
            "price": 5
        },
        {
            "category": "Nokia new",
            "count": 5,
            "price": 16
        },
        {
            "category": "Samsung old",
            "count": 7,
            "price": 10
        },
        {
            "category": "Samsung new",
            "count": 30,
            "price": 12
        },
        {
            "category": "Siemens old",
            "count": 0,
            "price": 3
        },
        {
            "category": "Siemens new",
            "count": 1,
            "price": 5
        }
    ]
  }
}
Шаблон для тестов ↓
 

Вложения

Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 518
Благодарностей
1 316
Баллы
113
  • Спасибо
Реакции: 5sdylt7, Sho и djaga

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
@AndreyAAA, я тут подумал и решил :ce: , все же воссоздать ваш пример выше, а то у меня сложилось чувство не завершенности.

JSONPath: google.zimbabwe[?(@.price < 6 && @.count > 0)] или лучше $..zimbabwe[?(@.price < 6 && @.count > 0)].
Пример JSON:
{
  "google": {
    "zimbabwe": [
        {
            "category": "Nokia old",
            "count": 2,
            "price": 5
        },
        {
            "category": "Nokia new",
            "count": 5,
            "price": 16
        },
        {
            "category": "Samsung old",
            "count": 7,
            "price": 10
        },
        {
            "category": "Samsung new",
            "count": 30,
            "price": 12
        },
        {
            "category": "Siemens old",
            "count": 0,
            "price": 3
        },
        {
            "category": "Siemens new",
            "count": 1,
            "price": 5
        }
    ]
  }
}
Шаблон для тестов ↓
Что то не получилось ничего, вот ответ гет запроса,который обработать нужно.
Ну а суть, это нужно найти информацию по нужной стране где цена например не больше 6.
Там как бы больше информацию, и user id еще есть.
 

Вложения

  • Спасибо
Реакции: 5sdylt7 и Sho

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Нужно собрать данные в переменные страна и виртуал, с условием, что цена(cost) будет больше нужного нам значения(еще учесть то что могут быть дробные числа надо) (например переменная потолок цены), и count>1
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Что то не получилось ничего, вот ответ гет запроса,который обработать нужно.
Ну а суть, это нужно найти информацию по нужной стране где цена например не больше 6.
Там как бы больше информацию, и user id еще есть.
Нужно собрать данные в переменные страна и виртуал, с условием, что цена(cost) будет больше нужного нам значения(еще учесть то что могут быть дробные числа надо) (например переменная потолок цены), и count>1
Пытался составить чисто на JSONPath, но не смог. Какие-то вещи работают на сервисах для тестов, но не работают в ZennoPoster. Вероятно, из-за того, что Newtonsoft библиотека старая.
Пришлось вот такой костыль пилить. ↓ Но он работает.)
Можно, конечно, через десериализацию, но это дольше объяснять.
C#:
string json = project.Variables["json"].Value;

var result = (from s in JObject.Parse(json).SelectToken("google.zimbabwe") // страна
                               .Children().Select(x => "{\r\n" + x + "\r\n}").ToList()
              let cost = double.Parse(JObject.Parse(s).SelectToken("$..cost").ToString())
              let count = double.Parse(JObject.Parse(s).SelectToken("$..count").ToString())
              where cost < 20 && count > 0 // условие поиска
              select s).ToList();

project.Lists["listZM"].Clear();
project.Lists["listZM"].AddRange(result);
В результирующем списке будет лежать валидные куски JSON
Если кто знает как сделать чисто на JSONPath в Zenno напишите мне.

Приложил шаблон для теста ↓
 

Вложения

Последнее редактирование:

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Пытался составить чисто на JSONPath, но не смог. Какие-то вещи работают на сервисах для тестов, но не работают в ZennoPoster. Вероятно, из-за того, что Newtonsoft библиотека старая.
Пришлось вот такой костыль пилить. ↓ Но он работает.)
Можно, конечно, через десериализацию, но это дольше объяснять.
C#:
string json = project.Variables["json"].Value;

var result = (from s in JObject.Parse(json).SelectToken("google.zimbabwe") // страна
                               .Children().Select(x => "{\r\n" + x + "\r\n}").ToList()
              let cost = double.Parse(JObject.Parse(s).SelectToken("$..cost").ToString())
              let count = double.Parse(JObject.Parse(s).SelectToken("$..count").ToString())
              where cost < 20 && count > 0 // условие поиска
              select s).ToList();

project.Lists["listZM"].Clear();
project.Lists["listZM"].AddRange(result);
В результирующем списке будет лежать валидные куски JSON
Если кто знает как сделать чисто на JSONPath в Zenno напишите мне.

Приложил шаблон для теста ↓

Работает, но только для отной страны)
А нужно что бы он все страны анализировал же), там их несколько сотен.
 

djaga

Administrator
Команда форума
Регистрация
26.04.2020
Сообщения
546
Благодарностей
1 125
Баллы
93
Работает, но только для отной страны)
А нужно что бы он все страны анализировал же), там их несколько сотен.
Хм, это было неявно на мой взгляд.))

Решение:
Выпишите страны которые вам нужны в список и подставляйте в цикле вместо zimbabwe.
Тут и так: .SelectToken($"google.{variable}") // страна
Таким образом вы будите знать в какой стране какие цены и своего рода фильтрация только по нужным странам.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Хм, это было неявно на мой взгляд.))

Решение:
Выпишите страны которые вам нужны в список и подставляйте в цикле вместо zimbabwe.
Тут и так: .SelectToken($"google.{variable}") // страна
Таким образом вы будите знать в какой стране какие цены и своего рода фильтрация только по нужным странам.
НУ да, впринципе можно, н подксажи пожалуйста как это вкоде сделат, что вставить переменную, я буду брать новую страну в переменную и выполнять проверку.
 
  • Спасибо
Реакции: 5sdylt7

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Недавно только было.
https://zennolab.com/discussion/threads/obrabotka-json.108008/post-715215
Поиск самых дешевых номеров для сервиса
Чуток изменил под этот json, что в примере
C#:
string service = "google";
long minimum_count = long.Parse("1");
List<string[]> list = new List<string[]>();
foreach(string country in project.Json.GetMember(service).GetMembersList()){
    try{
        foreach(string virt in project.Json.GetMember(service).GetMember(country).GetMembersList()){
            long count = (long)project.Json.GetMember(service).GetMember(country).GetMember(virt).count;
            if(count >=  minimum_count){
                string price = project.Json.GetMember(service).GetMember(country).GetMember(virt).cost.ToString();
                list.Add(new string[] {country, virt, price, count.ToString()});
            }
        }
    }catch{}
}
string[] result = list.OrderBy(x=>double.Parse(x[2])).First();
project.SendInfoToLog($"страна - {result[0]}.{result[1]}, цена - {result[2]}, количество - {result[3]}");
return $"{result[0]}.{result[1]}";
100709
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Недавно только было.
https://zennolab.com/discussion/threads/obrabotka-json.108008/post-715215
Поиск самых дешевых номеров для сервиса
Чуток изменил под этот json, что в примере
C#:
string service = "google";
long minimum_count = long.Parse("1");
List<string[]> list = new List<string[]>();
foreach(string country in project.Json.GetMember(service).GetMembersList()){
    try{
        foreach(string virt in project.Json.GetMember(service).GetMember(country).GetMembersList()){
            long count = (long)project.Json.GetMember(service).GetMember(country).GetMember(virt).count;
            if(count >=  minimum_count){
                string price = project.Json.GetMember(service).GetMember(country).GetMember(virt).cost.ToString();
                list.Add(new string[] {country, virt, price, count.ToString()});
            }
        }
    }catch{}
}
string[] result = list.OrderBy(x=>double.Parse(x[2])).First();
project.SendInfoToLog($"страна - {result[0]}.{result[1]}, цена - {result[2]}, количество - {result[3]}");
return $"{result[0]}.{result[1]}";
Посмотреть вложение 100709
Работает, но все таки, это не то.
НУжно переберать дальше код, потому что не факт что зайдет самый дешевый номер и страна.
 
  • Спасибо
Реакции: 5sdylt7

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
C#:
string service = "google";
long minimum_count = long.Parse("1");
double minimum_price = double.Parse("6");
List<string[]> list = new List<string[]>();
foreach(string country in project.Json.GetMember(service).GetMembersList()){
    try{
        foreach(string virt in project.Json.GetMember(service).GetMember(country).GetMembersList()){
            long count = (long)project.Json.GetMember(service).GetMember(country).GetMember(virt).count;
            if(count >=  minimum_count){
                string price = project.Json.GetMember(service).GetMember(country).GetMember(virt).cost.ToString();
                list.Add(new string[] {country, virt, price, count.ToString()});
            }
        }
    }catch{}
}
foreach(string[] row in list.Where(x=>double.Parse(x[2])<minimum_price).OrderBy(x=>double.Parse(x[2]))){
    project.Tables["table"].AddRow(row);
    project.SendInfoToLog($"страна - {row[0]}.{row[1]}, цена - {row[2]}, количество - {row[3]}");
};
1670925824035.png
Ну, а дальше уже брать первую строку из таблицы с удалением
1670925855296.png
 
Последнее редактирование:
  • Спасибо
Реакции: AndreyAAA, 5sdylt7 и Sho

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