helpf.pro
Регистрация
 +5 
Распечатать

Синтаксический анализ JSON - выражения средствами 1С 7.7

Код 1C v 7.x
 

Перем Л_Лев_Фиг_Скобка, Л_Прав_Фиг_Скобка, Л_Лев_Кв_Скобка, Л_Прав_Кв_Скобка, Л_Кавычка, Л_Экран, Л_Двоеточие, Л_Запятая, Л_Число, Л_Строка, Л_Константа, Л_Финиш;
Перем Цифры1_9, Цифры0_9, ПервыеСимволыКонстант, ОдносимвольныеЛексемы;
Перем НомЛексемы, ТекЛексема;
Перем JSON_Error;
Перем В_Массив, В_Объект, В_Значение;
//*****
Перем НомерСимвола;
Перем ФлагОшибки;
Перем СписокСтроковыхКонстант;
Перем СтекЛексем;
Перем АнализируемаяСтрока;
//*****
Перем ТекКаталог, ТекФайл;
//*****
Функция ПолучитьОбъект_ТЗ() Далее
Функция ПолучитьМассив_ТЗ() Далее
//*****
Функция ТекущиеСимволы(Сколько)
	Возврат Сред(АнализируемаяСтрока, НомерСимвола, Сколько);
КонецФункции
//*****
Функция ПрошлыйСимвол(Сдвиг)
	Возврат Сред(АнализируемаяСтрока, НомерСимвола - Сдвиг, 1);
КонецФункции
//*****
Процедура ДобавитьЛексему(Лексема, Значение, Сдвиг)
	СтекЛексем.НоваяСтрока();
	СтекЛексем.Лексема	= Лексема;
	СтекЛексем.Значение	= Значение;	
	НомерСимвола		= НомерСимвола + Сдвиг;
КонецПроцедуры
//*****
Процедура ОбвестиОбласть(Обл)
	Обл.РамкаСнизу(1);
	Обл.РамкаСверху(1);
	Обл.РамкаСлева(1);
	Обл.РамкаСправа(1);
КонецПроцедуры
//*****
Процедура НапечататьТЗ(Таб, ТЗ, НомС, НомК)
Перем Тип, Обл1, НС, КС, Ключ, Зн, Обл2;
	Тип = ТЗ.ПолучитьЗначение(1, 1);
	НомС = НомС + 1;
	Обл1 = Таб.Область(НомС, НомК);
	ОбвестиОбласть(Обл1);
	Если Тип = В_Значение Тогда
		ТипЗн = ТЗ.ПолучитьЗначение(2, 1);
		Обл1.Текст = ТЗ.ПолучитьЗначение(2, 2);
		Обл1.ГоризонтальноеПоложение(1);
		Если ТипЗн = Л_Число Тогда
			Обл1.ГоризонтальноеПоложение(2);
		ИначеЕсли ТипЗн = Л_Константа Тогда
			Обл1.Полужирный(1);
		ИначеЕсли ТипЗн = Л_Строка Тогда
			Обл1.Контроль(4);
		КонецЕсли;
		Возврат;
	ИначеЕсли (Тип = В_Объект) Или (Тип = В_Массив) Тогда
		Обл1.Текст = Тип;
		Обл1.Полужирный(1);
		Обл1.ЦветФона(12648447);
		Обл1.РамкаСнизу(5);
		КС = ТЗ.КоличествоСтрок();
		Для НС = 2 По КС Цикл
			НомС = НомС + 1;
			Обл2 = Таб.Область(НомС, НомК);
			Обл2.Текст = ТЗ.ПолучитьЗначение(НС, 1);
			Если Тип = В_Массив Тогда
				Обл2.ГоризонтальноеПоложение(2);
			КонецЕсли;
			ОбвестиОбласть(Обл2);
			НомС = НомС - 1;
			НапечататьТЗ(Таб, ТЗ.ПолучитьЗначение(НС, 2), НомС, НомК + 1);
		КонецЦикла;
	Иначе
		Сообщить("Фигня " + Тип, "!");
	КонецЕсли;
