JSON по переменным (все)

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Привет всем.
Сейчас виду разработку достаточно крупного проекта и встал вопрос:
У меня есть JSON который я собираю на стороне своего сервера (это настройки пользователей которые передаются по API в формате JSON)
Если C# код который разбирает весь JSON по переменным (если нет переменной он ее создает):
Вот к примеру
{
"parsing_type": "individual references"
}

parsing_type (переменная) individual references то что должно попасть в переменную, но может быть так что шаблон запускается с новыми параметрами "старая версия", шаблон будет выбивать ошибку просто потому что не сможет работать с JSON, а при обновление шаблон JSON будут прибавляться параметры, поэтому хотелось бы в автономном режиме разбирать JSON по переменным
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 773
Благодарностей
1 443
Баллы
113

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Есть решение???
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43

radv

Client
Регистрация
11.05.2015
Сообщения
3 786
Благодарностей
1 951
Баллы
113

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Не, название переменных не всегда известно, а если известно то их более 30, для каждой переменной нужен перенос с JSON в обычную переменную, если бы можно было название взять из названия параметра JSON а саму запись из параметра было бы идеально
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 773
Благодарностей
1 443
Баллы
113










C#:
string json = @"{
                  'firstName': 'John',
                  'lastName': 'Doe',
                  'age': 25,
                  'address': {
                      'street': 'Main street',
                      'city': 'New York',
                      'state': 'NY'
                  },
                  'phoneNumbers': [
                      '212-555-1234',
                      '646-555-4567'
                  ]
               }";

JObject jsonObject = JObject.Parse(json);
List<string> variableNames = jsonObject.Descendants()
                                       .OfType<JProperty>()
                                       .Select(p => p.Name)
                                       .Distinct()
                                       .ToList();

foreach (string variableName in variableNames)
{
    project.SendInfoToLog($"{variableName}");
}
 
  • Спасибо
Реакции: lzlmrf, _HEDELKA_ и Alexmd

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43










C#:
string json = @"{
                  'firstName': 'John',
                  'lastName': 'Doe',
                  'age': 25,
                  'address': {
                      'street': 'Main street',
                      'city': 'New York',
                      'state': 'NY'
                  },
                  'phoneNumbers': [
                      '212-555-1234',
                      '646-555-4567'
                  ]
               }";

JObject jsonObject = JObject.Parse(json);
List<string> variableNames = jsonObject.Descendants()
                                       .OfType<JProperty>()
                                       .Select(p => p.Name)
                                       .Distinct()
                                       .ToList();

foreach (string variableName in variableNames)
{
    project.SendInfoToLog($"{variableName}");
}
А как это автоматизировать?
Ну допустим я по API смогу скачать библиотеку пользователю шаблона, но как найти где папка C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.3.0\Progs\ExternalAssemblies
У всех она по разному
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 773
Благодарностей
1 443
Баллы
113
Вот код который сам создаст переменные и присвоит им значение







Не забываем подключить библиотеку Newtonsoft.Json
C#:
string json = @"{
            ""PersonName"": ""Вася"",
            ""PersonSurname"": ""Жигалов"",
            ""PersonAge"": ""22"",
            ""PersonСountry"": ""USA"",
            ""PersonCity"": ""Chicago"",
            ""PersonPhoneNumber"": ""1234567890""}";
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
        foreach (var property in jsonObject)
        {
            object obj = project.Variables;
            obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj,new Object[]{property.Name});
            project.Variables[property.Name].Value = property.Value.ToString();
            project.SendInfoToLog($"{property.Name}: {property.Value}");
        }
 
  • Спасибо
Реакции: alcampo и _HEDELKA_

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Вот код который сам создаст переменные и присвоит им значение







Не забываем подключить библиотеку Newtonsoft
C#:
string json = @"{
            ""PersonName"": ""Вася"",
            ""PersonSurname"": ""Жигалов"",
            ""PersonAge"": ""22"",
            ""PersonСountry"": ""USA"",
            ""PersonCity"": ""Chicago"",
            ""PersonPhoneNumber"": ""1234567890""}";
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
        foreach (var property in jsonObject)
        {
            object obj = project.Variables;
            obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj,new Object[]{property.Name});
            project.Variables[property.Name].Value = property.Value.ToString();
            project.SendInfoToLog($"{property.Name}: {property.Value}");
        }
Кайф осталось только разобраться как передать пользователю библиотеку Newtonsoft если ее просто закинуть в папку ExternalAssemblies она же сама погрузится к шаблону?
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Кайф осталось только разобраться как передать пользователю библиотеку Newtonsoft если ее просто закинуть в папку ExternalAssemblies она же сама погрузится к шаблону?
Ну то есть допустим я найду способ как найти эту папку у пользователя, если по средствам GET запрос на мой сайт как файл я скачаю dll в эту папку C# код заработает или дополнительные действия нужны?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 773
Благодарностей
1 443
Баллы
113
Ну то есть допустим я найду способ как найти эту папку у пользователя, если по средствам GET запрос на мой сайт как файл я скачаю dll в эту папку C# код заработает или дополнительные действия нужны?
Не проверишь - не узнаешь! Нужно тестировать..
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Вот код который сам создаст переменные и присвоит им значение







