Часто на практике программисты 1с сталкиваются с необходимость обработки данных полученных из другой учетной системы (например с сайта) в формате json. Появляется задача преобразования json в 1с.
К сожалению типовой функционал 1с не позволяет получить json в удобном формате для дальнейшей его обработки.
Вот пример кода, который позволит быстро преобразовать любой текст json в 1с (массив / структуру) и далее им оперировать в коде.
*Просьба обратить внимание на преобразование даты или других типов. Дело в том, что не всегда типовая функция чтения json Прочитать() возвращает данные/значения, с указанием их типов.
Частный случай: скорее всего вам необходимо будет внести правки на определение даты по имени свойства (в нашем случае мы ищем в имени свойства строку “date”: Найти(нрег(ИмяСвойства), “date”)>0) .
А так же описать преобразование даты (другого типа) в значение правильного типа. Если это не выполнить, тогда в значение будет помещено значение типа строка.
Параметры:
_Строка -двоичные данные json или строка json (обязательный)
_Представление – строка json, представление данных, которые преобразовываем (не обязательный)
Функция JSON_ПреобразоватьВСтруктуру(_Строка, _Представление="") Экспорт ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); Если ТипЗнч(_Строка) = Тип("Строка") Тогда Запись = Новый ЗаписьТекста(ИмяВременногоФайла); Запись.Записать(_Строка); Запись.Закрыть(); Иначе _Строка.Записать(ИмяВременногоФайла); КонецЕсли; ЧтениеJSON = Новый ЧтениеJSON(); ЧтениеJSON.ОткрытьФайл(ИмяВременногоФайла); СериалОБъектJSON = Неопределено; ТекущийСериалОбъектJSON = Неопределено; СимволКавычки=""""; ИмяСвойства=""; спОткрытыеОбъекты = Новый СписокЗначений; Попытка Пока ЧтениеJSON.Прочитать() Цикл Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоМассива Тогда ТипОбъекта = ?(ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта, "Структура", "Массив"); Если СериалОБъектJSON = Неопределено Тогда СериалОБъектJSON = Вычислить("Новый "+ТипОбъекта); ТекущийСериалОбъектJSON = СериалОБъектJSON; Иначе Если ТипЗнч(ТекущийСериалОбъектJSON) = Тип("Массив") Тогда Выполнить("ТекущийСериалОбъектJSON.Добавить(Новый "+ТипОбъекта+")"); //добавляем новую структуру / массив ТекущийСериалОбъектJSON = Вычислить("ТекущийСериалОбъектJSON.Получить(ТекущийСериалОбъектJSON.Количество()-1)"); Иначе Выполнить("ТекущийСериалОбъектJSON.Вставить("+СимволКавычки+ИмяСвойства+СимволКавычки+", Новый "+ТипОбъекта+")"); //добавляем новую структуру / массив ТекущийСериалОбъектJSON = Вычислить("ТекущийСериалОбъектJSON."+ИмяСвойства); КонецЕсли; КонецЕсли; спОткрытыеОбъекты.Добавить(Новый Структура("ТекущийСериалОбъектJSON", ТекущийСериалОбъектJSON)); ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецОбъекта или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецМассива Тогда спОткрытыеОбъекты.Удалить(спОткрытыеОбъекты.Получить(спОткрытыеОбъекты.Количество()-1)); Попытка ТекущийСериалОбъектJSON = спОткрытыеОбъекты.Получить(спОткрытыеОбъекты.Количество()-1).Значение.ТекущийСериалОбъектJSON; Исключение //дошли до конца КонецПопытки; ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда ИмяСвойства = ЧтениеJSON.ТекущееЗначение; ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Null или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Булево ИЛИ ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Число Тогда ТекущееЗначение = ЧтениеJSON.ТекущееЗначение; Если Найти(нрег(ИмяСвойства), "date")>0 Тогда Если ЧтениеJSON.ТекущееЗначение="" Тогда ТекущееЗначение = Дата(1,1,1); Иначе Попытка ТекущееЗначение = Дата(Лев(ТекущееЗначение,4), Сред(ТекущееЗначение,6,2), Сред(ТекущееЗначение,9,2), Сред(ТекущееЗначение,12,2),Сред(ТекущееЗначение,15,2),0); Исключение //прописать преобразования в дату в ненайденном формате КонецПопытки; КонецЕсли; КонецЕсли; Если ТипЗнч(ТекущийСериалОбъектJSON) = Тип("Массив") Тогда ТекущийСериалОбъектJSON.добавить(ТекущееЗначение); ИначеЕсли ИмяСвойства<>"" Тогда ТекущийСериалОбъектJSON.Вставить(ИмяСвойства, ТекущееЗначение); КонецЕсли; Иначе ИмяТекущегоЗначения = ""; КонецЕсли; КонецЦикла; Исключение Сообщить(""+ОписаниеОшибки()+Символы.пс+"Строка json не преобразована: "+_Представление); Возврат Новый Массив(); КонецПопытки; Возврат СериалОБъектJSON КонецФункции
Спасибо огромное!
Была рада помочь вам)
ПрочитатьJSON – стандартная функция 1с
Данная процедура писалась тогда, когда еще не было стандартной функции. Да и сейчас еще люди используют платформы, где ее нет.