КонецПроцедуры
//*****
Процедура ВыравнятьТЗ(Таб, ОграничениеШирины)
Перем НомерКол, НомерСтр, МаксШирина, Обл, ТекШирина, ТекДлина;
	Для НомерКол = 1 По Таб.ШиринаТаблицы() Цикл
		МаксШирина = 0;
		Для НомерСтр = 1 По Таб.ВысотаТаблицы() Цикл
			Обл = Таб.Область(НомерСтр, НомерКол);
			ТекШирина = Обл.ШиринаСтолбца();
			ТекДлина = СтрДлина(СокрЛП(Обл.Текст));
			МаксШирина = Макс(МаксШирина, ТекШирина, ТекДлина);
		КонецЦикла;
		Таб.Область(, НомерКол).ШиринаСтолбца(Мин(МаксШирина, ОграничениеШирины));
	КонецЦикла;
КонецПроцедуры
//*****
Процедура Напечатать_ТЗ(ТЗ)
Перем Таб, НС, НК, МаксШирина, ТекДлина, Обл;	
	Таб = СоздатьОбъект("Таблица");
	МаксНК = 1;
	НС = 0;
	НК = 1;
	НапечататьТЗ(Таб, ТЗ, НС, НК);
	ВыравнятьТЗ(Таб, 30);
	Таб.Область(1, 1, Таб.ВысотаТаблицы(), Таб.ШиринаТаблицы()).ВертикальноеПоложение(2);
	Таб.Опции(0, 0);
	Таб.Показать("JSON");
КонецПроцедуры
//*****
Функция Ошибка()
	ФлагОшибки = 1;
	Возврат 0;
КонецФункции
//*****
Функция ЧитатьКонстанту(ПервСимвол)
Перем КонстантаСтр, ДлинаКонстанты;	
	КонстантаСтр = СписокСтроковыхКонстант.Получить(ПервСимвол);
	ДлинаКонстанты = СтрДлина(КонстантаСтр);
	Если ТекущиеСимволы(ДлинаКонстанты) = КонстантаСтр Тогда
		ДобавитьЛексему(Л_Константа, КонстантаСтр, ДлинаКонстанты);
		Возврат 1;
	Иначе
		Возврат Ошибка();
	КонецЕсли;
КонецФункции
//*****
Процедура ДописатьСимвол(Стр)
	Стр = Стр + ТекущиеСимволы(1);
	НомерСимвола = НомерСимвола + 1;
КонецПроцедуры
//*****
Функция ЧитатьЧисло() 
Перем ЧислоСтр;
	ЧислоСтр = "";
	Если ТекущиеСимволы(1) = "-" Тогда
		ДописатьСимвол(ЧислоСтр);
	КонецЕсли;
	Если Найти(Цифры1_9, ТекущиеСимволы(1)) > 0 Тогда // не с нуля
		ДописатьСимвол(ЧислоСтр);
		Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл  // любые цыфры 
			ДописатьСимвол(ЧислоСтр);
		КонецЦикла;		
	ИначеЕсли ТекущиеСимволы(1) = "0" Тогда //с нуля - ничего дальше 
		ДописатьСимвол(ЧислоСтр);
	Иначе
		Возврат Ошибка();
	КонецЕсли;
	Если ТекущиеСимволы(1) = "." Тогда // десятичная точка
		ДописатьСимвол(ЧислоСтр);
		Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл  // любые цыфры
			ДописатьСимвол(ЧислоСтр);
		КонецЦикла;		
	КонецЕсли;
	Если ВРег(ТекущиеСимволы(1)) = "E" Тогда // значок e больное или маленькое
		ДописатьСимвол(ЧислоСтр);
		Если Найти("+-", ТекущиеСимволы(1)) > 0 Тогда  // унарный знак для порядка
			ДописатьСимвол(ЧислоСтр);
		КонецЕсли;
		Пока Найти(Цифры0_9, ТекущиеСимволы(1)) > 0 Цикл  // любые цыфры
			ДописатьСимвол(ЧислоСтр);
		КонецЦикла;		
	КонецЕсли;
	ДобавитьЛексему(Л_Число, ЧислоСтр, 0);
	Возврат 1;