Не забываем подключить библиотеку Newtonsoft.Json
C#:
string json = @"{
            ""PersonName"": ""Вася"",
            ""PersonSurname"": ""Жигалов"",
            ""PersonAge"": ""22"",
            ""PersonСountry"": ""USA"",
            ""PersonCity"": ""Chicago"",
            ""PersonPhoneNumber"": ""1234567890""}";
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
        foreach (var property in jsonObject)
        {
            object obj = project.Variables;
            obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj,new Object[]{property.Name});
            project.Variables[property.Name].Value = property.Value.ToString();
            project.SendInfoToLog($"{property.Name}: {property.Value}");
        }
Код работает идеально!
Кому JSON из перменной надо брать:
C#:
string json = project.Variables["settings"].Value.ToString();
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
foreach (var property in jsonObject)
{
    object obj = project.Variables;
    obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj, new Object[] { property.Name });
    project.Variables[property.Name].Value = property.Value.ToString();
    project.SendInfoToLog($"{property.Name}: {property.Value}");
}
 
  • Спасибо
Реакции: Андрейка2020

radv

Client
Регистрация
11.05.2015
Сообщения
3 786
Благодарностей
1 951
Баллы
113

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Она уже есть в папке зенки ))
Не думаю, я пока что не скачал dll файл и не закинул в ExternalAssemblies ничего не работало а в лог писало типа вы забыли установить библиотеку
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 786
Благодарностей
1 951
Баллы
113
Не думаю, я пока что не скачал dll файл и не закинул в ExternalAssemblies ничего не работало а в лог писало типа вы забыли установить библиотеку
так через ссылки из GAC можно добавить ее из папки зенки и прописать юзинги )
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
так через ссылки из GAC можно добавить ее из папки зенки и прописать юзинги )
А подробнее можно как это сделать так как сейчас разное пробую, не получаются
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 773
Благодарностей
1 443
Баллы
113
А подробнее можно как это сделать так как сейчас разное пробую, не получаются
Добавляем так же, как и все библиотеки которые в папке ExternalAssemblies, только теперь эта библиотека находится по умолчанию для зенки в папке Progs, using постоянно трогать не нужно, достаточно 1 раз прописали в директивах using и общий код, using Newtonsoft.Json; и все. Единственный подвох в версии зенки, к примеру вы укажите путь C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.4.0\Progs\Newtonsoft.Json.dll а у клиента зенка 7.7.3.0 из за того что разные пути к Newtonsoft.Json.dll , у клиента не будет работать.
 
  • Спасибо
Реакции: radv

radv

Client
Регистрация
11.05.2015
Сообщения
3 786
Благодарностей
1 951
Баллы
113
А подробнее можно как это сделать так как сейчас разное пробую, не получаются
выше ответили. Если проект закрытый, можно встраивать библиотеки в проект. Единственное, что упакованный проект не сможете открыть в проджект мейкере.
 
  • Спасибо
Реакции: samsonnn

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
выше ответили. Если проект закрытый, можно встраивать библиотеки в проект. Единственное, что упакованный проект не сможете открыть в проджект мейкере.
Да я разобрался, там ошибку выдавало по другим причинам
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Добавляем так же, как и все библиотеки которые в папке ExternalAssemblies, только теперь эта библиотека находится по умолчанию для зенки в папке Progs, using постоянно трогать не нужно, достаточно 1 раз прописали в директивах using и общий код, using Newtonsoft.Json; и все. Единственный подвох в версии зенки, к примеру вы укажите путь C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.4.0\Progs\Newtonsoft.Json.dll а у клиента зенка 7.7.3.0 из за того что разные пути к Newtonsoft.Json.dll , у клиента не будет работать.
Проверили работает, у меня самая свежая версия у клиента 7 1 0 0 он все равно запустил, когда закидываешь библиотеку ExternalAssemblies все работает, просто была ошибка в JSON и пока я не открыл шаблон и мы посмотрели что за ошибка я думал "шаблон не может подгрузить библиотеку"
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 233
Благодарностей
573
Баллы
113
using Global.ZennoLab.Json;
 
  • Спасибо
