Примеры для cJCON
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Основной тред
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Основной тред
Примеры для cJCON
Есть у кого  пример кода для парсинга вложенных очередей (очередь в очереди) (в примерах из исхджников не нашел)?
И может появилась возможность парсинга строки переменной длины (заранее неизвестен ее максимальный размер) или как лучше это реализовать ?
			
			
									
						И может появилась возможность парсинга строки переменной длины (заранее неизвестен ее максимальный размер) или как лучше это реализовать ?
Примеры для cJCON
1.  Вложенные очереди
Если в JSON, то например, так
В Clarion так:
И вызвав, root.ToGroup() заполнить всю группу с вложенными очередями 
2. Имеется ввиду строки ссылочного типа
Вроде, нашел правило IsStringRef, но не понял , как должно работать, если в примере явный NEW()
			
			
									
						Если в JSON, то например, так
Код: Выделить всё
{
	"TotalCount": 1,
	"Documents": [
		{
			"SubordinateDocumentIds": [
				{
					"MessageId": "daa0e01b-d04d-4f61-b47e-b252e4dfa6d8",
					"EntityId": "0daee88e-327b-45e2-942d-1a84bccc9520"
				}
			]
         ]
}
Код: Выделить всё
SubordinateDocumentIds_Que   Queue,Type
MessageId                                    String(40)
EntityId                                        String(40)
                                               end
Documents_Que  Queue,Type
SubordinateDocumentIds     &SubordinateDocumentIds_Que !ссылка на очередь
                          end
ResultGroup  Group
Documents      &Documents_Que !Ссылка на очередь
                    end2. Имеется ввиду строки ссылочного типа
Код: Выделить всё
MyGroup   Group
FieldName       &String
          end```- 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}')
- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Примеры для cJCON
Помню, мы всё это обсуждали, хотя найти будет трудно в темах "Обо всём подряд".
			
			
									
						С уважением, ДП
			
						Примеры для cJCON
Да, здесь viewtopic.php?p=48115#p48115 было про получение &string , но может, что то изменилось ?
			
			
									
						- Дед Пахом
 - Старичок
 - Сообщения: 3346
 - Зарегистрирован: 07 Июль 2005, 16:51
 - Откуда: Москва, Россия
 - Благодарил (а): 20 раз
 - Поблагодарили: 56 раз
 - Контактная информация:
 
Примеры для cJCON
Можно юзать TCJsonRuleHelper и поля типа "auto", как-то так:
Для вложенных очередей проще загрузить корневую (Documents), а затем в цикле загружать остальное.
			
			
									
						Код: Выделить всё
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
С уважением, ДП
			
						Примеры для cJCON
Все таки думаю, что так не совсем правильно, т.к. такое же имя может быть в другой группе.
			
			
									
						Примеры для cJCON
Согласен, но такие структуры возвращаются от операторов ЭДО, например, в данном случае от Диадок
			
			
									
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Примеры для cJCON
Не хотелось бы спорить - но в структурах данных API Контур.Диадок ВСЕ поля во ВСЕХ структурах данных имеют уникальные полные имена.
Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией.
Удобно. Хорошо отслеживаются изменения и применяются описания методов работы с данными из документации.Дед Пахом писал(а): 14 Сентябрь 2023, 22:47 Зачем инородную структуру воспроизводить в Clarion один в один?
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						Примеры для cJCON
Не совсем понял, как это. Парсер, ведь разбирает (ищет в структуре Clarion) по имени в JSON. И если в JSON поле называется FieldName, то искать парсер будет именно его и никакое другое. Или я чего то не понял. Можете пример правильной структуры привести для понимания ?Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией
- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Примеры для cJCON
Всё есть в описании Контур.Диадок ... 
Со сложными структурами данных не получится работать наложением описания данных (как штатный парсер).
Здесь нужно идти по дереву и обрабатывать списочные структуры JSON (как это реализовано в cJSON - см. примеры)
Блоки Metadata и CustomDataItem (то что Вы называете "очередь в очереди") имеют одинаковые наименования полей,
но эти наименования уникальны в структуре описания документа. Т.е. нельзя тупо получить список значений всех пар
Key/Value - т.к. их содержание зависит от контекста. И здесь всё абсолютно правильно реализовано в парсере cJSON
(поскольку иной разбор в общем виде невозможен в принципе).
			
			
									
						Со сложными структурами данных не получится работать наложением описания данных (как штатный парсер).
Здесь нужно идти по дереву и обрабатывать списочные структуры JSON (как это реализовано в cJSON - см. примеры)
Ну вот, например, фрагмент описания документа.
Код: Выделить всё
! --- Список тегов документа
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
но эти наименования уникальны в структуре описания документа. Т.е. нельзя тупо получить список значений всех пар
Key/Value - т.к. их содержание зависит от контекста. И здесь всё абсолютно правильно реализовано в парсере cJSON
(поскольку иной разбор в общем виде невозможен в принципе).
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						Примеры для cJCON
Код: Выделить всё
Здесь нужно идти по дереву и обрабатывать списочные структуры JSONС вложенными группами и повторяющимися именами в них (мой вопрос из параллельной ветки "Парсинг вложенных групп в cJSON"), получается тоже только такой выход (ручной обход дерева) и одним ToGroup не обойтись?
					Последний раз редактировалось harry 15 Сентябрь 2023, 10:33, всего редактировалось 1 раз.
									
			
						