Нужна помощь с JSON - запись в таблицу

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
Покопался на форуме, но не нашел того, что мне нужно.
Кто владеет C#, помогите со снипеттами

1) получить все названия переменных из JSON в список. Приходится руками сохранять все переменные, а их иногда несколько десятков.
На форуме я нашел вот такой сниппет, но он не работает у меня
C#:
var pp = project.Json.GetMembersList();
foreach (var p in pp)
{
project.Lists["List"].AddRange(project.Json.GetMember(p.ToString()).GetMembersList());
}
выдает ошибку
"string" не содержит определения для "GetMembersList"
2) сниппет для записи в таблицу.
Бывает, что в запросе отсутствует часть параметров. Например, получаем вакансии по API, парсим в JSON, там штук 20 параметров. Это все нужно записать напрямую в таблицу, но в некоторых вакансиях отсутствует часть параметров. Соответственно, при записи таких данных в таблицу кубиком - получим ошибку No such name.
Может ли кто написать сниппет, где можно указать формат строки для записи (как в кубике "добавить строку в в таблицу"), например
{-Json.var[n]-}{-String.Tab-}{-Json.var2[n]-}{-String.Tab-}{-Json.var3[n]-} и т.д,
только если например параметра var2 в JSON нет, то сниппет просто пропускает отсутствующий параметр и в эту ячейку ничего не запишет.
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
слишком жирный запрос?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
слишком жирный запрос?
Вы не добавили файл json который на вход.
Вы не предоставили примера вывода в таблице в разных случаях (о которых Вы говорите) для разных json.
В итоге - проще пройти мимо, чем догадываться что на входе и что на выходе.
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
Вы не добавили файл json который на вход.
Вы не предоставили примера вывода в таблице в разных случаях (о которых Вы говорите) для разных json.
В итоге - проще пройти мимо, чем догадываться что на входе и что на выходе.
Речь не идет о каком-то конкретном json, возьмите любой. Например такой
{"status":"200","request":{"api":"v1"},"meta":{"total":1,"limit":100},"results":{"vacancies":[{"vacancy":{"id":"26efa5b5-73b4-11ec-b224-57fc951f3846","source":"Работодатель","region":{"region_code":"3900000000000","name":"Калининградская область"},"company":{"ogrn":"1023901956209","companycode":"1023901956209","hr-agency":false,"phone":"+7(4012)374360","inn":"3919000490","name":"АДМИНИСТРАЦИЯ \"КРАСНОЗНАМЕНСКОГО МУНИЦИПАЛЬНОГО ОКРУГА\"","kpp":"391901001","email":"[email protected]","url":"https://site.ru/company/1023901956209"},"creation-date":"2022-01-12","salary":"от 18560","salary_min":18560,"salary_max":0,"job-name":"Специалист 1 категории отдела бухгалтерского учета и контроля","vac_url":"https://site.ru/vacancy/card/1023901956209/26efa5b5-73b4-11ec-b224-57fc951f3846","employment":"Полная занятость","schedule":"Полный рабочий день","duty":"описание вакансии","category":{"specialisation":"Государственная служба, некоммерческие организации"},"requirement":{"education":"Среднее профессиональное","qualification":"<p>На время декретного отпуска основного сотрудника.</p>","experience":1},"addresses":{"address":[{"location":"Калининградская область, Краснознаменский район, г. Краснознаменск, Калининградская улица, дом: 56;корпус: ---;офис/квартира: ---;"}]},"term":{"text":"Ежемесячная премия 45 %"},"currency":"«руб.»"}}]}}
И вот второй с похожей структурой, но в нем нет нескольких параметров - kpp, email, term, но есть параметр site.
{"status":"200","request":{"api":"v1"},"meta":{"total":1,"limit":100},"results":{"vacancies":[{"vacancy":{"id":"7efdc8a8-f3c9-11ec-ba26-550ed7335bbe","source":"Работодатель","region":{"region_code":"3900000000000","name":"Калининградская область"},"company":{"ogrn":"1023902213830","site":"http://mo-ladushkin.ru","companycode":"1023902213830","hr-agency":false,"phone":"+7(40156)66383","inn":"3915004609","name":"АДМИНИСТРАЦИЯ МО\"ЛАДУШКИНСКИЙ ГОРОДСКОЙ ОКРУГ\"","url":"https://site.ru/company/1023902213830"},"creation-date":"2022-06-24","salary":"от 18000 до 25000","salary_min":18000,"salary_max":25000,"job-name":"главный специалист по информационным системам в сфере ЖКХ","vac_url":"https://site.ru/vacancy/card/1023902213830/7efdc8a8-f3c9-11ec-ba26-550ed7335bbe","employment":"Полная занятость","schedule":"Полный рабочий день","duty":"описание вакансии","category":{"specialisation":"Административная работа, секретариат, АХО"},"requirement":{"education":"Высшее","experience":0},"addresses":{"address":[{"location":"Калининградская область, г. Ладушкин, Победы улица, дом: 23;","lng":"20.171831","lat":"54.568041"}]},"currency":"«руб.»"}}]}}

