Имя: Пароль:
1C
 
Json в структуру без ЧтениеJSON
0 Bibr
 
20.02.25
16:27
8.2, поднимать релиз не судьба, ЧтениеJSON нету
может есть у кого под рукой функция, которая ручками разбирает json в структуру?
Попробовал разные Ии-шки - все выдали умный, но нерабочий текст.
1 asady
 
20.02.25
16:36
(0) поиском научись пользоваться и пользуйся

https://chel1c.ru/from_json_to_1c/?ysclid=m7ddu5g4yc140428768
2 DiMel_77
 
20.02.25
16:37
(0) В старые добрые времена до выхода 8.3.6 где реализовали работу с Json люди пользовались https://infostart.ru/1c/tools/119601/
3 NikeArz
 
20.02.25
16:59
ЗаполнитьДанныеИзОтвета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 = СокрЛП(Сред(Текст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)));
					КонецЕсли;
					
					Значение = СокрЛП(Значение);
				КонецЕсли;
				
				Результат.Вставить(ИмяЗначения, Значение);
			ИначеЕсли ТипДанных = "Массив" Тогда
				Поз = 0;
				Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
					Символ = Сред(ТекстJSON, Сч, 1);
					Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
						Поз = Сч;
						Прервать;
					КонецЕсли;
				КонецЦикла;
				
				Если Поз = 0 Тогда
					Значение = ТекстJSON;
					ТекстJSON = "";
				Иначе
					Значение = Лев(ТекстJSON, Поз-1);
					ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
				КонецЕсли;
				
				Значение = СокрЛП(Значение);
				
				Результат.Добавить(Значение);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
	
	Результат = Новый Структура;
	
	ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");
	ТекстJSON = СтрЗаменить(ТекстJSON, """", "");	
	Если Лев(ТекстJSON, 1) = "{" Тогда
		ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
	ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
		МассивДанных = Новый Массив;
		ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
		
		Результат.Вставить("Значение", МассивДанных);
	КонецЕсли;
		
	Возврат Результат;
	
КонецФункции
4 Галахад
 
гуру
20.02.25
16:42
(2) Он же на гите https://github.com/legionwfz/1C-JSON
5 Bibr
 
20.02.25
16:45
Спасибо всем!

(1) а научи.
я вот гуглил по "1с json в структуру" и твоя ссылка только в конце 4й страницы. Для интереса ввёл в поисковик прям заголовок страницы "Импорт из JSON в 1С". И твоя ссылка только на второй странице. Что я делаю не так?
6 Галахад
 
гуру
20.02.25
16:51
(5) Парсер же.
7 asady
 
20.02.25
16:55
(5) у меня на 2-й странице но самая верхняя
8 Bibr
 
20.02.25
16:58
(7) ага, я про то же. по идеально точному запросу только вторая страница
9 Bibr
 
20.02.25
17:04
(1)(2)
кстати тоже не идеал, надо допиливать.
функция предварительно грохает в json все кавычки и потом работает через запятые. в результате если есть значения формата "names":"Вася, Петя",- падает с ошибкой, т.к. удаляет кавычки и потом считает, что значение поля "Вася"