JSON переменные в опр. формате, в список

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Всем доброго времени суток. Стоит задача - из sms сервиса 5sim необходимо распарсить ответ на запрос и поместить в список в таком формате, прим. afghanistan.virtual21.cost 13 afghanistan.virtual21.count 14 (в одной строке, либо если это невозможно, в две. важно что-бы имена переменных были указаны, а не только их значения, из них в дальнейшем я формирую удобный список нужных параметров, страна-оператор-цена, для дальнейшего заказа sms). Так-же прикладываю скриншоты. Я сколько-бы не пытался, бессилен в этом.
 

Вложения

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
304
Баллы
63
Пришлось поплясать с бубном, но как вариант, можно так:
Вставить в кубик C#:
var resp = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");

var zennoList = project.Lists["SomeKindOfList"];
var fields = new Dictionary<string, Global.ZennoLab.Json.Linq.JValue>();
var json = Global.ZennoLab.Json.Linq.JObject.Parse(resp);
var countries = json.SelectTokens("['facebook']");

foreach (var country in countries) CollectFields(country);

foreach (var countryName in countries.SelectMany(x => x).OfType<Global.ZennoLab.Json.Linq.JProperty>())
    zennoList.Add(fields.Where(x => x.Key.Contains(countryName.Name)).Select(x => $"{x.Key} {x.Value}").Aggregate((acc, val) => $"{acc} {val}"));