И если я буду записывать в таблицу, используя переменные из json, например "results.vacancies[0].vacancy.company.kpp", то я получу ошибку. Приходится на каждую переменную создавать кубик "обработка переменных" и выставлять флаг "необязательное".
Вот хотелось бы делать тоже самое одним кубиком на C#.
А какая будет таблица на выходе - хотелось бы задавать ее в коде при помощи строки, например так
"var[0], var[1], var[5], var[3]" и т.д.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
По первой части вопроса - как разобрать:
1. Идём на https://json2csharp.com/
2. Вставляем json.
3. Нажимаем Convert.
Получили код, который забрасываем в общий код.

Так как в двух разных json могут быть разные поля (но сама структура одинаковая) - то выполняем ту же последовательность действий для другого json.
После чего, первый код дополняем теми полями, которые есть в одном, и нет в другом (короче создаем код, который имеет все нужные нам поля.
Заполняем конструкторы по-умолчанию, чтобы в случае если поля не будет - чтобы оно создалось с пустым значением.
В итоге, в общий код должно попасть что-то вроде этого:
Общий код:
    public class JAddress {
        public JAddress(){
            Location = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("location")]
        public string Location { get; set; }
    }

    public class JAddresses {
        public JAddresses(){
            Address = new List<JAddress>();
        }
        [Global.ZennoLab.Json.JsonProperty("address")]
        public List<JAddress> Address { get; set; }        
    }

    public class JCategory {
        public JCategory(){
            Specialisation = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("specialisation")]
        public string Specialisation { get; set; }
    }

    public class JCompany {
        public JCompany(){
            Ogrn= string.Empty;
            Companycode= string.Empty;
            HrAgency =  string.Empty;;
            Phone= string.Empty;
            Inn= string.Empty;
            Name= string.Empty;
            Kpp= string.Empty;
            Email= string.Empty;
            Url = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("ogrn")]
        public string Ogrn { get; set; }

        [Global.ZennoLab.Json.JsonProperty("companycode")]
        public string Companycode { get; set; }

        [Global.ZennoLab.Json.JsonProperty("hr-agency")]
        public string HrAgency { get; set; }

        [Global.ZennoLab.Json.JsonProperty("phone")]
        public string Phone { get; set; }

        [Global.ZennoLab.Json.JsonProperty("inn")]
        public string Inn { get; set; }

        [Global.ZennoLab.Json.JsonProperty("name")]
        public string Name { get; set; }

        [Global.ZennoLab.Json.JsonProperty("kpp")]
        public string Kpp { get; set; }

        [Global.ZennoLab.Json.JsonProperty("email")]
        public string Email { get; set; }

        [Global.ZennoLab.Json.JsonProperty("url")]
        public string Url { get; set; }
    }

    public class JMeta {
        public JMeta(){
            Total = 0;
            Limit = 0;
        }
        [Global.ZennoLab.Json.JsonProperty("total")]
        public int Total { get; set; }

        [Global.ZennoLab.Json.JsonProperty("limit")]
        public int Limit { get; set; }
    }

    public class JRegion {
        public JRegion(){
            RegionCode = string.Empty;
            Name = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("region_code")]
        public string RegionCode { get; set; }

        [Global.ZennoLab.Json.JsonProperty("name")]
        public string Name { get; set; }
    }

    public class JRequest {
        public JRequest(){
            Api = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("api")]
        public string Api { get; set; }
    }

    public class JRequirement {
        public JRequirement (){
            Education = string.Empty;
            Qualification = string.Empty;
            Experience = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("education")]
        public string Education { get; set; }

        [Global.ZennoLab.Json.JsonProperty("qualification")]
        public string Qualification { get; set; }

        [Global.ZennoLab.Json.JsonProperty("experience")]
        public string Experience { get; set; }
    }

    public class JResults {
        public JResults(){
            Vacancies = new List<JVacancy>();
        }
        [Global.ZennoLab.Json.JsonProperty("vacancies")]
        public List<JVacancy> Vacancies { get; set; }
    }

    public class JRoot {
        public JRoot(){
            Status = string.Empty;
            Request = new JRequest();
            Meta = new JMeta();
            Results = new JResults();
        }
        [Global.ZennoLab.Json.JsonProperty("status")]
        public string Status { get; set; }

        [Global.ZennoLab.Json.JsonProperty("request")]
        public JRequest Request { get; set; }

        [Global.ZennoLab.Json.JsonProperty("meta")]
        public JMeta Meta { get; set; }

        [Global.ZennoLab.Json.JsonProperty("results")]
        public JResults Results { get; set; }
    }

    public class JTerm {
        public JTerm(){
            Text = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("text")]
        public string Text { get; set; }
    }

    public class JVacancy {
        public JVacancy(){
            Vac = new JVac();
        }
        [Global.ZennoLab.Json.JsonProperty("vacancy")]
        public JVac Vac { get; set; }
    }

    public class JVac {
        public JVac(){
            Id= string.Empty;
            Source= string.Empty;
            Region = new JRegion();
            Company = new JCompany();
            CreationDate= string.Empty;
            Salary = string.Empty;
            SalaryMin = string.Empty;
            SalaryMax = string.Empty;
            JobName= string.Empty;
            VacUrl= string.Empty;
            Employment = string.Empty;
            Schedule = string.Empty;
            Duty = string.Empty;
            Category = new JCategory(); 
            Requirement = new JRequirement();
            Addresses = new JAddresses();
            Term = new JTerm();
            Currency = string.Empty;
        }
        [Global.ZennoLab.Json.JsonProperty("id")]
        public string Id { get; set; }

        [Global.ZennoLab.Json.JsonProperty("source")]
        public string Source { get; set; }

        [Global.ZennoLab.Json.JsonProperty("region")]
        public JRegion Region { get; set; }

        [Global.ZennoLab.Json.JsonProperty("company")]
        public JCompany Company { get; set; }

        [Global.ZennoLab.Json.JsonProperty("creation-date")]
        public string CreationDate { get; set; }

        [Global.ZennoLab.Json.JsonProperty("salary")]
        public string Salary { get; set; }

        [Global.ZennoLab.Json.JsonProperty("salary_min")]
        public string SalaryMin { get; set; }

        [Global.ZennoLab.Json.JsonProperty("salary_max")]
        public string SalaryMax { get; set; }

        [Global.ZennoLab.Json.JsonProperty("job-name")]
        public string JobName { get; set; }

        [Global.ZennoLab.Json.JsonProperty("vac_url")]
        public string VacUrl { get; set; }

        [Global.ZennoLab.Json.JsonProperty("employment")]
        public string Employment { get; set; }

        [Global.ZennoLab.Json.JsonProperty("schedule")]
        public string Schedule { get; set; }

        [Global.ZennoLab.Json.JsonProperty("duty")]
        public string Duty { get; set; }

        [Global.ZennoLab.Json.JsonProperty("category")]
        public JCategory Category { get; set; }

        [Global.ZennoLab.Json.JsonProperty("requirement")]
        public JRequirement Requirement { get; set; }

        [Global.ZennoLab.Json.JsonProperty("addresses")]
        public JAddresses Addresses { get; set; }

        [Global.ZennoLab.Json.JsonProperty("term")]
        public JTerm Term { get; set; }

        [Global.ZennoLab.Json.JsonProperty("currency")]
        public string Currency { get; set; }
    }
Дальше уже в кубике используем данные примерно так:
Получаем доступ к данным с кубика:
string json = project.Variables["json"].Value;
JRoot ob = Global.ZennoLab.Json.JsonConvert.DeserializeObject<JRoot>(json);
 

foreach(JVacancy vacancy in  ob.Results.Vacancies){
    var vac =  vacancy.Vac;
    string[] row = new string[]{
        vac.Employment,
        vac.VacUrl,
        vac.Company.Email
        // здесь добавляем все нужные поля...
    };
    
    project.Tables["tb"].AddRow(row);
}
По выходу данных в таблицу - мне не понятно какие именно данные должны попадать в таблицу и в каком виде, из-за чего предоставил в коде выше пример - по этому примеру добавляйте все необходимые данные, они точно не выдадут ошибку, и если данных нет - просто будет пустая ячейка.
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
Круто, благодарю, это то что нужно! Отдельная благодарность за конвертер, даже не знал что такое существует.
 

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