КонецФункции
//*****
Функция ЧитатьСтроку()
Перем СтрокаСтр;
	СтрокаСтр = "";
	НомерСимвола = НомерСимвола + 1;
	Пока (ТекущиеСимволы(1) <> Л_Кавычка) Или ((ТекущиеСимволы(1) = Л_Кавычка) И (ПрошлыйСимвол(1) = Л_Экран) И (ПрошлыйСимвол(2) <> Л_Экран)) Цикл
		ДописатьСимвол(СтрокаСтр);
	КонецЦикла;
	ДобавитьЛексему(Л_Строка, СтрокаСтр, 1); 
	Возврат 1;
КонецФункции 
//*****
Функция ПрочитатьФайл(ИмяФайла)
Перем Т, НомерСтрокиФайла, СтрокаРез;
	Т = СоздатьОбъект("Текст");
	Т.Открыть(ИмяФайла);
	СтрокаРез = "";
	Для НомерСтрокиФайла = 1 По Т.КоличествоСтрок() Цикл
		СтрокаРез = СтрокаРез + Т.ПолучитьСтроку(НомерСтрокиФайла);
	КонецЦикла;
	Возврат СтрокаРез;
КонецФункции
//*****
Функция СледующаяЛексема()
	НомЛексемы = НомЛексемы + 1;
	СтекЛексем.ПолучитьСтрокуПоНомеру(НомЛексемы);
	ТекЛексема = СтекЛексем.Лексема;
	Возврат 1;
КонецФункции
//*****
Функция ОшибкаЛексемы()
Перем РезСтр, НомСтр, ТЛ, ТС;
	Сообщить("Ошибочная лексема № " + НомЛексемы + " : <" + ТекЛексема + ">", "!");
	РезСтр = "";
	Для НомСтр = НомЛексемы + 1 По СтекЛексем.КоличествоСтрок() Цикл
		СтекЛексем.ПолучитьСтрокуПоНомеру(НомСтр);
		ТЛ = СтекЛексем.Лексема;
		Если ТЛ = Л_Строка Тогда 
			ТС = "<" + ТЛ + "(" + СтекЛексем.Значение + ")>";
		ИначеЕсли ТЛ = Л_Константа Тогда
			ТС = "<" + ТЛ + "(" + СтекЛексем.Значение + ")>";
		Иначе
			ТС = "<" + ТЛ + ">";
		КонецЕсли;
		РезСтр = РезСтр + ТС + ",";
	КонецЦикла;
	Сообщить(Лев(РезСтр, 400), "!");
	Возврат 0;
КонецФункции
//*****
Процедура ДобавитьПару(ТЗ, Ключ, Значение)
	ТЗ.НоваяСтрока();
	ТЗ.Ключ		= Ключ;
	ТЗ.Значение	= Значение;
КонецПроцедуры
//*****
Функция НоваяТЗ(Тип)
Перем _ТЗ;
	_ТЗ = СоздатьОбъект("ТаблицаЗначений");
	_ТЗ.НоваяКолонка("Ключ");
	_ТЗ.НоваяКолонка("Значение");
	ДобавитьПару(_ТЗ, Тип, "");
	Возврат _ТЗ;
КонецФункции
//*****
Функция ПолучитьПроизвольноеЗначение_ТЗ()
Перем ТЗ;	
	Если (ТекЛексема = Л_Строка) Или (ТекЛексема = Л_Число) Или (ТекЛексема = Л_Константа) Тогда
		ТЗ = НоваяТЗ(В_Значение);
		ДобавитьПару(ТЗ, ТекЛексема, СтекЛексем.Значение);
		СледующаяЛексема();
		Возврат ТЗ;
	ИначеЕсли ТекЛексема = Л_Лев_Фиг_Скобка Тогда
		Возврат ПолучитьОбъект_ТЗ();
	ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка 	Тогда
		Возврат ПолучитьМассив_ТЗ();					
	КонецЕсли;
	Возврат ОшибкаЛексемы();
КонецФункции
//*****
Функция ДобавитьКлючЗначение(ТЗ)
Перем НовКлюч, НовЗначение;
	Если ТекЛексема <> Л_Строка Тогда
		Возврат 0;
	КонецЕсли;
	НовКлюч = СтекЛексем.Значение;
	СледующаяЛексема();
	Если ТекЛексема <> Л_Двоеточие Тогда
		Возврат ОшибкаЛексемы();
	КонецЕсли;
	СледующаяЛексема();
	НовЗначение = ПолучитьПроизвольноеЗначение_ТЗ();
	Если НовЗначение = 0 Тогда
		Возврат 0;
	КонецЕсли;
	ДобавитьПару(ТЗ, НовКлюч, НовЗначение);
	Возврат 1;
