Возле переменной нажми скопировать, вставь её в экшен условие '{-Json.google...-}'>='любое значение'Как мне найти нужное условие, что цена <6 и количество >0
Нужно чтобы он все проверилВозле переменной нажми скопировать, вставь её в экшен условие '{-Json.google...-}'>='любое значение'
Для этого есть кубик иф и свитч. Свитч не уверен что понимает жсон переменные, возможно нужно будет перенести через "обработка переменных".Нужно чтобы он все проверил
Привет. Так как самого примера JSON нет, а представлена картинка. Это сильно отнимает время.Паршу гетом json список. Как мне найти нужное условие, что цена <6 и количество >0
Посмотреть вложение 100648
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);
{
"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 Global.ZennoLab.Json.Linq;
google.zimbabwe[?(@.price < 6 && @.count > 0)]
или лучше $..zimbabwe[?(@.price < 6 && @.count > 0)]
.{
"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
}
]
}
}
Что то не получилось ничего, вот ответ гет запроса,который обработать нужно.@AndreyAAA, я тут подумал и решил , все же воссоздать ваш пример выше, а то у меня сложилось чувство не завершенности.
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 еще есть.
Пытался составить чисто на JSONPath, но не смог. Какие-то вещи работают на сервисах для тестов, но не работают в ZennoPoster. Вероятно, из-за того, что Newtonsoft библиотека старая.Нужно собрать данные в переменные страна и виртуал, с условием, что цена(cost) будет больше нужного нам значения(еще учесть то что могут быть дробные числа надо) (например переменная потолок цены), и count>1
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);
Пытался составить чисто на JSONPath, но не смог. Какие-то вещи работают на сервисах для тестов, но не работают в ZennoPoster. Вероятно, из-за того, что Newtonsoft библиотека старая.
Пришлось вот такой костыль пилить. ↓ Но он работает.)
Можно, конечно, через десериализацию, но это дольше объяснять.
В результирующем списке будет лежать валидные куски JSONC#: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);
Если кто знает как сделать чисто на JSONPath в Zenno напишите мне.
Приложил шаблон для теста ↓
Хм, это было неявно на мой взгляд.))Работает, но только для отной страны)
А нужно что бы он все страны анализировал же), там их несколько сотен.
zimbabwe
..SelectToken($"google.{variable}") // страна
НУ да, впринципе можно, н подксажи пожалуйста как это вкоде сделат, что вставить переменную, я буду брать новую страну в переменную и выполнять проверку.Хм, это было неявно на мой взгляд.))
Решение:
Выпишите страны которые вам нужны в список и подставляйте в цикле вместоzimbabwe
.
Тут и так:.SelectToken($"google.{variable}") // страна
Таким образом вы будите знать в какой стране какие цены и своего рода фильтрация только по нужным странам.
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]}";
Работает, но все таки, это не то.Недавно только было.
https://zennolab.com/discussion/threads/obrabotka-json.108008/post-715215
Поиск самых дешевых номеров для сервиса
Чуток изменил под этот json, что в примере
Посмотреть вложение 100709C#: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]}";
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]}");
};