Данная публикация предназначена разработчикам 1С, которым приходиться разбирать данные формата JSON. Выложенный пример кода создает объект типа Структура, полностью повторяющий структуру данных формата JSON.
Всех приветствую!
Прилагаю несколько функций, которые могут пригодиться другим разработчикам 1С для разбора JSON-объектов и конвертации их в соответствующие структуры:
1. Создаем объект ЧтениеJSON на основе текста объекта:
Функция фПрочитатьJSON(ТекстJSON) Экспорт
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Структура = ЗаполнитьСтруктуруИзОтветаJSON(Чтение);
Чтение.Закрыть();
Возврат Структура;
КонецФункции
2. Рекурсивная процедура для возврата объекта типа Структура
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач Чтение) Экспорт
Результат = Новый Структура;
ПоследнееИмяРеквизита = Неопределено;
Пока Чтение.Прочитать() Цикл
Тип = Чтение.ТипТекущегоЗначения;
Если Тип = ТипЗначенияJSON.НачалоОбъекта И ПоследнееИмяРеквизита<>Неопределено Тогда
Результат[ПоследнееИмяРеквизита] = ЗаполнитьСтруктуруИзОтветаJSON(Чтение);
ИначеЕсли Тип = ТипЗначенияJSON.КонецОбъекта Тогда
Возврат Результат;
ПоследнееИмяРеквизита = Неопределено;
ИначеЕсли Тип = ТипЗначенияJSON.ИмяСвойства Тогда
Результат.Вставить(Чтение.ТекущееЗначение, Неопределено);
ПоследнееИмяРеквизита = Чтение.ТекущееЗначение;
ИначеЕсли Тип = ТипЗначенияJSON.Булево или Тип = ТипЗначенияJSON.Строка
или Тип = ТипЗначенияJSON.Число или Тип = ТипЗначенияJSON.Null Тогда
Результат[ПоследнееИмяРеквизита] = Чтение.ТекущееЗначение;
ИначеЕсли Тип = ТипЗначенияJSON.НачалоМассива Тогда
Результат[ПоследнееИмяРеквизита] = ЗаполнитьМассивИзОтветаJSON(Чтение);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
3. В случае использования массивов в JSON-объекте используем третью процедуру
Функция ЗаполнитьМассивИзОтветаJSON(Знач Чтение)
Результат = Новый Массив;
Пока Чтение.Прочитать() Цикл
Тип = Чтение.ТипТекущегоЗначения;
Если Тип = ТипЗначенияJSON.НачалоОбъекта Тогда
Результат.Добавить(ЗаполнитьСтруктуруИзОтветаJSON(Чтение));
ИначеЕсли Тип = ТипЗначенияJSON.КонецМассива Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Вот и все! Всем хорошего времени суток!
В чем отличие от платформенной ?
Глобальный контекст (Global context)
ПрочитатьJSON (ReadJSON)
Синтаксис:
ПрочитатьJSON(<ЧтениеJSON>, <ПрочитатьВСоответствие>, <ИменаСвойствСоЗначениямиДата>, <ОжидаемыйФорматДаты>, <ИмяФункцииВосстановления>, <МодульФункцииВосстановления>, <ДополнительныеПараметрыФункцииВосстановления>, <ИменаСвойствДляОбработкиВосстановления>, <МаксимальнаяВложенность>)
Примечание:
Массив будет десериализован в массив. Объект JSON будет преобразован в соответствие или структуру (если ключ структуры окажется недопустимым, будет вызвано исключение).
Для дат действует аналогично методу ПрочитатьДатуJSON.
Во время выполнения метода может быть вызвана пользовательская функция для восстановления значения — для этого следует использовать параметр <ИмяФункцииВосстановления>. Функция восстановления должна быть описана с директивой &НаСервере или &НаКлиенте. Использование функции вне контекста не допускается.
(1) в том, что автор не читает СП
И, что даже такой кусочек прочтёт?
Показать
Пример использования «ПрочитатьJSON»:
Или
(3) Прочитает в соответствие.
Но такой «кусочек» вышеописанная функция не прочитает.
Только я один вытаращил глаза? А как же штатная ПрочитатьJSON? Читает всё, что хочешь, было бы что читать.
(3)
Не прочитает, само собой.
Да и опубликованная обработка не прочитает.
Ошибка будет:
И это не ошибка JSON — приведенные примеры валидны.
Это ограничения типа «структура»:
Элементы коллекции:
КлючИЗначение
Описание:
Представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.
Может это для 8.2 ? Там встроенных средств не было..
(8) Для 8.2 было и естьвот это ))
Вот такой код разбирает JSON любой вложенности
Показать
Но имена ключей все-таки лучше с символов начинать
РаботаВМоделиСервисаБТС.СтруктураИзСтрокиJSON
стандартный метод ПрочитатьJSON позволяет прочитать и в структуру и в соответствие.