Примеры для cJCON

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Есть у кого пример кода для парсинга вложенных очередей (очередь в очереди) (в примерах из исхджников не нашел)?
И может появилась возможность парсинга строки переменной длины (заранее неизвестен ее максимальный размер) или как лучше это реализовать ?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Примеры для cJCON

Сообщение Дед Пахом »

Оба вопроса слишком неконкретные, а второй я вообще не понял.
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение 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. Имеется ввиду строки ссылочного типа

Код: Выделить всё

MyGroup   Group
FieldName       &String
          end
Вроде, нашел правило 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}')
```
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Примеры для cJCON

Сообщение Дед Пахом »

Помню, мы всё это обсуждали, хотя найти будет трудно в темах "Обо всём подряд".
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Да, здесь viewtopic.php?p=48115#p48115 было про получение &string , но может, что то изменилось ?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Примеры для cJCON

Сообщение Дед Пахом »

Можно юзать 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), а затем в цикле загружать остальное.
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Спасибо! Попробую
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Все таки думаю, что так не совсем правильно, т.к. такое же имя может быть в другой группе.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Примеры для cJCON

Сообщение Дед Пахом »

Так себе идея иметь одинаковые имена полей в группе.
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Согласен, но такие структуры возвращаются от операторов ЭДО, например, в данном случае от Диадок
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Примеры для cJCON

Сообщение Дед Пахом »

Зачем инородную структуру воспроизводить в Clarion один в один?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7379
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Примеры для cJCON

Сообщение Игорь Столяров »

harry писал(а): 14 Сентябрь 2023, 22:32 в данном случае от Диадок
Не хотелось бы спорить - но в структурах данных API Контур.Диадок ВСЕ поля во ВСЕХ структурах данных имеют уникальные полные имена.
Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией.
Дед Пахом писал(а): 14 Сентябрь 2023, 22:47 Зачем инородную структуру воспроизводить в Clarion один в один?
Удобно. Хорошо отслеживаются изменения и применяются описания методов работы с данными из документации.
За теми кто отстал - не возвращаться. (С) Кодекс
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией
Не совсем понял, как это. Парсер, ведь разбирает (ищет в структуре Clarion) по имени в JSON. И если в JSON поле называется FieldName, то искать парсер будет именно его и никакое другое. Или я чего то не понял. Можете пример правильной структуры привести для понимания ?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7379
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Примеры для cJCON

Сообщение Игорь Столяров »

Всё есть в описании Контур.Диадок ...
Со сложными структурами данных не получится работать наложением описания данных (как штатный парсер).
Здесь нужно идти по дереву и обрабатывать списочные структуры 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
(поскольку иной разбор в общем виде невозможен в принципе).
За теми кто отстал - не возвращаться. (С) Кодекс
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Примеры для cJCON

Сообщение harry »

Код: Выделить всё

Здесь нужно идти по дереву и обрабатывать списочные структуры JSON
Т.е. вместо одного вызова метода ToGroup() придется каждую "сложную" структуру творчески разбирать путем обхода дерева ?

С вложенными группами и повторяющимися именами в них (мой вопрос из параллельной ветки "Парсинг вложенных групп в cJSON"), получается тоже только такой выход (ручной обход дерева) и одним ToGroup не обойтись?
Последний раз редактировалось harry 15 Сентябрь 2023, 10:33, всего редактировалось 1 раз.
Ответить