КонецФункции
//*****
Функция ПолучитьОбъект_ТЗ()
Перем ТЗ;
	ТЗ = НоваяТЗ(В_Объект);
	СледующаяЛексема();
	Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда // пустой объект
		СледующаяЛексема();
		Возврат ТЗ;
	КонецЕсли;
	Если ДобавитьКлючЗначение(ТЗ) = 0 Тогда   // первая пара ключ-значение
		Возврат 0;
	КонецЕсли;	
	Пока ТекЛексема = Л_Запятая Цикл			// пока запятые
		СледующаяЛексема();
		Если ДобавитьКлючЗначение(ТЗ) = 0 Тогда	// пара ключ-значение
			Возврат 0;
		КонецЕсли;
	КонецЦикла;
	Если ТекЛексема = Л_Прав_Фиг_Скобка Тогда
		СледующаяЛексема();
		Возврат ТЗ;
	КонецЕсли;
	Возврат 0;
КонецФункции
//*****
Функция ПолучитьМассив_ТЗ()
Перем ТЗ, _Ключ, _Значение;
	ТЗ = НоваяТЗ(В_Массив);
	СледующаяЛексема();
	Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
		СледующаяЛексема();
		Возврат ТЗ;
	КонецЕсли;
	_Значение = ПолучитьПроизвольноеЗначение_ТЗ();
	Если _Значение = 0 Тогда
		Возврат 0;
	КонецЕсли;
	_Ключ = 0; // JS - индексы массиворв с нуля
	ДобавитьПару(ТЗ, _Ключ, _Значение);	
	Пока ТекЛексема = Л_Запятая Цикл
		СледующаяЛексема();
		_Значение = ПолучитьПроизвольноеЗначение_ТЗ();
		Если _Значение = 0 Тогда
			Возврат 0;
		КонецЕсли;
		_Ключ = _Ключ + 1;
		ДобавитьПару(ТЗ, _Ключ, _Значение);
	КонецЦикла;
	Если ТекЛексема = Л_Прав_Кв_Скобка Тогда
		СледующаяЛексема();
		Возврат ТЗ;
	КонецЕсли;
	Возврат 0;
КонецФункции
//*****
Функция ПрочитатьОбъект_ТЗ()
Перем Рез;	
	НомЛексемы = 0;
	СледующаяЛексема();
	Если ТекЛексема = Л_Лев_Фиг_Скобка Тогда
		Рез = ПолучитьОбъект_ТЗ();
	ИначеЕсли ТекЛексема = Л_Лев_Кв_Скобка Тогда
		Рез = ПолучитьМассив_ТЗ();
	Иначе
		Рез = ПолучитьПроизвольноеЗначение_ТЗ();
	КонецЕсли;
	Если (Рез = 0) Или (ТекЛексема <> Л_Финиш) Тогда
		ОшибкаЛексемы();
		Возврат 0;
	КонецЕсли;
	Возврат Рез;	
