JSON парсер для 1С, облегченный

05.12.14

Разработка - Универсальные функции

Простенький парсер JSON для 1С.

Поскольку доступный в сети парсер для меня оказался тяжеловат+ требовал встраивания в конфигурацию, я решил написать свою версию. Здесь представлен вариант работы с Таблицей Значений для наглядности, хотя мне удобнее работать с объектами XDTO.  Для парсинга строки по итогам работы нам нужно знать только позицию и вес(длину)  подстроки объкта, что позволяет легко и быстро организовать доступ к объекту, даже не зная его содержания. "Типобъекта" и "родитель" позволяют строить дерево объектов в xdto.

 

 

Сейчас работаю через парсер со smartsheet.api, ошибок пока не было, но в любом случае, если используете парсер, то делаете это на свой страх и риск %)

&НаСервере
Функция ВернутьСтрокуОбъекта(ПервыйСимвол,ПоследнийСимвол,СтрокаРеквизита)
	 КоличествоВложений=1;
	 СтрокаНабора="";
	 Для к=2 По СтрДлина(СтрокаРеквизита) Цикл
		Символ=Сред(СтрокаРеквизита,к,1);
		Если Символ=ПервыйСимвол ТОгда
			КоличествоВложений=КоличествоВложений+1;
		ИначеЕсли ПоследнийСимвол=Символ Тогда
			КоличествоВложений=КоличествоВложений-1;
		Конецесли;
		Если КоличествоВложений=0 Тогда
			Возврат СтрокаНабора;
		КонецЕсли;
		СтрокаНабора=СтрокаНабора+Символ;
	КонецЦикла;
КонецФункции	

