Last active
March 19, 2024 09:22
-
-
Save PlugFox/aac4d207e795655c007b963ec04e99a7 to your computer and use it in GitHub Desktop.
JSON сериализация
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Область JSON | |
Функция СериализоватьJSON(Данные, ФункцияПреобразования = "ФункцияПреобразованияJSON") Экспорт | |
ЗаписьJSON = Новый ЗаписьJSON; | |
ЗаписьJSON.УстановитьСтроку(); | |
НастройкиСериализации = Новый НастройкиСериализацииJSON(); | |
НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь; | |
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; | |
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением; | |
ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализации, ФункцияПреобразования, веб_сериализация); | |
Возврат ЗаписьJSON.Закрыть(); | |
КонецФункции // СериализоватьJSON() | |
//************************************************************ | |
Функция ДесериализоватьJSON(СтрокаJSON) Экспорт | |
ЧтениеJSON = Новый ЧтениеJSON(); | |
ЧтениеJSON.УстановитьСтроку(СтрокаJSON); | |
Возврат ПрочитатьJSON(ЧтениеJSON); | |
КонецФункции // ДесериализоватьJSON() | |
//************************************************************ | |
Функция СериализоватьОбъектJSON(Данные) Экспорт | |
ЗаписьJSON = Новый ЗаписьJSON; | |
ЗаписьJSON.УстановитьСтроку(); | |
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Данные); | |
Возврат ЗаписьJSON.Закрыть(); | |
КонецФункции // СериализоватьОбъектJSON() | |
//************************************************************ | |
Функция ДесериализоватьОбъектJSON(СтрокаJSON) Экспорт | |
ЧтениеJSON = Новый ЧтениеJSON(); | |
ЧтениеJSON.УстановитьСтроку(СтрокаJSON); | |
Возврат СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON); | |
КонецФункции // ДесериализоватьОбъектJSON() | |
//************************************************************ | |
// Данная функция вызывается для всех свойств, тип которых не поддерживает преобразование в формат JSON напрямую. | |
// Она должна преобразовать Значение в значение допустимого для записи в JSON типа. | |
// Функция должна предваряться директивой &НаСервере или &НаКлиенте. | |
// Использование функции вне контекста формы или модуля, или команды не допускается. | |
// | |
// Параметры: | |
// Свойство - в параметр передается имя свойства, если выполняется запись структуры или соответствия, | |
// Значение - в параметр передается исходное значение, | |
// ДополнительныеПараметры - дополнительные параметры, которые указаны в вызове метода ЗаписатьJSON, | |
// Отказ - отказ от записи свойства. | |
// | |
// Возвращаемое значение: | |
// + Неопределено, | |
// + Булево, | |
// + Число, | |
// + Строка, | |
// + Дата (будет преобразована в строку), | |
// + Структура, | |
// + ФиксированнаяСтруктура, | |
// + Массив, | |
// + ФиксированныйМассив, | |
// + Соответствие, | |
// + ФиксированноеСоответствие. | |
// | |
// Если функция возвращает объект, который не поддерживает преобразование в JSON, то будет вызвано исключение. | |
// Если данный параметр задан и не задан параметр <МодульФункцииПреобразования>, и наоборот, будет вызвано исключение. | |
Функция ФункцияПреобразованияJSON(Знач Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт | |
// Таблица значений | |
Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда | |
/// TODO: преобразовывать ссылки из таблицы значений одним запросом, чтоб снизить количество обращений к базе данных. | |
/// ... | |
// Переведем названия колонок на латиницу | |
Для Каждого Колонка Из Значение.Колонки Цикл | |
matchingFieldNames = веб_заявки_повт.matchingFieldNames(, Истина); | |
ИмяЛат = matchingFieldNames[НРег(Колонка.Имя)]; | |
Колонка.Имя = ?(ИмяЛат=Неопределено, Колонка.Имя, ИмяЛат); | |
КонецЦикла; | |
// Преобразуем в массив структур | |
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение); | |
КонецЕсли; | |
// Более сложные типы | |
мета = Метаданные.НайтиПоТипу(ТипЗнч(Значение)); | |
value = ?(Значение.Пустая(), Неопределено, XMLСтрока(Значение)); | |
type = мета.ПолноеИмя(); | |
baseType = Лев(type, СтрНайти(type, ".")-1); | |
Данные = Новый Структура("value,type,baseType,presentation" | |
, value, type, baseType, мета.Представление()); | |
Если НРег(baseType) = "справочник" Тогда | |
Данные.Вставить("code", ?(value=Неопределено, Неопределено, Значение.Код)); | |
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Значение.Наименование)); | |
ИначеЕсли НРег(baseType) = "документ" Тогда | |
Данные.Вставить("number", ?(value=Неопределено, Неопределено, Значение.Номер)); | |
Данные.Вставить("date", ?(value=Неопределено, Неопределено, Значение.Дата)); | |
ИначеЕсли НРег(baseType) = "перечисление" Тогда | |
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение))); | |
ИначеЕсли НРег(baseType) = "планвидовхарактеристик" Тогда | |
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение))); | |
ИначеЕсли НРег(baseType) = "плансчетов" Тогда | |
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение))); | |
Иначе | |
Данные.Вставить("description", ?(value=Неопределено, Неопределено, Строка(Значение))); | |
КонецЕсли; | |
Возврат Данные; | |
КонецФункции // ФункцияПреобразованияJSON() | |
//************************************************************ | |
Функция БыстроJSON(Знач Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт | |
// Таблица значений | |
Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда | |
/// TODO: преобразовывать ссылки из таблицы значений одним запросом, чтоб снизить количество обращений к базе данных. | |
/// ... | |
// Переведем названия колонок на латиницу | |
Для Каждого Колонка Из Значение.Колонки Цикл | |
matchingFieldNames = веб_заявки_повт.matchingFieldNames(, Истина); | |
ИмяЛат = matchingFieldNames[НРег(Колонка.Имя)]; | |
Колонка.Имя = ?(ИмяЛат=Неопределено, Колонка.Имя, ИмяЛат); | |
КонецЦикла; | |
// Преобразуем в массив структур | |
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение); | |
КонецЕсли; | |
Возврат XMLСтрока(Значение); | |
КонецФункции // БыстроJSON() | |
#КонецОбласти |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment