Страница 1 из 2
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 14:07
				 harry
				Есть у кого  пример кода для парсинга вложенных очередей (очередь в очереди) (в примерах из исхджников не нашел)?
И может появилась возможность парсинга строки переменной длины (заранее неизвестен ее максимальный размер) или как лучше это реализовать ?
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 16:31
				 Дед Пахом
				Оба вопроса слишком неконкретные, а второй я вообще не понял.
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 17:19
				 harry
				1.  Вложенные очереди
Если в JSON, то например, так
Код: Выделить всё
{
	"TotalCount": 1,
	"Documents": [
		{
			"SubordinateDocumentIds": [
				{
					"MessageId": "daa0e01b-d04d-4f61-b47e-b252e4dfa6d8",
					"EntityId": "0daee88e-327b-45e2-942d-1a84bccc9520"
				}
			]
         ]
}
В Clarion так:
Код: Выделить всё
SubordinateDocumentIds_Que   Queue,Type
MessageId                                    String(40)
EntityId                                        String(40)
                                               end
Documents_Que  Queue,Type
SubordinateDocumentIds     &SubordinateDocumentIds_Que !ссылка на очередь
                          end
ResultGroup  Group
Documents      &Documents_Que !Ссылка на очередь
                    end
И вызвав, root.ToGroup() заполнить всю группу с вложенными очередями 
2. Имеется ввиду строки ссылочного типа
Вроде, нашел правило IsStringRef, но не понял , как должно работать, если в примере явный NEW()
- NEW: field rule "IsStringRef" applies to &STRING fields.
```
TestGroup                       GROUP
SomeFileData                      &STRING
                                END
jitem                           &cJSON
  CODE
  TestGroup.SomeFileData &= NEW(STRING(LEN('Some File Data')))
  TestGroup.SomeFileData = 'Some File Data'
  jitem &= json::CreateObject(TestGroup, , '{{"name":"SomeFileData", "IsStringRef":true}')
```
 
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 17:42
				 Дед Пахом
				Помню, мы всё это обсуждали, хотя найти будет трудно в темах "Обо всём подряд".
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 17:57
				 harry
				Да, здесь 
viewtopic.php?p=48115#p48115 было про получение &string , но может, что то изменилось ?
 
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 19:43
				 Дед Пахом
				Можно юзать TCJsonRuleHelper и поля типа "auto", как-то так:
Код: Выделить всё
rh        CLASS(TCJsonRuleHelper)
AutoCB      PROCEDURE(STRING pFldName, cJSON pItem), DERIVED
          END
MyGroup   Group
FieldName   &String
          end
  CODE
  jRoot &= jParser.ParseFile('file.json')
  IF NOT jRoot &= NULL
    jRoot.ToGroup(MyGroup,,printf('[{{"name":"*","rulehelper":%i}, {{"name":"FieldName","auto":true}]', ADDRESS(rh)))
    jRoot.Delete()
  END
rh.AutoCB                     PROCEDURE(STRING pFldName, cJSON pItem)
  CODE
  IF pFldName = 'FIELDNAME' !- name in UPPERCASE as returned by WHO() w/o a prefix
    MyGroup.FieldName &= NEW STRING(pItem.GetStringSize())
    MyGroup.FieldName = pItem.GetStringValue()
  END
Для вложенных очередей проще загрузить корневую (Documents), а затем в цикле загружать остальное.
 
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 19:46
				 harry
				Спасибо! Попробую
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 20:30
				 harry
				Все таки думаю, что так не совсем правильно, т.к. такое же имя может быть в другой группе.
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 22:13
				 Дед Пахом
				Так себе идея иметь одинаковые имена полей в группе.
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 22:32
				 harry
				Согласен, но такие структуры возвращаются от операторов ЭДО, например, в данном случае от Диадок
			 
			
					
				Примеры для cJCON
				Добавлено: 14 Сентябрь 2023, 22:47
				 Дед Пахом
				Зачем инородную структуру воспроизводить в Clarion один в один?
			 
			
					
				Примеры для cJCON
				Добавлено: 15 Сентябрь 2023, 8:36
				 Игорь Столяров
				harry писал(а): 14 Сентябрь 2023, 22:32
в данном случае от Диадок
 
Не хотелось бы спорить - но в структурах данных API Контур.Диадок ВСЕ поля во ВСЕХ структурах данных имеют уникальные полные имена.
Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией. 
Дед Пахом писал(а): 14 Сентябрь 2023, 22:47
Зачем инородную структуру воспроизводить в Clarion один в один?
 
Удобно. Хорошо отслеживаются изменения и применяются описания методов работы с данными из документации.
 
			 
			
					
				Примеры для cJCON
				Добавлено: 15 Сентябрь 2023, 9:30
				 harry
				Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией
Не совсем понял, как это. Парсер, ведь  разбирает (ищет в структуре Clarion) по имени в JSON. И если в JSON поле называется FieldName, то искать парсер будет именно его и никакое другое. Или я чего то не понял. Можете пример правильной структуры привести для понимания ?
 
			 
			
					
				Примеры для cJCON
				Добавлено: 15 Сентябрь 2023, 9:57
				 Игорь Столяров
				Всё есть в описании Контур.Диадок ... 
Со сложными структурами данных не получится работать наложением описания данных (как штатный парсер).
Здесь нужно идти по дереву и обрабатывать списочные структуры JSON (как это реализовано в cJSON - см. примеры)
harry писал(а): 15 Сентябрь 2023, 9:30
Можете пример правильной структуры привести для понимания
 
Ну вот, например, фрагмент описания документа.
Код: Выделить всё
! --- Список тегов документа
Dia:Q_CustomDataItem        Queue,Type
Key                           CString( 61)      ! Название тега. Не может быть пустым. Регистронезависимый. Только буквы алфавита, цифры и символы «-» и «_»
Value                         CString(201)      ! Значение тега, соответствующее ключу Key. Может быть пустым. Регистронезависимый
                            end
! --- Представляет пару «ключ-значение», привязанную к документу в качестве метаданных
Dia:Q_MetadataItem          Queue,Type
Key                           CString( 61)      ! Непустой ключ. Должен быть валидным ключом метаданных для данного типа документа
Value                         CString(201)      ! Непустое значение, соответствующее ключу Key
                            end
! --- Документ любого типа
Dia:Q_DocumentAttachment    Queue,Type
                                                ! Содержимое файла вместе с ЭП под ним
SignedContent                 Group(Dia:G_SignedContent).
Comment                       CString(255)      ! Необязательный текстовый комментарий к документу. Длина не более 5000 символов
NeedRecipientSignature        Bool(False)       ! Флаг, обозначающий запрос подписи получателя под отправляемым документом
InitialDocumentIds            &Dia:Q_DocumentId ! Список идентификаторов документов, к которым привязывается отправляемый документ
SubordinateDocumentIds        &Dia:Q_DocumentId ! Список идентификаторов документов, которые должны ссылаться на отправляемый документ
CustomDocumentId              String(36)        ! Необязательный идентификатор документа во внешней системе, уникальный в рамках структуры MessageToPost
NeedReceipt                   Bool(False)       ! Необязательный признак того, что от получателя требуется сформировать извещение о получении данного документа
                                                ! Список пар вида «ключ-значение», содержащих произвольные данные по документу
CustomData                    &Dia:Q_CustomDataItem 
TypeNamedId                   String(36)        ! Cтроковой идентификатор типа документа. Доступные типы можно получить методом GetDocumentTypes.
                                                ! Идентификатор функции документа. Обязательно при отправке зашифрованных документов.
Function_                     String(36),Name('Function')
Version                       String(36)        ! Идентификатор версии документа. Обязательно при отправке зашифрованных документов.
                                                ! Список пар вида «ключ-значение», содержащих метаданные документа
Metadata                      &Dia:Q_MetadataItem
....
                            end
Блоки Metadata и CustomDataItem (то что Вы называете "очередь в очереди") имеют одинаковые наименования полей,
но эти наименования уникальны в структуре описания документа. Т.е. нельзя тупо получить список значений всех пар
Key/Value - т.к. их содержание зависит от контекста. И здесь всё абсолютно правильно реализовано в парсере cJSON
(поскольку иной разбор в общем виде невозможен в принципе).
 
			 
			
					
				Примеры для cJCON
				Добавлено: 15 Сентябрь 2023, 10:22
				 harry
				Код: Выделить всё
Здесь нужно идти по дереву и обрабатывать списочные структуры JSON
Т.е. вместо одного вызова метода ToGroup() придется каждую "сложную" структуру  творчески разбирать путем обхода дерева ?
С вложенными группами и повторяющимися именами в них (мой вопрос из параллельной ветки "Парсинг вложенных групп в cJSON"), получается тоже только такой выход (ручной обход дерева) и одним ToGroup не обойтись?