Версия технологической платформы 8.3.6 принесла с собой встроенные объекты для работы с JSON, таки образом моя прошлая статья более не является актуальной, но все еще может пригодиться, если у Вас нет возможности использовать новые версии технологической платформы.
В этой статье будет рассмотрена работа с JSON в 1С стандартными средствами.
Напомню, что JSON — это популярный текстовый формат обмена данными. Несмотря на свое происхождения от JavaScript, JSON считается независимым форматом и может использоваться с практически любым языком программирования.
JSON — это достаточно лаконичный формат, что выгодно отличает его от того же XML.
Для начала приведу небольшую теоретическую выдержку с портала ИТС.
Формат JSON является универсальным способом представления при обмене данными. Данные в формате JSON представляют собой (в закодированном виде):
- Объект – неупорядоченное множество пар ключ:значение, заключенный в фигурные скобки ({}). Пары ключ:значение разделяются запятыми (,);
- Массив – множество значений. Массив заключается в квадратные скобки ([]). Значения разделяются запятыми (,);
- Значение – может быть строкой, числом, объектом, массивов или литералом true, false, null:
- Строка – набор символов, заключенный в двойные кавычки («»);
- Число – сериализуется с разделителем точка (.). Точность числа не ограничена.
Таким образом, с помощью вышеперечисленных элементов допускается описание объектов любой сложности для представления в формате JSON.
Для начала рассмотрим запись в JSON. Запишем простую структуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("C:\test.json"); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 100); тДанные.Вставить("СтрокаJSON", "test"); тДанные.Вставить("ДатаJSON", Дата(2016, 1, 15)); тНастройкиСериализации = Новый НастройкиСериализацииJSON; тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; //"ДатаJSON": "2016-03-15T14:19:48" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.JavaScript; "ДатаJSON": "new Date(1452805200000)" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.Microsoft; "ДатаJSON": "/Date(1452805200000)/" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата; "ДатаJSON": "2016-01-15T00:00:00" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением; "ДатаJSON": "2016-01-15T00:00:00+03:00" тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата; //"ДатаJSON": "2016-01-14T21:00:00Z" ЗаписатьJSON(тЗапись, тДанные, тНастройкиСериализации); тЗапись.Закрыть(); КонецПроцедуры |
Представление дат определяется двумя свойствами объекта «НастройкиСериализацииJSON» и соответствующими системными перечислениями «ФорматДатыJSON» и «ВариантЗаписиДатыJSON».
При этом формат даты «JavaScript» и «Microsoft» можно указать, только если вариант записи даты — универсальная дата, иначе при записи возникнет ошибка:
Далеко не все типы данных системы 1С являются JSON-сериализуемыми, решить эту проблему можно при помощи т.н. функции преобразования (отмеченной ключевым словом «Экспорт»). При этом формат сериализации нужно будет прописать в ручную, пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("C:\test.json"); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 100); тДанные.Вставить("СтрокаJSON", "test"); тДанные.Вставить("ДатаJSON", Дата(2016, 1, 15)); тДанные.Вставить("uidJSON", Новый УникальныйИдентификатор); ЗаписатьJSON(тЗапись, тДанные, Новый НастройкиСериализацииJSON, "ФункцияПреобразования", ЭтотОбъект); тЗапись.Закрыть(); КонецПроцедуры &НаКлиенте Функция ФункцияПреобразования(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт Если ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда Возврат Строка(Значение); КонецЕсли; Отказ = Истина; КонецФункции |
Часто бывает, что у нас нет готового объекта для записи, а есть некие данные, которые нуждаются в какой-то предварительной обработке (например выборка запроса), чтобы не формировать промежуточный объект, можно воспользоваться потоковой записью:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); тЗапись = Новый ЗаписьJSON; тЗапись.ПроверятьСтруктуру = Истина; тЗапись.ОткрытьФайл("C:\test.json", , , тПараметрыJSON); тЗапись.ЗаписатьНачалоОбъекта(); тЗапись.ЗаписатьИмяСвойства("ЧислоJSON"); тЗапись.ЗаписатьЗначение(100); тЗапись.ЗаписатьИмяСвойства("СтрокаJSON"); тЗапись.ЗаписатьЗначение("test"); тЗапись.ЗаписатьИмяСвойства("МассивJSON"); тЗапись.ЗаписатьНачалоМассива(); тЗапись.ЗаписатьЗначение(1); тЗапись.ЗаписатьЗначение(2); тЗапись.ЗаписатьКонецМассива(); тЗапись.ЗаписатьКонецОбъекта(); тЗапись.Закрыть(); КонецПроцедуры |
В коде выше используется объект «ПараметрыЗаписиJSON» с помощью которого можно указать вид переноса строк, символ отступа, использование двойных кавычек, а так же необходимость экранирования различных символов.
При формировании документа JSON можно совмещать объектную и потоковую запись.
Теперь перейдем к чтению JSON, самый простой вариант:
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь); тДатаJSON = ПрочитатьДатуJSON(тДанные.ДатаJSON, ФорматДатыJSON.ISO); тЧтение.Закрыть(); КонецПроцедуры |
В примере выше отдельно показано преобразование даты JSON в дату 1С.
Также как и для записи, для чтения существует вариант с т.н. функцией восстановления:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь, , , "ФункцияВосстановления", ЭтотОбъект); тЧтение.Закрыть(); КонецПроцедуры &НаКлиенте Функция ФункцияВосстановления(Свойство, Значение, ДополнительныеПараметры) Экспорт Если Свойство = "ДатаJSON"Тогда Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO); КонецЕсли; Если Свойство = "СтрокаJSON" Тогда Возврат СокрЛП(Значение); КонецЕсли; Если Свойство = "uidJSON" Тогда Возврат Новый УникальныйИдентификатор(Значение); КонецЕсли; КонецФункции |
Результат практически тот же самый, но «ДатаJSON» и «uidJSON» приведены к типам 1С.
Так же как и для записи, для чтения JSON можно применить потоковый вариант — он особенно полезен, когда объем JSON-данных велик (не загружает эти данные в память), а искомое значение находится в начале файла.
Простой вариант потокового чтения выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); Пока тЧтение.Прочитать() Цикл Сообщить("Тип текущего элемента " + тЧтение.ТипТекущегоЗначения); Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда Сообщить("Имя = " + тЧтение.ТекущееЗначение); КонецЕсли; Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда Сообщить("Значение = " + тЧтение.ТекущееЗначение); КонецЕсли; КонецЦикла; тЧтение.Закрыть(); КонецПроцедуры |
На этом все, надеюсь эта статья Вам помогла.
Загрузка...
Первая дельная статья на эту тему. Супер!
Очень полезная публикация!!!
Никак не описана передача дробного числа со значением после запятой, вот где главная засада.
Так дробные числа передаются без проблем, в крайнем случае можно преобразовывать в строку через Формат, или еще как вариант через кратность, например 3.456 * 1000, зная кратность, можно выполнить обратное преобразование 3456 / 1000, таким образом дробные числа превращаются в целые.
В примере чтения даты дата представлена строкой, а если дата представлена числом, например 1506550142409, как это чтение преобразовать в тип Дата?
Вот нашел решение:
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON,,, ФорматДатыJSON.JavaScript);
Дата =ПрочитатьДатуJSON(«new Date(» + Формат(СтруктураОтвета.date, «ЧГ=») + «)», ФорматДатыJSON.JavaScript);
А если чтение json выполняется на стороне сервере, то как передать модуль востановления значений?
Чтение.ОткрытьФайл(«C:\test.json»);
А на диск С с дискетки его копировать?
Было бы здорово увидеть пример обработки json файла полученного через веб-запрос