Примеры для 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 !Ссылка на очередь
end
2. Имеется ввиду строки ссылочного типа
Код: Выделить всё
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}')
- Дед Пахом
- Старичок
- Сообщения: 3273
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
Примеры для cJCON
Помню, мы всё это обсуждали, хотя найти будет трудно в темах "Обо всём подряд".
С уважением, ДП
Примеры для cJCON
Да, здесь viewtopic.php?p=48115#p48115 было про получение &string , но может, что то изменилось ?
- Дед Пахом
- Старичок
- Сообщения: 3273
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 15 раз
- Поблагодарили: 48 раз
- Контактная информация:
Примеры для 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
Согласен, но такие структуры возвращаются от операторов ЭДО, например, в данном случае от Диадок
- Игорь Столяров
- Ветеран движения
- Сообщения: 7909
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 91 раз
Примеры для cJCON
Не хотелось бы спорить - но в структурах данных API Контур.Диадок ВСЕ поля во ВСЕХ структурах данных имеют уникальные полные имена.
Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией.
Удобно. Хорошо отслеживаются изменения и применяются описания методов работы с данными из документации.
Make Clarion Great Again ! 
Примеры для cJCON
Не совсем понял, как это. Парсер, ведь разбирает (ищет в структуре Clarion) по имени в JSON. И если в JSON поле называется FieldName, то искать парсер будет именно его и никакое другое. Или я чего то не понял. Можете пример правильной структуры привести для понимания ?Нужно описывать данные как целостную структуру, а не кусочками - в полном соответствии с документацией
- Игорь Столяров
- Ветеран движения
- Сообщения: 7909
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 91 раз
Примеры для 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
(поскольку иной разбор в общем виде невозможен в принципе).
Make Clarion Great Again ! 
Примеры для cJCON
Код: Выделить всё
Здесь нужно идти по дереву и обрабатывать списочные структуры JSON
С вложенными группами и повторяющимися именами в них (мой вопрос из параллельной ветки "Парсинг вложенных групп в cJSON"), получается тоже только такой выход (ручной обход дерева) и одним ToGroup не обойтись?
Последний раз редактировалось harry 15 Сентябрь 2023, 10:33, всего редактировалось 1 раз.