Заполнить переменные из JSON в цикле

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
Я создал переменные в проекте:
C#:
project.Variables["UF_FULL_ADDRESS"].Value
project.Variables["PERSONAL_STATE"].Value
project.Variables["UF_DISTIRICT"].Value
project.Variables["PERSONAL_CITY"].Value
Потом создал их справочник:
C#:
string[] vars = {
    "UF_FULL_ADDRESS",
    "PERSONAL_STATE",
    "UF_DISTIRICT",
    "PERSONAL_CITY"
};
Этот код можно просто скопировать в C# сниппет, чтобы увидеть ошибку
C#:
string[] vars = {
    "UF_FULL_ADDRESS",
    "PERSONAL_STATE",
    "UF_DISTIRICT",
    "PERSONAL_CITY"
};
project.SendInfoToLog("Всего в справочнике: " + vars.Count().ToString() + "элементов");

try {
  
    for(int i = 0; i < vars.Count(); i++) {
        project.SendInfoToLog(vars[i].ToString());
      
        if(!String.IsNullOrEmpty(project.Json.result.vars[i])) { // Тут походу ошибка
            project.Variables[vars[i]].Value = project.Json.result.vars[i].ToString();
        } else {
            project.Variables[vars[i]].Value = "";
        }
    }
  
} catch(Exception e) {
    project.SendInfoToLog("ERROR: " + e.Message);
}

