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

  • Автор темы Автор темы braind
  • Дата начала Дата начала

braind

Client
Регистрация
10.10.2012
Сообщения
119
Реакции
12
Баллы
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 нет, то сниппет просто пропускает отсутствующий параметр и в эту ячейку ничего не запишет.
 
слишком жирный запрос?
 
слишком жирный запрос?
Вы не добавили файл json который на вход.
Вы не предоставили примера вывода в таблице в разных случаях (о которых Вы говорите) для разных json.
В итоге - проще пройти мимо, чем догадываться что на входе и что на выходе.
 
Вы не добавили файл 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":"admer2r@mail.ru","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]" и т.д.
 
По первой части вопроса - как разобрать:
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);
}

По выходу данных в таблицу - мне не понятно какие именно данные должны попадать в таблицу и в каком виде, из-за чего предоставил в коде выше пример - по этому примеру добавляйте все необходимые данные, они точно не выдадут ошибку, и если данных нет - просто будет пустая ячейка.
 
Круто, благодарю, это то что нужно! Отдельная благодарность за конвертер, даже не знал что такое существует.
 

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