void CollectFields(Global.ZennoLab.Json.Linq.JToken jToken)
{
    switch (jToken.Type)
    {
        case Global.ZennoLab.Json.Linq.JTokenType.Object:
            foreach (var child in jToken.Children<Global.ZennoLab.Json.Linq.JProperty>()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Array:
            foreach (var child in jToken.Children()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Property:
            CollectFields(((Global.ZennoLab.Json.Linq.JProperty) jToken).Value);
            break;
        default:
            fields.Add(jToken.Path, (Global.ZennoLab.Json.Linq.JValue)jToken);
            break;
    }
}
92934
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Пришлось поплясать с бубном, но как вариант, можно так:
Вставить в кубик C#:
var resp = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");

var zennoList = project.Lists["SomeKindOfList"];
var fields = new Dictionary<string, Global.ZennoLab.Json.Linq.JValue>();
var json = Global.ZennoLab.Json.Linq.JObject.Parse(resp);
var countries = json.SelectTokens("['facebook']");

foreach (var country in countries) CollectFields(country);

foreach (var countryName in countries.SelectMany(x => x).OfType<Global.ZennoLab.Json.Linq.JProperty>())
    zennoList.Add(fields.Where(x => x.Key.Contains(countryName.Name)).Select(x => $"{x.Key} {x.Value}").Aggregate((acc, val) => $"{acc} {val}"));

void CollectFields(Global.ZennoLab.Json.Linq.JToken jToken)
{
    switch (jToken.Type)
    {
        case Global.ZennoLab.Json.Linq.JTokenType.Object:
            foreach (var child in jToken.Children<Global.ZennoLab.Json.Linq.JProperty>()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Array:
            foreach (var child in jToken.Children()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Property:
            CollectFields(((Global.ZennoLab.Json.Linq.JProperty) jToken).Value);
            break;
        default:
            fields.Add(jToken.Path, (Global.ZennoLab.Json.Linq.JValue)jToken);
            break;
    }
}
Спасибо большое, добрый человек! :az: :ay:
 

Вложения

  • Спасибо
Реакции: SHILY

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Всё работает как нужно, благодарю еще раз за потраченное время и реализацию)
 
  • Спасибо
Реакции: SHILY

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
304
Баллы
63
  • Спасибо
Реакции: brun0, djaga и ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
  • Спасибо
Реакции: SHILY

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Пришлось поплясать с бубном, но как вариант, можно так:
Вставить в кубик C#:
var resp = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");

var zennoList = project.Lists["SomeKindOfList"];
var fields = new Dictionary<string, Global.ZennoLab.Json.Linq.JValue>();
var json = Global.ZennoLab.Json.Linq.JObject.Parse(resp);
var countries = json.SelectTokens("['facebook']");

foreach (var country in countries) CollectFields(country);

foreach (var countryName in countries.SelectMany(x => x).OfType<Global.ZennoLab.Json.Linq.JProperty>())
    zennoList.Add(fields.Where(x => x.Key.Contains(countryName.Name)).Select(x => $"{x.Key} {x.Value}").Aggregate((acc, val) => $"{acc} {val}"));

void CollectFields(Global.ZennoLab.Json.Linq.JToken jToken)
{
    switch (jToken.Type)
    {
        case Global.ZennoLab.Json.Linq.JTokenType.Object:
            foreach (var child in jToken.Children<Global.ZennoLab.Json.Linq.JProperty>()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Array:
            foreach (var child in jToken.Children()) CollectFields(child);
            break;
        case Global.ZennoLab.Json.Linq.JTokenType.Property:
            CollectFields(((Global.ZennoLab.Json.Linq.JProperty) jToken).Value);
            break;
        default:
            fields.Add(jToken.Path, (Global.ZennoLab.Json.Linq.JValue)jToken);
            break;
    }
}
Спасибо, за способ работы с JSON, почерпнул для себя новые варианты.
Но, данную задачу можно решить куда проще. Или я чего-то не понял...
Поправьте пожалуйста, если ошибаюсь.
Пример:
C#:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
92947


без слова facebook:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
project.Json.FromString(project.Json.GetMember("facebook").ToString());
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
92948


Хотя, наверно все же я не правильно понял задачу - как-то по другому видимо нужно выводить эти строки...
 
Последнее редактирование:

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Спасибо, за способ работы с JSON, почерпнул для себя новые варианты.
Но, данную задачу можно решить куда проще. Или я чего-то не понял...
Поправьте пожалуйста, если ошибаюсь.
Пример:
C#:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
Посмотреть вложение 92947

без слова facebook:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
project.Json.FromString(project.Json.GetMember("facebook").ToString());
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
Посмотреть вложение 92948

Хотя, наверно все же я не правильно понял задачу - как-то по другому видимо нужно выводить эти строки...
Вы прекрасно поняли задачу, только вывод данных строк нужен не в лог, а список.
Благодарю вас так-же :-)
 
  • Спасибо
Реакции: BAZAg

SHILY

Client
Регистрация
05.06.2016
Сообщения
258
Благодарностей
304
Баллы
63
Спасибо, за способ работы с JSON, почерпнул для себя новые варианты.
Но, данную задачу можно решить куда проще. Или я чего-то не понял...
Поправьте пожалуйста, если ошибаюсь.
Пример:
C#:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
Воу! Не думал, что это можно так просто решить. Спасибо за классный и лаконичный вариант, +1 в копилочку знаний :-)
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Всем доброго утра. Ребят, не сочтите за наглость, хотелось бы еще помощи по данной теме. SHILY, BAZAg :ah::ah::ah:

Есть ли возможность по одному клику отсортировать значения по спискам? Пользуясь дефолт кубиками от зенно перебор нужных значений и сортировка происходят значительно долго. Хотел узнать, возможно ли набросать код таким образом, что-бы происходило следующее: к примеру имеем следующую строку из основного списка "zamibia.vitrual32.cost:24,61 zamibia.vitrual32.count: 1000" и множество других. необходимо сперва удалить все строки из списка со значением "count: 0". Затем, основываясь на строках со значением "cost" рассортировать по новым 4-м спискам, в каждом из которых будет лежать свой диапазон значений "cost" - в одном будут лежать строки со значениями от 1 до 4 (cost: 3 / cost: 3,5 / cost: 4), в других трех "от 5 до 8", "от 9 до 12" и "от 13 и выше (всё остальное)". Ниже постараюсь донести наглядно.

Имеем основной список и строки в нем:
  1. country1.operator1.cost: 1 country1.operator1.count: 0
  2. country2.operator2.cost: 2 country2.operator2.count: 0
  3. country3.operator3.cost: 3 country3.operator3.count: 100
  4. country4.operator4.cost: 4 country4.operator4.count: 200
  5. country5.operator5.cost: 5 country5.operator5.count: 300
  6. country6.operator6.cost: 6 country6.operator6.count: 400
  7. country7.operator7.cost: 7 country7.operator7.count: 450
  8. country8.operator8.cost: 8 country8.operator8.count: 500
  9. country9.operator9.cost: 9 country9.operator9.count: 510
  10. country10.operator10.cost: 10 country10.operator10.count: 110
  11. country11.operator11.cost: 11 country11.operator11.count: 50
  12. country12.operator12.cost: 12 country12.operator12.count: 30
  13. country13.operator13.cost: 13 country13.operator13.count: 100
  14. country14.operator14.cost: 14 country14.operator14.count: 1000
  15. country15.operator15.cost: 15 country15.operator15.count: 1000
Отсюда нам нужно удалить первые две строки, где присутствует "count: 0"
Далее, переносим в список cost 1-4, строки 3 и 4.
В список cost 5-8, строки 5, 6, 7 и 8.
В список cost 9-12, строки 9, 10, 11 и 12.
В список cost 13+, строки 13, 14, 15 и все остальные, где значение выше.

Заранее благодарен всем неравнодушным :-)
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 024
Благодарностей
544
Баллы
113
Всем доброго утра. Ребят, не сочтите за наглость, хотелось бы еще помощи по данной теме. SHILY, BAZAg :ah::ah::ah:

Есть ли возможность по одному клику отсортировать значения по спискам? Пользуясь дефолт кубиками от зенно перебор нужных значений и сортировка происходят значительно долго. Хотел узнать, возможно ли набросать код таким образом, что-бы происходило следующее: к примеру имеем следующую строку из основного списка "zamibia.vitrual32.cost:24,61 zamibia.vitrual32.count: 1000" и множество других. необходимо сперва удалить все строки из списка со значением "count: 0". Затем, основываясь на строках со значением "cost" рассортировать по новым 4-м спискам, в каждом из которых будет лежать свой диапазон значений "cost" - в одном будут лежать строки со значениями от 1 до 4 (cost: 3 / cost: 3,5 / cost: 4), в других трех "от 5 до 8", "от 9 до 12" и "от 13 и выше (всё остальное)". Ниже постараюсь донести наглядно.

Имеем основной список и строки в нем:
  1. country1.operator1.cost: 1 country1.operator1.count: 0
  2. country2.operator2.cost: 2 country2.operator2.count: 0
  3. country3.operator3.cost: 3 country3.operator3.count: 100
  4. country4.operator4.cost: 4 country4.operator4.count: 200
  5. country5.operator5.cost: 5 country5.operator5.count: 300
  6. country6.operator6.cost: 6 country6.operator6.count: 400
  7. country7.operator7.cost: 7 country7.operator7.count: 450
  8. country8.operator8.cost: 8 country8.operator8.count: 500
  9. country9.operator9.cost: 9 country9.operator9.count: 510
  10. country10.operator10.cost: 10 country10.operator10.count: 110
  11. country11.operator11.cost: 11 country11.operator11.count: 50
  12. country12.operator12.cost: 12 country12.operator12.count: 30
  13. country13.operator13.cost: 13 country13.operator13.count: 100
  14. country14.operator14.cost: 14 country14.operator14.count: 1000
  15. country15.operator15.cost: 15 country15.operator15.count: 1000
Отсюда нам нужно удалить первые две строки, где присутствует "count: 0"
Далее, переносим в список cost 1-4, строки 3 и 4.
В список cost 5-8, строки 5, 6, 7 и 8.
В список cost 9-12, строки 9, 10, 11 и 12.
В список cost 13+, строки 13, 14, 15 и все остальные, где значение выше.

Заранее благодарен всем неравнодушным :-)
Удалить строки где присутствует каунт 0 вот так можно