Реакции: samsonnn

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 233
Благодарностей
573
Баллы
113
А вообще, можно сделать DTO, хранить в контексте, как вариант, чтобы постоянно не клепать эти переменные и не захламлять ими проект
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
А вообще, можно сделать DTO, хранить в контексте, как вариант, чтобы постоянно не клепать эти переменные и не захламлять ими проект
Пока что это лучший вариант (раскладывать по племенным) так как
Шаблон постоянно парсит актуальные настройки активно применяет их в проекте, та и собирать проект удобно привычным способом переменными
Так как это не бот какой нибудь а секрет :D ну там не важна скорость выполнения
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Приветствую.
Я бы пошел таким путем:
Взял либу Newtonsoft.Json
C#:
string json = "{\"parsing_type\": \"individual references\"}"; // ваша регулярка
var jsonObject = JsonConvert.DeserializeObject<dynamic>(json);
string parsingType = jsonObject.parsing_type;
Те создал бы строку с Json объектом, затем десерилизовал этот объект в динамический объект c# с помощью метода: JsonConvert.DeserializeObject. После этого обращаемся к полям объекта c# по их именам, как до этого делали в поле "parsing_type".
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 233
Благодарностей
573
Баллы
113
Приветствую.
Я бы пошел таким путем:
Взял либу Newtonsoft.Json
C#:
string json = "{\"parsing_type\": \"individual references\"}"; // ваша регулярка
var jsonObject = JsonConvert.DeserializeObject<dynamic>(json);
string parsingType = jsonObject.parsing_type;
Те создал бы строку с Json объектом, затем десерилизовал этот объект в динамический объект c# с помощью метода: JsonConvert.DeserializeObject. После этого обращаемся к полям объекта c# по их именам, как до этого делали в поле "parsing_type".
Только надо не забывать приводить гарантированно к строковому формату, т.к. при такой десириализации число может привестись к int, а все переменные в зенке - строка.
 
  • Спасибо
Реакции: artsmm

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Вот код который сам создаст переменные и присвоит им значение







Не забываем подключить библиотеку Newtonsoft.Json
C#:
string json = @"{
            ""PersonName"": ""Вася"",
            ""PersonSurname"": ""Жигалов"",
            ""PersonAge"": ""22"",
            ""PersonСountry"": ""USA"",
            ""PersonCity"": ""Chicago"",
            ""PersonPhoneNumber"": ""1234567890""}";
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
        foreach (var property in jsonObject)
        {
            object obj = project.Variables;
            obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj,new Object[]{property.Name});
            project.Variables[property.Name].Value = property.Value.ToString();
            project.SendInfoToLog($"{property.Name}: {property.Value}");
        }
А подскажите пожалуйста:
Если JSON такой:
{
""PersonName"": ""Вася"",
""PersonSurname"": ""Жигалов"",
""PersonAge"": ""22"",
""PersonСountry"": ""USA"",
""PersonCity"": ""Chicago"",
""PersonPhoneNumber"": ""1234567890""}
То записывается все нормально, но если JSON многоструктурный:
{'update_id':685644298,
'message':{'message_id':2 ,'from':{'id':5634442616,'is_bot':false,'first_name':'\u0418\u041f botshop','username':'bottopff','language_code':'ru'},'chat':{'id':5634442616,'first_name':'\u0418\u041f botshop','username':'bottopff','type':'private'},'date':1683447905,'text':'/start','entities':[{'offset':0,'length':6,'type':'bot_command'}]}}
То он раскладывает криво:
106620

Есть код который записывает название переменной именно название значение
Не message а переменная message_id=2

так же может быть несколько file_id file_id они в json пишутся
106621

Так и должно попасть значение file_id1 file_id2 file_id3
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
А подскажите пожалуйста:
Если JSON такой:
{
""PersonName"": ""Вася"",
""PersonSurname"": ""Жигалов"",
""PersonAge"": ""22"",
""PersonСountry"": ""USA"",
""PersonCity"": ""Chicago"",
""PersonPhoneNumber"": ""1234567890""}
То записывается все нормально, но если JSON многоструктурный:
{'update_id':685644298,
'message':{'message_id':2 ,'from':{'id':5634442616,'is_bot':false,'first_name':'\u0418\u041f botshop','username':'bottopff','language_code':'ru'},'chat':{'id':5634442616,'first_name':'\u0418\u041f botshop','username':'bottopff','type':'private'},'date':1683447905,'text':'/start','entities':[{'offset':0,'length':6,'type':'bot_command'}]}}
То он раскладывает криво:
Посмотреть вложение 106620
Есть код который записывает название переменной именно название значение
Не message а переменная message_id=2

так же может быть несколько file_id file_id они в json пишутся
Посмотреть вложение 106621
Так и должно попасть значение file_id1 file_id2 file_id3
Есть ли решение?
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 233
Благодарностей
573
Баллы
113
Есть ли решение?
Может оно и есть, но вряд ли будет лёгкое.. Думаю, стоит либо курить доку по Newtonsoft.Json, либо в раздел платных решений обратиться. И я дважды перечитал то, что ты писал и не понял всё равно.. В чём проблема. Всегда лучше руководствоваться некоторыми правилами:
1. Какие входные данные
2. Какой ожидаемый результат
3. Какой реальный результат
4. Что пробовал делать

Тогда будет проще намного)
 
  • Спасибо
Реакции: samsonnn и djaga

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