КонецФункции
//*****
Функция СгенерироватьТЗ(НачАнализируемаяСтрока)
Перем НачальныйСимвол, Рез;
	АнализируемаяСтрока = НачАнализируемаяСтрока;
	СтекЛексем = СоздатьОбъект("ТаблицаЗначений");
	СтекЛексем.НоваяКолонка("Лексема" , "Строка");
	СтекЛексем.НоваяКолонка("Значение", "Строка");
	ФлагОшибки = 0;
	НомерСимвола = 1;
	Пока НомерСимвола <= СтрДлина(АнализируемаяСтрока) Цикл
		НачальныйСимвол = ТекущиеСимволы(1);
		Если Найти(" " + Симв(9), НачальныйСимвол) > 0 Тогда  // пробелы и разделители строк пропускаем
			НомерСимвола = НомерСимвола + 1;
		ИначеЕсли НачальныйСимвол = Л_Кавычка	Тогда // кавычка - читаем строку
			ЧитатьСтроку();
		ИначеЕсли Найти(ОдносимвольныеЛексемы, НачальныйСимвол) > 0 Тогда
			ДобавитьЛексему(НачальныйСимвол, "", 1);
		ИначеЕсли Найти(ПервыеСимволыКонстант, НачальныйСимвол) > 0 Тогда // первая буква из начала константы - константа null, true, false
			Если ЧитатьКонстанту(НачальныйСимвол) = 0 Тогда
				Прервать;
			КонецЕсли;
		ИначеЕсли Найти("-" + Цифры0_9, НачальныйСимвол) > 0 Тогда // число
			Если ЧитатьЧисло() = 0 Тогда
				Прервать;
			КонецЕсли;
		Иначе		// иных вариантов нет
			Сообщить("========= " + НомерСимвола, "!");
			Сообщить(НачальныйСимвол, "!");
			Сообщить("<" + НачальныйСимвол + "> " + КодСимв(НачальныйСимвол), "!");
			Сообщить(ТекущиеСимволы(100), "!");
			Возврат 0;
		КонецЕсли;
	КонецЦикла;
	Если ФлагОшибки <> 0 Тогда
		Сообщить("Ошибка парсинга JSON - выражения", "!");
		Возврат 0;
	ИначеЕсли СтекЛексем.КоличествоСтрок() = 0 Тогда
		Сообщить("Пустой стек", "!");
		Возврат 0;
	КонецЕсли;
	ДобавитьЛексему(Л_Финиш, "", 0);
	Возврат ПрочитатьОбъект_ТЗ();
КонецФункции
//*****
Функция JSON_Error(Стр = "")
	Если Стр <> "" Тогда
		Сообщить("JSON-ОШИБКА: " + Стр, "!");
	КонецЕсли;
	Возврат JSON_Error;
КонецФункции
//*****
Функция JSON_Type(Парам)
	Если ТипЗначенияСтр(Парам) <> "ТаблицаЗначений" Тогда
		Возврат JSON_Error();
	ИначеЕсли Парам.КоличествоКолонок() <> 2 Тогда
		Возврат JSON_Error();
	ИначеЕсли Парам.КоличествоСтрок() < 2 Тогда
		Возврат JSON_Error();
	КонецЕсли;
	Возврат Парам.ПолучитьЗначение(1, 1);
КонецФункции
//*****
Функция JSON_GetValue(Парам, Keys)
Перем Тип, До, После, ПозЗакр, Л1, П2, Инд, ИндСтр, НС, КвоСтрок;
	Тип = JSON_Type(Парам);
	ПозЗакр = Найти(Keys, "]");
	Если ПозЗакр = 0 Тогда
		ПозЗакр = СтрДлина(Keys) + 1;
	КонецЕсли;	
	До = Лев(Keys, ПозЗакр);
	После = Сред(Keys, ПозЗакр + 1);
	Л1 = Лев(До, 1);
	П2 = Найти(До, "]");
	Если Тип = JSON_Error Тогда
		Возврат JSON_Error("Параметра");
	КонецЕсли;
	КвоСтрок = Парам.КоличествоСтрок();
	Если До = "" Тогда // сам объект
		Если (Тип = В_Массив) Или (Тип = В_Объект) Тогда
			Возврат JSON_Error();
		ИначеЕсли Тип = В_Значение Тогда
			Возврат Парам.ПолучитьЗначение(2, 2);
		Иначе
			Возврат JSON_Error("№ 1");
		КонецЕсли;		
	ИначеЕсли До = ".length" Тогда // размер массива или объекта. Для значения - ошибка
		Если (Тип = В_Массив) Или (Тип = В_Объект) Тогда
			Возврат Парам.КоличествоСтрок() - 1;
		Иначе
			Возврат JSON_Error("Длина скаляра");
		КонецЕсли;
	ИначеЕсли Л1 = "[" Тогда // размер массива или объекта. Для значения - ошибка
		Если П2 = 0 Тогда
			Возврат JSON_Error("Индексация: <" + До + ">");
		КонецЕсли;
		Инд = Сред(До, 2, П2 - 2);
		Если (Найти("'""", Лев(Инд, 1)) > 0) И (Найти("'""", Прав(Инд, 1)) > 0) Тогда // строковый только объект
			ИндСтр = Сред(Инд, 2, СтрДлина(Инд) - 2);
			Если Тип <> В_Объект Тогда
				Возврат JSON_Error("Строковый индекс <" + ИндСтр + "> только для Объекта");
			КонецЕсли;
			НС = 0;
			Если Парам.НайтиЗначение(ИндСтр, НС, 1) = 1 Тогда
				Возврат JSON_GetValue(Парам.ПолучитьЗначение(НС, 2), После);
			КонецЕсли;
			Возврат JSON_Error("Нет индекса <" + ИндСтр + ">");
		КонецЕсли;
		ИндЧис = 0 + Инд;
		Если "" + ИндЧис <> Инд Тогда // защита от <5D>
			Возврат JSON_Error("Ошибка 1 числового индекса <" + Инд + ">");
		ИначеЕсли Цел(ИндЧис) <> ИндЧис Тогда // защита от неЦелого индекса
			Возврат JSON_Error("Ошибка 2 числового индекса <" + Инд + "> (нецелый)");
		ИначеЕсли ИндЧис < 0 Тогда
			Возврат JSON_Error("Ошибка 3 числового индекса <" + Инд + "> (отрицательный)");
		ИначеЕсли ИндЧис > (КвоСтрок - 2) Тогда
			Возврат JSON_Error("Ошибка 4 числового индекса <" + Инд + "> (" + ИндЧис + ">" + (КвоСтрок - 2) + ")");
		КонецЕсли;
		Возврат JSON_GetValue(Парам.ПолучитьЗначение(ИндЧис + 1, 2), После);
	Иначе
		Возврат JSON_Error("Ошибка 5 <" + До + ">");
	КонецЕсли;