C#:
            IZennoList list = project.Lists["OsnovnoyList"];

            int n = 0;
            while (true)
            {
                if (list[n].Contains("count: 0"))
                {
                    list.RemoveAt(n);
                }
                else
                {                
                    n++;
                }
                if (n == list.Count) break;
            }
Второе я не допер как делать) т.к cost: 10 тоже содержит cost: 1 в итоге в отдельный список будет положено и то и другое
 
Последнее редактирование:
  • Спасибо
Реакции: ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Удалить строки где присутствует каунт 0 вот так можно

C#:
            IZennoList list = project.Lists["OsnovnoyList"];

            int n = 0;
            while (true)
            {
                if (list[n].Contains("count: 0"))
                {
                    list.RemoveAt(n);
                }
                else
                {              
                    n++;
                }
                if (n == list.Count) break;
            }
Второе я не допер как делать) т.к cost: 10 тоже содержит cost: 1 в итоге в отдельный список будет положено и то и другое
Спасибо друже :-) Думаю если изначально в список складывать, что-бы между значениями country.operator.cost:1 и country.operator.count:2 стоял определенный разделитель, двоеточие к примеру, и далее собрать регулярку где перед нужным значением cost: , а после : (разделитель).
ЗЫ. В нашем случае там пробел стоит, на него ориентироваться если?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 024
Благодарностей
544
Баллы
113
Спасибо друже :-) Думаю если изначально в список складывать, что-бы между значениями country.operator.cost:1 и country.operator.count:2 стоял определенный разделитель, двоеточие к примеру, и далее собрать регулярку где перед нужным значением cost: , а после : (разделитель).
ЗЫ. В нашем случае там пробел стоит, на него ориентироваться если?
Вот, тут и чистит от каунт 0 и разбивает по спискам. Да простят меня Рихтер и Мартин за такую срань.

