cJSON: Формат полей для вложенных структур
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Основной тред
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Основной тред
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
У меня на тесте и реальных данных теперь проблемы нет.  
			
			
									
						За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5567
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
cJSON: Формат полей для вложенных структур
Игорь, а какую задачу решаете, если не секрет? Вдруг тоже надо. 
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
А задача моя слишком известная, что бы её вслух называть ! (С) Иван Васильевич
Я же спрашивал про подключение к ЭДО Контур.Диадок. Никто не делал, вот и сижу сам пилю потихоньку.
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
Если позволите, вопрос из регионов по реальной работе с вложенными списками.
Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:
Но при выгрузке той же самой структуры начинается странная многоходовочка:
1. Мы должны в объявить в строго заданном месте группы переменную qInstanse после &списка;
(найди её потом через 20 экранов в отдельном INC файле)
2. При формировании каждого списка присвоить этой переменной значение Instance(qPhones,Thread());
(за несколько экранов кода до выгрузки)
3. И ещё при выгрузке не забыть отдельно пнуть что: [{"name":"Phones","isQueue":true}].
Но ведь если сделать симметричный метод - то всё логично и красиво можно выгрузить в одном месте:
Всё, что нужно есть: передача адреса списка в "instance" подразумевает, что поле Phones это указатель на список.
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ...
			
			
									
						Для загрузки структуры с вложенными списками существует логичный и красивый метод.
Всё в одном месте, видно и понятно даже для тех, кто из Ростова:
Код: Выделить всё
  Parser.ToGroup(TestString, gPerson,,'[{{"name":"Phones", "instance":'& Instance(qPhones,Thread()) &'}]')