&НаСервере
Процедура ПолучитьСтруктуруСтроки(ТаблицаОбъектов=Неопределено,СтрокаРеквизита,Родитель="",ТипРодителя=2,Позиция=1);
	Если ТаблицаОбъектов=Неопределено Тогда
		ТаблицаОБъектов=Новый ТаблицаЗначений;
		ТаблицаОбъектов.Колонки.Добавить("Имя",Новый ОписаниеТипов("Строка"));
		ТаблицаОбъектов.Колонки.Добавить("ТипОбъекта",Новый ОписаниеТипов("Число"));//0-объект,1-массив,2-прочий;
		ТаблицаОбъектов.Колонки.Добавить("ПозицияВСтроке",Новый ОписаниеТипов("Число")); //позиция в строкеJSON
		ТаблицаОбъектов.Колонки.Добавить("Вес",Новый ОписаниеТипов("Число")); //длина объекта
		ТаблицаОбъектов.Колонки.Добавить("Родитель",Новый ОписаниеТипов("Строка"));//имя родителя
		ТаблицаОбъектов.Колонки.Добавить("Состав",Новый ОписаниеТипов("Строка"));//текстовое содержание объекта
	КонецЕсли;
	ОбъектНайден=0;
	ЭтоИмя=Ложь;
	СтрокаОбъекта=Неопределено;
	СчитаемВеса=Ложь;
	ИмяРеквизита="";
	Вес=0;
	Для к=1 По СтрДлина(СтрокаРеквизита) Цикл
		Символ=Сред(СтрокаРеквизита,к,1);
		ВторойСимвол=Сред(СтрокаРеквизита,к+1,1);
		Если Символ="\" Тогда     //для спецсимволов (их пропускаем, нормализовать текст можно потом)
			к=к+1;
			Если СчитаемВеса ТОгда
				Вес=Вес+2;
			КонецЕсли;	
			Продолжить;
		Конецесли;	
		Если СчитаемВеса ТОгда
			Если Найти(""",]}",Символ)=0 Тогда
				Вес=Вес+1;
			Конецесли;
		КонецЕсли;	
		Если Найти(",]}",Символ)>0 Или к=СтрДлина(СтрокаРеквизита) Тогда
			Если СтрокаОбъекта<>Неопределено Тогда
				СтрокаОбъекта.Вес=Вес;
				СтрокаОбъекта.Состав=Сред(СтрокаРеквизита,СтрокаОбъекта.ПозицияВСтроке-Позиция+1,Вес); //для наглядности
			КонецЕсли;
			ЭтоИмя=Ложь;
			СчитаемВеса=Ложь;
			Вес=0;
			СтрокаОбъекта=Неопределено;
			ИмяРеквизита="";
			Продолжить;
		КонецЕсли;			
		
		Если Символ="""" и Не СчитаемВеса И ТипРодителя<>1 Тогда
			ЭтоИмя=Не ЭтоИмя;
		КонецеСли;	
			
		Если Не ЭтоИмя И Не СчитаемВеса И СтрокаОбъекта=Неопределено Тогда  //Имя реквизита нашли, инвертировали признак имени, создаем реквизит
			Вес=0;
			СтрокаОбъекта=ТаблицаОбъектов.Добавить();
			Если ИмяРеквизита="" Тогда
				ИмяРеквизита=Строка(Новый УникальныйИдентификатор);
			Конецесли;	
			СтрокаОбъекта.Имя=ИмяРеквизита;
			СтрокаОбъекта.Родитель=Родитель;
			СтрокаОбъекта.ТипОбъекта=2;
			ИмяРеквизита="";
		ИначеЕсли ЭтоИмя и Не СчитаемВеса Тогда
			Если Символ<>"""" Тогда
				ИмяРеквизита=ИмяРеквизита+Символ;
			Конецесли;
		КонецЕсли;	
		
		Если Символ=":" Или (ТипРодителя=1 и Символ="""") Тогда
			СчитаемВеса=Истина;
			Если СтрокаОбъекта<>Неопределено Тогда
				Если ВторойСимвол="""" Тогда
					СтрокаОбъекта.ПозицияВстроке=Позиция+к+1;
				Иначе	
					СтрокаОбъекта.ПозицияВстроке=Позиция+к;
				Конецесли;
			КонецЕсли;	
		КонецЕсли;		
		
		Если Символ="{" Тогда      //обрабатываем вложенные объекты
			ВложеннаяСтрока=ВернутьСтрокуОбъекта("{","}",Прав(СтрокаРеквизита,СтрДлина(СтрокаРеквизита)-к+1));
			Если СтрокаОбъекта<>Неопределено Тогда
				СтрокаОбъекта.ПозицияВстроке=Позиция+к;
				СтрокаОбъекта.Состав=ВложеннаяСтрока;
				СтрокаОбъекта.ТипОбъекта=0;
				СтрокаОбъекта.Вес=СтрДлина(ВложеннаяСтрока);
				ПолучитьСтруктуруСтроки(ТаблицаОбъектов,ВложеннаяСтрока,СтрокаОбъекта.Имя,0,СтрокаОбъекта.ПозицияВстроке);
				СчитаемВеса=Ложь;
				СтрокаОбъекта=Неопределено;
				Вес=0;
			Иначе
				ПолучитьСтруктуруСтроки(ТаблицаОбъектов,ВложеннаяСтрока,,Позиция+к);
			КонецЕсли;	
			к=к+СтрДлина(ВложеннаяСтрока)+1;
		КонецЕсли;	
		
		Если Символ="[" Тогда  //обрабатываем вложенные массивы
			ВложеннаяСтрока=ВернутьСтрокуОбъекта("[","]",Прав(СтрокаРеквизита,СтрДлина(СтрокаРеквизита)-к+1));
			Если СтрокаОбъекта<>Неопределено Тогда
				СтрокаОбъекта.ПозицияВстроке=Позиция+к;
				СтрокаОбъекта.Состав=ВложеннаяСтрока;
				СтрокаОбъекта.ТипОбъекта=1;
				СтрокаОбъекта.Вес=СтрДлина(ВложеннаяСтрока);
				ПолучитьСтруктуруСтроки(ТаблицаОбъектов,ВложеннаяСтрока,СтрокаОбъекта.Имя,1,СтрокаОбъекта.ПозицияВстроке);
				СчитаемВеса=Ложь;
				СтрокаОбъекта=Неопределено;
				Вес=0;
			Иначе	
				ПолучитьСтруктуруСтроки(ТаблицаОбъектов,ВложеннаяСтрока,,Позиция+к);
			КонецЕсли;
			к=к+СтрДлина(ВложеннаяСтрока)+1;
		КонецЕсли;			
	КонецЦикла;	
КонецПроцедуры	

Использование: Вызываем процедуру

ПолучитьСтруктуруСтроки(ТаблицаОбъектов,СтрокаJSON);



ТаблицаОбъектов-  пустая таблица значений в которую выгружаются объекты парсинга.

СтрокаJSON - строка, которую парсим.

После отработки процедуры таблица будет заполнена объектами строки json.

По значениям колонок "ПозицияВстроке" и "Вес" можно получить значение объекта из строки JSON

сред(СтрокаJSON,СтрокаТаблицы.ПозицияВстроке,СтрокаТаблицы.Вес)

 или взять его же из колонки "Состав". Для объектов и массивов в "Состав" записывается строковое значение лежащее между скобками {} для объекта или [] для массива, со всеми внутренними вложениями.

 

 

JSON parser

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2664    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4595    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3956    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8802    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16140    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

109
Оставьте свое сообщение