КонецФункции
//*****
Процедура ПриОткрытии()
Перем Рез1, ТипУзла1, Зн1, Значение;	
	ОчиститьОкноСообщений();
	СтатусВозврата(0);
	Рез1 = СгенерироватьТЗ(ПрочитатьФайл(ТекКаталог + "j1.json"));
	Напечатать_ТЗ(Рез1);
	ТипУзла1 = JSON_Type(Рез1);
	Сообщить("Тип узла: " + ТипУзла1);
	Зн1 = JSON_GetValue(Рез1, ".length");									Сообщить("1) Размер: " 		+ Зн1);
	Зн3 = JSON_GetValue(Рез1, "['1']");										Сообщить("3) ['1']: <" 		+ Зн3 + ">");
	Зн4 = JSON_GetValue(Рез1, "[1]");										Сообщить("4) [1]: <" 		+ Зн4 + ">");
	Зн5 = JSON_GetValue(Рез1, "['Массив'][6]");								Сообщить("5) [*]: <" + Зн5 + ">");
	Зн6 = JSON_GetValue(Рез1, "['Соответствие']['ДопустимоеИмяСвойства']");	Сообщить("6) [*]: <" + Зн6 + ">");
КонецПроцедуры
//*****
Процедура ДобавитьСтроковуюКонстанту(КонстантаСтр)
Перем ПервыйСимвол;	
	ПервыйСимвол = Лев(КонстантаСтр, 1);
	ПервыеСимволыКонстант = ПервыеСимволыКонстант + ПервыйСимвол;
	СписокСтроковыхКонстант.Установить(ПервыйСимвол, КонстантаСтр);