C#:
IZennoList list = project.Lists["OsnovnoyList"];
IZennoList cost1_4 = project.Lists["cost 1-4"];
IZennoList cost5_8 = project.Lists["cost 5-8"];
IZennoList cost9_12 = project.Lists["cost 9-12"];
IZennoList cost13_ = project.Lists["cost 13_"];
                    


            int n = 0;
            while (true)
            {
                if (list[n].Contains("count: 0"))
                {
                    list.RemoveAt(n);
                }
                else
                {
                    n++;
                }
                if (n == list.Count) break;
            }

            int a = 0;
            while (true)
            {
         
                if (list[a].Contains("cost: 1 country") || list[a].Contains("cost: 2 country") || list[a].Contains("cost: 3 country") || list[a].Contains("cost: 4 country"))
                {
                    cost1_4.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                if (list[a].Contains("cost: 5 country") || list[a].Contains("cost: 6 country") || list[a].Contains("cost: 7 country") || list[a].Contains("cost: 8 country"))
                {
                    cost5_8.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                if (list[a].Contains("cost: 9 country") || list[a].Contains("cost: 10 country") || list[a].Contains("cost: 11 country") || list[a].Contains("cost: 12 country"))
                {
                    cost9_12.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                a++;
                if (a == list.Count) break;
            }

            foreach (var item in list)
            {
                cost13_.Add(item);
            }

            list.Clear();

Тут мы получается удаляем строки где count:0 потом то что осталось разбиваем по спискам где значения 1-4. 5-8. 9-12. все что осталось после этих действий запихиваем в список где cost 13 и больше. И чистим изначальный список
 
  • Спасибо
Реакции: ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Вот, тут и чистит от каунт 0 и разбивает по спискам. Да простят меня Рихтер и Мартин за такую срань.

C#:
IZennoList list = project.Lists["OsnovnoyList"];
IZennoList cost1_4 = project.Lists["cost 1-4"];
IZennoList cost5_8 = project.Lists["cost 5-8"];
IZennoList cost9_12 = project.Lists["cost 9-12"];
IZennoList cost13_ = project.Lists["cost 13_"];
                   


            int n = 0;
            while (true)
            {
                if (list[n].Contains("count: 0"))
                {
                    list.RemoveAt(n);
                }
                else
                {
                    n++;
                }
                if (n == list.Count) break;
            }

            int a = 0;
            while (true)
            {
        
                if (list[a].Contains("cost: 1 country") || list[a].Contains("cost: 2 country") || list[a].Contains("cost: 3 country") || list[a].Contains("cost: 4 country"))
                {
                    cost1_4.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                if (list[a].Contains("cost: 5 country") || list[a].Contains("cost: 6 country") || list[a].Contains("cost: 7 country") || list[a].Contains("cost: 8 country"))
                {
                    cost5_8.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                if (list[a].Contains("cost: 9 country") || list[a].Contains("cost: 10 country") || list[a].Contains("cost: 11 country") || list[a].Contains("cost: 12 country"))
                {
                    cost9_12.Add(list[a]);
                    list.RemoveAt(a);
                    continue;
                }

                a++;
                if (a == list.Count) break;
            }

            foreach (var item in list)
            {
                cost13_.Add(item);
            }

            list.Clear();

Тут мы получается удаляем строки где count:0 потом то что осталось разбиваем по спискам где значения 1-4. 5-8. 9-12. все что осталось после этих действий запихиваем в список где cost 13 и больше. И чистим изначальный список
Спасибо большое, буду у компа, проверю, + 100 к карме! :-)
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Глянул в код, это решение не подойдет :(
Так как country было примером, а так страны там отличаются. Так-же cost может быть не целым числом, 1,5 ; 2,8 и так далее.
Но всё равно спасибо за помощь.
C#:
if (list[a].Contains("cost: 1 country") || list[a].Contains("cost: 2 country") || list[a].Contains("cost: 3 country") || list[a].Contains("cost: 4 country"))
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Всем доброго утра. Ребят, не сочтите за наглость, хотелось бы еще помощи по данной теме. SHILY, BAZAg :ah::ah::ah:

Есть ли возможность по одному клику отсортировать значения по спискам? Пользуясь дефолт кубиками от зенно перебор нужных значений и сортировка происходят значительно долго. Хотел узнать, возможно ли набросать код таким образом, что-бы происходило следующее: к примеру имеем следующую строку из основного списка "zamibia.vitrual32.cost:24,61 zamibia.vitrual32.count: 1000" и множество других. необходимо сперва удалить все строки из списка со значением "count: 0". Затем, основываясь на строках со значением "cost" рассортировать по новым 4-м спискам, в каждом из которых будет лежать свой диапазон значений "cost" - в одном будут лежать строки со значениями от 1 до 4 (cost: 3 / cost: 3,5 / cost: 4), в других трех "от 5 до 8", "от 9 до 12" и "от 13 и выше (всё остальное)". Ниже постараюсь донести наглядно.

Имеем основной список и строки в нем:
  1. country1.operator1.cost: 1 country1.operator1.count: 0
  2. country2.operator2.cost: 2 country2.operator2.count: 0
  3. country3.operator3.cost: 3 country3.operator3.count: 100
  4. country4.operator4.cost: 4 country4.operator4.count: 200
  5. country5.operator5.cost: 5 country5.operator5.count: 300
  6. country6.operator6.cost: 6 country6.operator6.count: 400
  7. country7.operator7.cost: 7 country7.operator7.count: 450
  8. country8.operator8.cost: 8 country8.operator8.count: 500
  9. country9.operator9.cost: 9 country9.operator9.count: 510
  10. country10.operator10.cost: 10 country10.operator10.count: 110
  11. country11.operator11.cost: 11 country11.operator11.count: 50
  12. country12.operator12.cost: 12 country12.operator12.count: 30
  13. country13.operator13.cost: 13 country13.operator13.count: 100
  14. country14.operator14.cost: 14 country14.operator14.count: 1000
  15. country15.operator15.cost: 15 country15.operator15.count: 1000
Отсюда нам нужно удалить первые две строки, где присутствует "count: 0"
Далее, переносим в список cost 1-4, строки 3 и 4.
В список cost 5-8, строки 5, 6, 7 и 8.
В список cost 9-12, строки 9, 10, 11 и 12.
В список cost 13+, строки 13, 14, 15 и все остальные, где значение выше.

Заранее благодарен всем неравнодушным :-)
C#:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
project.Json.FromString(project.Json.GetMember("facebook").ToString());
var items = project.Json.GetAllMembersList();

var objects = new List<string[]>();
// Разбираем json
foreach(var item in items) {
    var list_items = new List<string>(); // 0 страна, 1 оператор, 2 тип 3 значение 4 тип 5 значение
    var item1  = item.Key.ToString().Split('.');
    var item2  = new string[]{item.Value.ToString(), "cost", "0"}; // добавили в конец ещё два поля для данных
    list_items.AddRange(item1);   
    list_items.AddRange(item2);
    objects.Add(list_items.ToArray());
}

// Формируем данные в 1 строку
var all_list = objects.Where(x=>x[2].Contains("count"))
             .Where(x=> decimal.Parse(x[3]) > 0) // Удаляем все, с count == 0
             .Select(x=>{
                    // для каждого count ищем cost
                    var obj = objects.Where(z => x[0] == z[0] && x[1] == z[1] && z[2].Contains("cost")).First().ToArray<string>();
                    string[] newdata = x.ToArray();
                    newdata[5] = (string)obj[3];
                    return newdata.ToArray(); // Формируем в один объект
               }).ToList();

// Фильтрируем данные
var cost_1_4 = all_list.Where(s=> decimal.Parse(s[5]) > 1 && decimal.Parse(s[5]) <= 4);
var cost_5_8 = all_list.Where(s=> decimal.Parse(s[5]) > 4 && decimal.Parse(s[5]) <= 8);
var  cost_9_12 = all_list.Where(s=> decimal.Parse(s[5]) > 8 && decimal.Parse(s[5]) <= 12);
var  cost_13 = all_list.Where(s=> decimal.Parse(s[5]) > 12);

// Добавляем данные в списки Зенно
project.Lists["list1"].AddRange(cost_1_4.Select(x=>string.Join("|",x)));
project.Lists["list2"].AddRange(cost_5_8.Select(x=>string.Join("|",x)));
project.Lists["list3"].AddRange(cost_9_12.Select(x=>string.Join("|",x)));
project.Lists["list4"].AddRange(cost_13.Select(x=>string.Join("|",x)));
93420

93421

93422

93423
 
  • Спасибо
Реакции: SHILY и ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
C#:
var json = ZennoPoster.HttpGet("https://5sim.net/v1/guest/prices?product=fb");
project.Json.FromString(json);
project.Json.FromString(project.Json.GetMember("facebook").ToString());
var items = project.Json.GetAllMembersList();

var objects = new List<string[]>();
// Разбираем json
foreach(var item in items) {
    var list_items = new List<string>(); // 0 страна, 1 оператор, 2 тип 3 значение 4 тип 5 значение
    var item1  = item.Key.ToString().Split('.');
    var item2  = new string[]{item.Value.ToString(), "cost", "0"}; // добавили в конец ещё два поля для данных
    list_items.AddRange(item1);  
    list_items.AddRange(item2);
    objects.Add(list_items.ToArray());
}

// Формируем данные в 1 строку
var all_list = objects.Where(x=>x[2].Contains("count"))
             .Where(x=> decimal.Parse(x[3]) > 0) // Удаляем все, с count == 0
             .Select(x=>{
                    // для каждого count ищем cost
                    var obj = objects.Where(z => x[0] == z[0] && x[1] == z[1] && z[2].Contains("cost")).First().ToArray<string>();
                    string[] newdata = x.ToArray();
                    newdata[5] = (string)obj[3];
                    return newdata.ToArray(); // Формируем в один объект
               }).ToList();

// Фильтрируем данные
var cost_1_4 = all_list.Where(s=> decimal.Parse(s[5]) > 1 && decimal.Parse(s[5]) <= 4);
var cost_5_8 = all_list.Where(s=> decimal.Parse(s[5]) > 4 && decimal.Parse(s[5]) <= 8);
var  cost_9_12 = all_list.Where(s=> decimal.Parse(s[5]) > 8 && decimal.Parse(s[5]) <= 12);
var  cost_13 = all_list.Where(s=> decimal.Parse(s[5]) > 12);

// Добавляем данные в списки Зенно
project.Lists["list1"].AddRange(cost_1_4.Select(x=>string.Join("|",x)));
project.Lists["list2"].AddRange(cost_5_8.Select(x=>string.Join("|",x)));
project.Lists["list3"].AddRange(cost_9_12.Select(x=>string.Join("|",x)));
project.Lists["list4"].AddRange(cost_13.Select(x=>string.Join("|",x)));
Посмотреть вложение 93420
Посмотреть вложение 93421
Посмотреть вложение 93422
Посмотреть вложение 93423
Вы лучший! Не в обиду другим ребятам. Это идеальное решение! Огромная благодарность!:bp:
 
  • Спасибо
Реакции: SHILY и BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
  • Спасибо
Реакции: GreenWay, SHILY и ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
215
Благодарностей
62
Баллы
28
Регистрация
20.02.2019
Сообщения
289
Благодарностей
34
Баллы
28
Господа, а как вместо лога засунуть все в список?

C#:
var json = project.Variables["json_get"];
project.Json.Equals(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
 
Последнее редактирование модератором:

and2517

Client
Регистрация
10.03.2016
Сообщения
28
Благодарностей
7
Баллы
3
Господа, а как вместо лога засунуть все в список?

C#:
var json = project.Variables["json_get"];
project.Json.Equals(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.SendInfoToLog(string.Join(": ", new[]{item.Key, item.Value}));
C#:
var json = project.Variables["json_get"];
project.Json.Equals(json);
var items = project.Json.GetAllMembersList();
foreach(var item in items) project.Lists["Список 1"].Add(string.Join(": ", new[]{item.Key, item.Value}));
 

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