//    Это работает
for(int i = 0; i < vars.Count(); i++) {
    project.Variables[vars[i]].Value = i.ToString();
}
Выдает ошибку:
"ZennoLab.JXParser.JsonDynamic" не содержит определения для "vars"
Что делать? Очень не хочется 100 раз повторять конструкцию if(!String.IsNullOrEmpty(project.Json.result.[ТУТ НАЗВАНИЕ]) {} else {} - во первых я рано или поздно допущу ошибку названия поля, и это будет очень большой сниппет.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Я создал переменные в проекте:
C#:
project.Variables["UF_FULL_ADDRESS"].Value
project.Variables["PERSONAL_STATE"].Value
project.Variables["UF_DISTIRICT"].Value
project.Variables["PERSONAL_CITY"].Value
Потом создал их справочник:
C#:
string[] vars = {
    "UF_FULL_ADDRESS",
    "PERSONAL_STATE",
    "UF_DISTIRICT",
    "PERSONAL_CITY"
};
Этот код можно просто скопировать в C# сниппет, чтобы увидеть ошибку
C#:
string[] vars = {
    "UF_FULL_ADDRESS",
    "PERSONAL_STATE",
    "UF_DISTIRICT",
    "PERSONAL_CITY"
};
project.SendInfoToLog("Всего в справочнике: " + vars.Count().ToString() + "элементов");

try {
 
    for(int i = 0; i < vars.Count(); i++) {
        project.SendInfoToLog(vars[i].ToString());
     
        if(!String.IsNullOrEmpty(project.Json.result.vars[i])) { // Тут походу ошибка
            project.Variables[vars[i]].Value = project.Json.result.vars[i].ToString();
        } else {
            project.Variables[vars[i]].Value = "";
        }
    }
 
} catch(Exception e) {
    project.SendInfoToLog("ERROR: " + e.Message);
}

//    Это работает
for(int i = 0; i < vars.Count(); i++) {
    project.Variables[vars[i]].Value = i.ToString();
}
Выдает ошибку:


Что делать? Очень не хочется 100 раз повторять конструкцию if(!String.IsNullOrEmpty(project.Json.result.[ТУТ НАЗВАНИЕ]) {} else {} - во первых я рано или поздно допущу ошибку названия поля, и это будет очень большой сниппет.
Предоставьте json например в текстовом файле который пытаетесь так обработать пожалуйста - иначе - никак помочь не получится.
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
Предоставьте json например в текстовом файле который пытаетесь так обработать пожалуйста - иначе - никак помочь не получится.
Мне удалось десерилизовать JSON в объект.

Любопытно, но изначально string не принимает nullable-контекст, т.е. если в свойстве класса я указываю знак вопроса:
C#:
string? nameProp {get; set;}
При этом тип int принимает ... В чем дело хрен его знает.

Но в итоге я так и не смог заполнить переменные проекта, это те которые странно объявляются => project.Variables['name'].Value

Так выглядит объект по которому я Десеризовал:
    public class DataIn
    {
        public string ID { get; set; }
        public string token { get; set; }
        public string handler { get; set; }
        public string action { get; set; }
    }

    public class Result
    {
        public string ID { get; set; }
        public string LOGIN { get; set; }
        public string ACTIVE { get; set; }
        public object UF_REFERER_ID { get; set; }
        public List<object> UF_REFFERER_ID_LIST { get; set; }
        public string UF_PROJECT { get; set; }
        public object UF_SUBPROJECT { get; set; }
        public object UF_ID_REF_LINK { get; set; }
        public object UF_DATE_ACTIVATION { get; set; }
        public string UF_IS_INFO_UNDERSTOOD { get; set; }
        public string UF_IS_INFO_UNDERSTOOD_2 { get; set; }
        public string NAME { get; set; }
        public string LAST_NAME { get; set; }
        public string SECOND_NAME { get; set; }
        public object PERSONAL_BIRTHDAY { get; set; }
        public string UF_FULL_ADDRESS { get; set; }
        public string PERSONAL_STATE { get; set; }
        public string UF_DISTIRICT { get; set; }
        public string PERSONAL_CITY { get; set; }
        public string PERSONAL_STREET { get; set; }
        public string UF_BUILDING { get; set; }
        public string UF_FLAT { get; set; }
        public string UF_HOUSE_OBJ_ID { get; set; }
    }

    public class Account
    {
        public string status { get; set; }

        //[JsonProperty("data-in")]
        //public DataIn DataIn { get; set; }

        //[JsonProperty("data-out")]
        //public List<object> DataOut { get; set; }
        //public List<object> errors { get; set; }
        public Result result { get; set; }
    }
[JsonProperty("data-out")] - вот такое, пришлось закомментировать, я так и не понял, что это, и в гугл тоже запрос подобрать не смог.
Без этих [JsonProperty("data-out")] - десерилизация работает.

Десерелизовал, так:
C#:
Account a = JsonConvert.DeserializeObject<Account>(tmp);
Как видно из классов нужные данные лежат a.result.[НАЗВАНИЕ свойства]

Но как перебрать объект в массиве, таким образом, не получилось:
C#:
string[] vars = {
    "UF_FULL_ADDRESS"
};

for(int i=0; i > vars.Count(); i++) {
   
    if(!string.IsNullOrEmpty(a.result.vars[i])) {
        project.Variables[vars[i]].Value = a.result.vars[i].ToString();
        project.SendInfoToLog("1234567890");
    } else {
        //project.SendInfoToLog(a.result.UF_FULL_ADDRESS);
    }
   
}
В данном случае (вышеописанном) я шел от массива, но можно же как-то перебрать объект. Как объект перебрать я не знаю.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Вы наверно думаете, что вопрос настолько сложный, что никто не может Вам помочь его решить...
Но, проблема не в этом - а в том, что Вы не предоставили входящие данные - и людям просто куда проще пройти мимо, чем строить предположения о том, какой именно вид имеет json с которым Вы собрались работать.
Что ж, раз входящий json настолько секретный, что его нельзя показывать - тогда Вам видимо придется ждать, пока найдется тот, кто предугадает какую именно он имеет структуру.
 
  • Спасибо
Реакции: bigloafer и djaga

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
Что ж, раз входящий json настолько секретный
Нет ни какого секрета (это json с моего сайта), просто я уже его десериализовал JSON в объект. Но раз есть возможность посмотреть Вашу реализацию, я только рад. Я пользовался сайтом json2csharp.com. Но потом выдавало ошибки, и я что-то из модели не нудное удалил, что-то закомментировал.


JSON:
{"status":"Y","data-in":{"ID":"31750","token":"JI9i8l3\/rt6Sd5UI.6ucertdIBgHFDgaWmKncRPF5zi","handler":"user","action":"get_user"},"data-out":[],"errors":[],"result":{"ID":"31750","LOGIN":"+79025558892","ACTIVE":"Y","UF_REFERER_ID":null,"UF_REFFERER_ID_LIST":[],"UF_PROJECT":"10","UF_SUBPROJECT":null,"UF_ID_REF_LINK":null,"UF_DATE_ACTIVATION":null,"UF_IS_INFO_UNDERSTOOD":"0","UF_IS_INFO_UNDERSTOOD_2":"0","NAME":"Юлия","LAST_NAME":"Мелковатая","SECOND_NAME":"","PERSONAL_BIRTHDAY":null,"UF_FULL_ADDRESS":null,"PERSONAL_STATE":"","UF_DISTIRICT":null,"PERSONAL_CITY":"","PERSONAL_STREET":"","UF_BUILDING":null,"UF_FLAT":null,"UF_HOUSE_OBJ_ID":null,"UF_LAST_ADDR_OBJ_ID":null,"UF_STATUS_ELECTOR":"0","UF_VOTER":"0","UF_UIK_SOURCE":null,"UF_UIK":null,"UF_DATE_VOTE":null,"UF_DATE_VOTER":null}}
Как видно из JSON у меня часто в полях бывает null, но тип поля string, но я не могу написать так:
C#:
public string? UF_FULL_ADDRESS { get; set; }
Это вызывает ошибку.

Я не хочу поля по одному обработывать на null, вот так:
C#:
if(string.IsNullOrEmpty(a.result.UF_FULL_ADDRESS)) {
    project.SendInfoToLog("  Empty ");
}
Я хотел сделать в цикле, чтобы все поля сразу проверили, где null там присвоить пустоту.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
JSON:
{"status":"Y","data-in":{"ID":"31750","token":"JI9i8l3\/rt6Sd5UI.6ucertdIBgHFDgaWmKncRPF5zi","handler":"user","action":"get_user"},"data-out":[],"errors":[],"result":{"ID":"31750","LOGIN":"+79025558892","ACTIVE":"Y","UF_REFERER_ID":null,"UF_REFFERER_ID_LIST":[],"UF_PROJECT":"10","UF_SUBPROJECT":null,"UF_ID_REF_LINK":null,"UF_DATE_ACTIVATION":null,"UF_IS_INFO_UNDERSTOOD":"0","UF_IS_INFO_UNDERSTOOD_2":"0","NAME":"Юлия","LAST_NAME":"Мелковатая","SECOND_NAME":"","PERSONAL_BIRTHDAY":null,"UF_FULL_ADDRESS":null,"PERSONAL_STATE":"","UF_DISTIRICT":null,"PERSONAL_CITY":"","PERSONAL_STREET":"","UF_BUILDING":null,"UF_FLAT":null,"UF_HOUSE_OBJ_ID":null,"UF_LAST_ADDR_OBJ_ID":null,"UF_STATUS_ELECTOR":"0","UF_VOTER":"0","UF_UIK_SOURCE":null,"UF_UIK":null,"UF_DATE_VOTE":null,"UF_DATE_VOTER":null}}

Общий код:
     public class Account {
        
        public string status { get; set; }       
        public dynamic result { get; set; }
        public Dictionary<string, string> dic;
        public Account(){
            dic = new Dictionary<string, string>();
        }
        
        public static Account Create (string json){
             return Global.ZennoLab.Json.JsonConvert.DeserializeObject<Account>(json);
        }
        public void Read(string[] keys){
            foreach(string s in keys) {               
                if(!string.IsNullOrEmpty(result.SelectToken(s).ToString())) this.dic.Add(s, result.SelectToken(s).ToString());               
                else dic.Add(s, string.Empty);
            }
        }
        public void Set(IZennoPosterProjectModel project, string[] keys){
             foreach(string s in keys) project.Variables[s].Value = dic[s];
        }
    }
Вызов с кубика:
string json = project.Variables["json"].Value;
string[] vars = {
    "UF_FULL_ADDRESS",
    "PERSONAL_STATE",
    "UF_DISTIRICT",
    "PERSONAL_CITY",
    "LAST_NAME",
    "NAME"
};

var account = Account.Create(json);
account.Read(vars);
account.Set(project, vars);
92519
 
  • Спасибо
Реакции: djaga и bigloafer

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