1. Мы должны в объявить в строго заданном месте группы переменную qInstanse после &списка;
(найди её потом через 20 экранов в отдельном INC файле)
2. При формировании каждого списка присвоить этой переменной значение Instance(qPhones,Thread());
(за несколько экранов кода до выгрузки)
3. И ещё при выгрузке не забыть отдельно пнуть что: [{"name":"Phones","isQueue":true}].
Но ведь если сделать симметричный метод - то всё логично и красиво можно выгрузить в одном месте:
Код: Выделить всё
  Params &= json::CreateObject(gPerson,,'[{{"name":"Phones", "instance":'& Instance(qPhones,Thread()) &'}]'')
Прошу посмотреть на ситуацию в контексте работы с большим объёмом данных. Спасибо ...
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
cJSON: Формат полей для вложенных структур
IsQueue и отдельное поле для Instance - это всё для случая очередей в очередях. Скажем, список людей, и для каждого свой список телефонов. Тут одним Instance на всех не обойдёшься, приходится вводить поле Instance для каждой внутренней очереди.
			
			
									
						С уважением, ДП
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
1. Очередь в очереди - это очень непрактичная структура в БД.Дед Пахом писал(а): 23 Ноябрь 2022, 11:28 приходится вводить поле Instance для каждой внутренней очереди
Обычно всё-таки общий список телефонов с привязкой по ID к записи владельца.
Я универсальный метод для такой загрузки (!) уже реализовал сам, поэтому молчу на эту тему ...
С выгрузкой пока не сталкивался - но идея там будет таже самая ...
2. Возможность задавать для выгрузки параметр "Instance" не требует отмены (совместим) с IsQueue.
Просто при разборе параметров наличие значения в "Instance" устанавливает флаг IsQueue и
вместо следующего поля берёт адрес очереди из списка парметров по имени поля (что проще) ...
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
cJSON: Формат полей для вложенных структур
Действительно, опция "Instance" работает только в ToGroup, это я упустил, добавлю в CreateObject сегодня попозже.
			
			
									
						С уважением, ДП
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
cJSON: Формат полей для вложенных структур
Добавил, проверяйте.
			
							Код: Выделить всё
  jPerson &= json::CreateObject(PersonGrp,, '[{{"name":"Phones", "instance":'& Phones::Inst &'},{{"name":"Addresses", "instance":'& Addr::Inst &'}]')
  IF NOT jPerson &= NULL
    printd(jPerson.ToString(TRUE))
    jPerson.Delete()
  END
- Вложения
 - 
			
		
		
				
- cjson.clw
 - (76.79 КБ) 120 скачиваний
 
 
С уважением, ДП
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
Проверил с пристрастием - на моих данных всё работает отлично !  
 
Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке JSON структуры ?
Поясню. При составлении запроса на передачу данных - нужно для каждого файла (Queue) передавать много
мелких параметров, которые оформляются как отделные микро-списки. Например:
Решение понятно. Для каждой записи списка документов добавляется несколько вложенных списков.
Они привязываются к указателям + Instance и заполняются данными. Список документов выгружается,
потом для каждой записи зачищаются все вложенные очереди. Катастрофически громозкий объём кода !
Здесь бы хорошо работал механизм как у Вас сделаны параметры Options в методах json::CreateObject() и т.д.
Т.е. обявлять такие микро-списки просто как строки и записывать в них уже готовую JSON строку.
Но тогда нужно, что бы у такого поля был особый режим выгрузки "IsStrRaw" - иначе она берётся в кавычки и экранируется.
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо !
			
			
									
						Если позволите вопрос. Существут ли механизм для вставки готовых фрагментов при выгрузке JSON структуры ?
Поясню. При составлении запроса на передачу данных - нужно для каждого файла (Queue) передавать много
мелких параметров, которые оформляются как отделные микро-списки. Например:
Код: Выделить всё
metadata   &QueueTypeMetaData
"metadata": [
        {"key": "FileName","value": "shet.docx"},
        {"key": "DocumentNumber","value": "12345"},
        {"key": "DocumentDate","value": "2022-11-23T19:22:49Z"},
        {"key": "TotalSum","value": "137.98"}]
Они привязываются к указателям + Instance и заполняются данными. Список документов выгружается,
потом для каждой записи зачищаются все вложенные очереди. Катастрофически громозкий объём кода !
Здесь бы хорошо работал механизм как у Вас сделаны параметры Options в методах json::CreateObject() и т.д.
Т.е. обявлять такие микро-списки просто как строки и записывать в них уже готовую JSON строку.
Код: Выделить всё
Files  Queue
...
metadata CString('[{"key": "FileName","value": "shet.docx"},{"key": "DocumentNumber","value": "12345"} ...]')
   end
Или можно как-то упростить работу с мелкими списками по другому ? Заранее спасибо !
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
cJSON: Формат полей для вложенных структур
Да легко! Правда, не тестировал: новая опция "IsRaw".
			
							- Вложения
 - 
			
		
		
				
- cjson.clw
 - (76.96 КБ) 99 скачиваний
 
 
С уважением, ДП
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
Всё работает !  
  Сегодня просто праздник какой-то !  
			
			
									
						За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
cJSON: Формат полей для вложенных структур
Пока не буду обновлять github, чувствую ещё ничего не закончилось 
			
			
									
						С уважением, ДП
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
Я сейчас один умный вещь скажу, Вы только не обижайтесь ... (С) Мимино
Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ...
			
			
									
						Каждый, кто пойдёт в реальной работе дальше чем "группа + список" - увидит тоже, что и я ...
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
cJSON: Формат полей для вложенных структур
Если можно чего-то хотеть, то я бы попросил рассмотреть опцию для работу с файлами для json::CreateObject().
Т.е. мы указываем в строке полное имя файла, включаем для неё {"IsFile":True} и в тег записывается
содержимое файла в BASE64. Всё. Это направление сейчас вообще никак не представлено в классе.
Существующий инструмент позволяет решать задачу только многоходовой комбинацией
через динамические строки (+ буфер) и свернуть её я не могу (можно только внутри класса):
Спасибо !  
			
			
													Т.е. мы указываем в строке полное имя файла, включаем для неё {"IsFile":True} и в тег записывается
содержимое файла в BASE64. Всё. Это направление сейчас вообще никак не представлено в классе.
Существующий инструмент позволяет решать задачу только многоходовой комбинацией
через динамические строки (+ буфер) и свернуть её я не могу (можно только внутри класса):
Код: Выделить всё
xFileContent     &String
xBuffer &IDynStr
  Code
  ...
  ! В цикле для каждой записи списка
  xFileContent &= json::LoadFile(qDocument.FullName)  
  If ~(xFileContent &= Null)
     xBuffer.Kill
     xBuffer.Cat(ToBase64(xFileContent))  ! Содержимое файла в BASE64 без конвертации (AsIs)
     qDocument.Content &= New(String(xBuffer.StrLen()))  ! Тег в списке для выгрузки в JSON
     xBuffer.CopyTo(qDocument.Content)
     
     Dispose(xFileContent) 
  end
  ...
  Params &= json::CreateObject(gMessageToPost,,[{{"name":"Content","IsStringRef":true}]')
  ...
  ! В цикле для каждой записи списка
  If ~(qDocument.Content &= Null) then Dispose(qDocument.Content).  
					Последний раз редактировалось Игорь Столяров 24 Ноябрь 2022, 19:03, всего редактировалось 1 раз.
									
			
						За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						