КонецПроцедуры
//*****
РасположениеФайла(ТекКаталог, ТекФайл);
//*****
Л_Лев_Фиг_Скобка	= "{";
Л_Прав_Фиг_Скобка	= "}";
Л_Лев_Кв_Скобка		= "["; 
Л_Прав_Кв_Скобка	= "]";
Л_Двоеточие			= ":";
Л_Запятая			= ",";
Л_Экран				= "\";
Л_Кавычка			= """";
Л_Финиш				= "";
Л_Число				= "number";
Л_Строка			= "string";
Л_Константа			= "const";
ОдносимвольныеЛексемы = Л_Лев_Фиг_Скобка + Л_Прав_Фиг_Скобка + Л_Лев_Кв_Скобка + Л_Прав_Кв_Скобка + Л_Двоеточие + Л_Запятая;
//*****
Цифры1_9 = "123456789";
Цифры0_9 = "0" + Цифры1_9;
//*****
В_Массив   = "###array";
В_Объект   = "###object";
В_Значение = "###value";
//*****
СписокСтроковыхКонстант	= СоздатьОбъект("СписокЗначений");
ПервыеСимволыКонстант	= "";
ДобавитьСтроковуюКонстанту("null");
ДобавитьСтроковуюКонстанту("false");
ДобавитьСтроковуюКонстанту("true");
JSON_Error = "ERROR";


В качестве примера взят файл j1.json :

{

"999": 88,

"Null": null,

"Сэкраном": "\"",

"Ложь": false,

"ОдинСимв": "1",

"1": "11111",

"Пустышка": "",

"Истина": true,

"Число (плавающая точка)": 1.001e-2,

"Число (плавающая)": -1.001e-2,

"Число (фиксированная точка)": -1000.001,

"Дата": "2011-01-01T12:00:00Z",

"Строка (двойная кавычка)": "Двойная кавычка",

"Строка (одинарная кавычка)": "Одинарная кавычка",

"Маскируемые символы": " \\ \/ \b \t \n \f \r \" ",

"Заковыристая строка": "\\n\\",

"Проблемные символы": "Спец. символы: \u0000, \u0001, \u0002, ... , \u001e, \u001f; Юникод символы: \u0421\u0430\u0448\u0430\u0020\u003a\u0029",

"Кириллические символы": "’АБВГҐДЂЃЕ?ЁЄЖЗЅИ?ІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ",

"Идентификатор": "a763cfbb-f94f-4c67-8e13-0e96a3a7f353",

"Пустой массив": [],

"Пустой объект": {},

"Массив": [

null,

false,

true,

1.001e-2,

-1000.001,

"2011-01-01T12:00:00Z",

"Двойная кавычка",

"Одинарная кавычка",

"a763cfbb-f94f-4c67-8e13-0e96a3a7f353",

[

"Первый элемент",

"Второй элемент"

],

{

"Имя": "Александр",

"Отчество": "Владимирович",

"Фамилия": "Переверзев"

},

{

"ДопустимоеИмяСвойства": true,

"Недопустимое Имя Свойства": false

}

],

"Структура":

{

"Имя": "Александр",

"Отчество": "Владимирович",

"Фамилия": "Переверзев"

},

"Соответствие":

{

"ДопустимоеИмяСвойства": true,

"Недопустимое Имя Свойства": false

},

"Ссылка":

{

"Ссылка": "00000000-0000-0000-0000-000000000000",

"Представление": "Неизвестная ссылка"

},

"COMSafeArray": [

0,

1,

2,

3,

4,

5

]

}

Разместил:   Версии: | 7.x |  Дата:   Прочитано: 17073
 +5 
Распечатать
Возможно, вас также заинтересует
QR код в 1С 21
Столкнулся с интересной задачей реализации генерации QR-кода в 1С 8.2 ( QR-код — матричный код (двухмерный штрихкод) ) Для генерации было использовано api от google (http://chart.apis.google.com/chart). Вот сайт , который работает с ним. После тог
ZIP-архив Создание 0
Для того чтобы записать файлы в ZIP-архив необходимо выполнить несколько простых действий: * Создать архив с необходимыми параметрами, в который будут помещаться файлы. * Поместить в архив необходимые файлы. * Записать архив. Создание объекта За
Активация открытой книги Excel для корректировки 0
Нужно было получить для изменения уже открытую книгу Excel, а если она закрыта, то открыть и изменять. Ниже код, который данную задачу решает. Попытка Эксель = Неопределено; Книга = Неопределено; Лист = Неопределено; Состояние(" Выполняется
Ввод по строке - поиск по первым символам или в любом месте наименования 6
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования! В 1С 8.3 по умолчанию настройки справочника номенклатуры такие: При такой настройке, механизм поиска в
Выгрузка / Загрузка данных посредством текстовых (TXT) файлов 5
Для работы с текстовыми документами существуют три типа данных – ТекстовыйДокумент, ЗаписьТекста и ЧтениеТекста . Разница двух подходов состоит в способе загрузки документа: ТекстовыйДокумент загружает файл целиком и далее построчно обрабатывает е
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!