наверх
Свободные IT публикации
логин:
пароль:

Запись и чтение данных в формате 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 кб, скачиваний: 30. cодержимое архива: Текст обработчиков JSON.txt - 6,9 кб.

● Комментарии:

Для добавления комментария необходима авторизация.

Нет комментариев