Запись и чтение данных в формате JSON в 1С V8 [1120]
[8] AdminITD - 2018-12-01 03:00:00
|
|
V81, V82, V83
|
Чтение из JSON
Функция ПрочитатьТекстJSON (ТекстJSON)Экспорт
Результат = Новый Структура;
ТекстJSON = СтрЗаменить(ТекстJSON, """", "");
ТекстJSON = СокрЛП(ТекстJSON);
Если Лев(ТекстJSON, 1) = "{" Тогда // начало объекта
ОбработатьJSON(Результат, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //начало массива
МассивДанных = Новый Массив;
ОбработатьJSON(МассивДанных, ТекстJSON, "Массив");
Результат.Вставить("Значение", МассивДанных);
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ОбработатьJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
НомерЗначения = 0;
Пока ТекстJSON <> "" Цикл
ПервыйСимвол = Лев(ТекстJSON, 1);
Если ПервыйСимвол = "{" Тогда //вложенная структура
Значение = Новый Структура;
ОбработатьJSON(Значение, ТекстJSON, "Структура");
Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "[" Тогда //вложенный массив
Значение = Новый Массив;
ОбработатьJSON(Значение, ТекстJSON, "Массив");
Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
Иначе
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда //структура закончилась
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;
Возврат;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда //массив закончился
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;
Возврат;
Иначе
Если ТипДанных = "Структура" Тогда
Поз = Найти(ТекстJSON, ":");
Если Поз = 0 Тогда
Прервать;
КонецЕсли;
ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
Если Лев(ТекстJSON, 1) = "{" Тогда //значение является структурой
Значение = Новый Структура;
ОбработатьJSON(Значение, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //значение является массивом
Значение = Новый Массив;
ОбработатьJSON(Значение, ТекстJSON, "Массив");
Иначе // обычное значение
ПервыйКавычка = Ложь;
ПредпоследнийКавычка = Ложь;
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = """" Тогда
Если ПервыйКавычка Тогда
ПредпоследнийКавычка = Истина;
Иначе
ПервыйКавычка = Истина;
КонецЕсли;
КонецЕсли;
Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
КонецЕсли;
Попытка
Результат.Вставить(ИмяЗначения, Значение);
Исключение
а=1;
КонецПопытки;
ИначеЕсли ТипДанных = "Массив" Тогда //обычное значение
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Запись в JSON
Функция СформироватьJSON(ОбъектДанных)Экспорт
Тип = ТипЗнч(ОбъектДанных);
Если Тип = Тип("Массив") ИЛИ Тип = Тип("ТаблицаЗначений") ИЛИ Тип = Тип("СписокЗначений") Тогда
Количество = ОбъектДанных.Количество();
Результат = "[";
Для н = 0 ПО Количество - 1 Цикл
Результат = Результат + СформироватьJSON(ОбъектДанных[н]) + ?(н < Количество - 1, ", ", "");
КонецЦикла;
Результат = Результат + "]";
Возврат Результат;
ИначеЕсли Тип = Тип("Структура") ИЛИ Тип = Тип("Соответствие") Тогда
н = 0;
Количество = ОбъектДанных.Количество();
Результат = "{";
Для Каждого КлючЗначение Из ОбъектДанных Цикл
Результат = Результат + СформироватьJSON(КлючЗначение.Ключ) + ": " + СформироватьJSON(КлючЗначение.Значение) + ?(н < Количество - 1, ", ", "");
н = н + 1;
КонецЦикла;
Результат = Результат + "}";
Возврат Результат;
ИначеЕсли Тип = Тип("СтрокаТаблицыЗначений") Тогда
Результат = "{";
Колонки = ОбъектДанных.Владелец().Колонки;
Количество = Колонки.Количество();
Для н = 0 ПО Количество - 1 Цикл
Ключ = Колонки[н].Имя;
Результат = Результат + СформироватьJSON(Ключ) + ": " + СформироватьJSON(ОбъектДанных[Ключ]) + ?(н < Количество - 1, ", ", "");
КонецЦикла;
Результат = Результат + "}";
Возврат Результат;
ИначеЕсли Тип = Тип("ЭлементСпискаЗначений") Тогда
Возврат СформироватьJSON(ОбъектДанных.Значение);
ИначеЕсли Тип = Тип("Строка") Тогда
Результат = ОбъектДанных;
Результат = СтрЗаменить(Результат, "\", "\\");
Результат = СтрЗаменить(Результат, "\\u", "\u");
Результат = СтрЗаменить(Результат, "/", "\/");
Результат = СтрЗаменить(Результат, """", "\""");
Результат = СтрЗаменить(Результат, Символы.ВК, "\r");
Результат = СтрЗаменить(Результат, Символы.Таб, "\t");
Результат = СтрЗаменить(Результат, Символы.ПС, "\n");
Возврат """" + Результат + """";
ИначеЕсли Тип = Тип("Число") Тогда
Возврат Формат(ОбъектДанных, "ЧРД=.; ЧН=0; ЧГ=0");
ИначеЕсли Тип = Тип("Булево") Тогда
Возврат Формат(ОбъектДанных, "БЛ=false; БИ=true");
ИначеЕсли Тип = Тип("Дата") Тогда
Возврат СформироватьJSON(Формат(ОбъектДанных, "ДФ=dd.MM.yyyy"));
ИначеЕсли ОбъектДанных = Неопределено ИЛИ ОбъектДанных = NULL Тогда
Возврат "null";
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(Тип) Или Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
Возврат СформироватьJSON(ОбъектДанных.УникальныйИдентификатор());
Иначе
Возврат СформироватьJSON(Строка(ОбъектДанных));
КонецЕсли;
КонецФункции
● Файлы для скачивания:
|  |
 |
для получения доступа требуется авторизация
размер: 1.8 кб, скачиваний: 26.
cодержимое архива: Текст обработчиков JSON.txt - 6,9 кб.
|