Страница 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 не обойтись?