11.07.19 — 16:38
Продолжение эпопеи
Получил json, пробую читать
ПрочитатьJSON(Чтение, Истина);
получаю «Недопустимое состояние потока записи JSON»
так понимаю, такой файл только как текст парсить?
есть примеры таких парсеров?
1 — 11.07.19 — 16:39
сначала проверь, что именно json получил
2 — 11.07.19 — 16:41
3 — 11.07.19 — 16:41
проверь корректность
https://jsonlint.com
4 — 11.07.19 — 16:42
5 — 11.07.19 — 16:44
Ошибка «Недопустимое состояние потока записи JSON» 1С 8.3
Указанная в заголовке ошибка возникает, в момент вызова метода ПрочитатьJSON, если ранее параметр типа ЧтениеJSON, был инициализирован пустой строкой.
6 — 11.07.19 — 16:44
сейчас проверю
(1) в ответ тип json приходит
7 — 11.07.19 — 16:44
(5) о как, тоже проверю
8 — 11.07.19 — 16:48
Над простейшей задачкой которая решается спецом за пару часов возиться несколько дней?
9 — 11.07.19 — 16:49
(8) Так то спецом решается… А тут очевидно, что учётку угнали…
10 — 11.07.19 — 16:49
(8) ))) я же первый раз в таком болоте
и занимаюсь ей не все время, так только — по возможности
не ругайся )
11 — 11.07.19 — 16:50
(9) я тебя тоже люблю, тебя все любят )))
12 — 11.07.19 — 16:52
(5) не, чтение вроде не с пустой строкой, Прочитать() у него истина
13 — 11.07.19 — 16:53
(12) Ты сказал свежему чтению прочитать, а потом делаешь ПрочитатьJSON()? Ну и кто тебе после этого доктор?
14 — 11.07.19 — 16:58
Посмотри отладчиком, что тебе в том json пришло, у меня было подобное, когда сервер вместо json какую то ошибку выплевывал и кракозыбры
15 — 11.07.19 — 16:59
(13) ты как всегда в корень попал )))
16 — 11.07.19 — 16:59
(14) ошибки то я отлавливаю
17 — 11.07.19 — 16:59
всем спасибо, получилось ))
18 — 11.07.19 — 17:00
(16) Дык я сегодня целы день с ним вожусь… 36метровые ответы разбираю )))
19 — 11.07.19 — 17:02
(18) у меня поменьше, всего 750 Кб )
20 — 11.07.19 — 18:28
отчего могут теряться «теги» при чтении?
читаю в соответствие, «строки» — массив соответствий в одном из ключей
в каждое из массива захожу и не нахожу первых двух «тегов», которые присутствуют в файле
куда теряются?
также непонятно — какой «тег» я считываю, результат Соответствие, а как он «зовется» — нет информации
21 — 11.07.19 — 18:30
пример:
22 — 11.07.19 — 18:30
«results»:[ — массив соответствий
{
«StringsRes»:[ — это отдельное соответствие, что это «StringsRes» информации нет
{
«id»:»b8954aa7-64ac-43f7-80d4-0daa92aca109″, — нет этого тега
«seals»:[ — нет этой коллекции
],
«internalId»:»00ddc2d2-b6bb-4a7f-a96c-cf17d5389c8f», -это и далее есть
23 — 11.07.19 — 21:32
вечерний подъем
24 — 11.07.19 — 21:59
нашел потерю )) слишком много свойств, потерялось среди них
ПростоГен
25 — 12.07.19 — 06:02
Ну зачем так мучиться, есть же готовая библиотека http://catalog.mista.ru/public/709325/, там всё это реализовано.
получаю ответ на запрос.
Ответ приходит в виде Json
так вот при выполнении кода:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
Ответ=ПрочитатьJSON(ЧтениеJSON);
Выдет ошибку:
<ВнешняяОбработка.ЭкспериментыJSON.Форма.Форма.Форма(67)>: Ошибка при вызове метода контекста (ПрочитатьJSON)
Ответ=ПрочитатьJSON(ЧтениеJSON);
по причине:
Недопустимое имя свойства: ‘800’ для чтения JSON в объект Структура
Подскажите как быть?
Формат ваших данных не соответствует стандарту JSON. Ключ должен быть строкой и 1с тут ни при чем.
Далее в стандарте (стр. 2) спецификация объекта JSON:
Глобальный контекст.ПрочитатьJSON (Global context.ReadJSON)
Глобальный контекст (Global context)
ПрочитатьJSON (ReadJSON)
Синтаксис:
Тут вот какая «петрушка». Получается как с программами переводчиками: переводишь слово на английский, и тут же полученное значение пытаешься перевести обратно на русский и получаешь совершенно другой результат.
Выгружаю пакет XDTO в JSON и пытаюсь его тут же прочитать в структуру и появляется ошибка «недопустимое имя свойства #value». Я понимаю, что это означает и, в результате, вынужден «читать» JSON в соответствие, но вот правильно ли это?
Запись пакета XDTO в JSON:
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру=Истина;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Unix);
Запись.УстановитьСтроку(ПараметрыЗаписи);
ФабрикаXDTO.ЗаписатьJSON(Запись, МойОбъектXDTO);
ДанныеJSON = Запись.Закрыть();
И ту же пытаюсь прочитать его в структуру
обЧтениеJSON = Новый ЧтениеJSON;
обЧтениеJSON.УстановитьСтроку(ДанныеJSON );
стСтруктураСхемы = ПрочитатьJSON(обЧтениеJSON);
и тут же получаем сообщение об ошибке «недопустимое имя свойства #value». Ну, все, поворчал, пошел работать дальше.
Источник
не могу прочитать json 🙁
HTTP ответ нужно прочитать в структуру. Код состояния 200, все норм.
На ПрочитатьJSON(ЧтениеJSON) Ошибка при вызове метода контекста (ПрочитатьJSON). Что не так не пойму. перечитала синтакс помощник раз 10 уже, даже если пустую строку «<>» дать, то ошибка контекста. Вызывается в общем модуле с галками клиент, сервер, внешнее соединение.
//Разбираем ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Попытка
РезультатСоответствие = ПрочитатьJSON(ЧтениеJSON);
Исключение
Сообщить(«1»);
КонецПопытки;
В СтрJSON получается
<
Параметры:
(обязательный)
Тип: ЧтениеJSON.
Тип: Булево.
Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие.
Если установлено Ложь, объекты будут считываться в объект типа Структура.
(17) что-то туплю.. а как записать HTTPОтвет в файл?
(21) все равно валится с Недопустимое состояние потока записи JSON. видимо в строке серьезные косяки для 1с
(28) какая-то странная фигня происходит..
в общем если поставить одну точку останова на Сообщить(«5 все ок») или Сообщить(«5») то до нее доходит без ошибок, читает в соответствие, и ссылки со слешами верно читает, только дата в виде строки в итоге «2020-05-14T09:34:23+03:00»
в структуру не читает, т.к. есть такое вот в строке «. «edit.originator»:true. » ну а в структуре нельзя точку в заголовок, ок, допустим, пусть соответствие.
но если поставить точку останова где-то до попытки и идти пошагово, то вываливается на ПрочитатьJSON в исключение.
Источник
Заметки из Зазеркалья
Реализовано в версии 8.3.6.1977.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
Мы видим несколько основных сценариев использования JSON.
Во-первых, это интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т.д.
Во-вторых, это организация собственного HTTP интерфейса прикладного решения.
В-третьих, обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами.
В-четвертых, это использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.
Потоковое чтение и запись 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() вы можете использовать параметр НастройкиСериализации. Это объект встроенного языка, который позволяет указать, в каком варианте будет записана дата (UTC, локальная дата или локальная дата со смещением) и в каком формате (ISO, JavaScript или Microsoft).
При чтении даты из JSON всё обстоит сложнее. В параметре ИменаСвойствСоЗначениямиДата вы можете перечислить те свойства JSON, значения которых нужно преобразовать в дату 1С:Предприятия (тип Дата). А в параметре ОжидаемыйФорматДаты вам нужно указать, в каком формате эти данные содержатся в JSON (ISO, JavaScript или Microsoft).
Однако если окажется, что в какой-то момент формат данных JSON не совпадает с ожидаемым форматом, будет вызвано исключение.
Использование JSON в HTTP интерфейсах приложений
Автоматически генерируемый REST интерфейс прикладных решений
Детальность представления метаданных вы можете указать, например, в адресной строке.
Сведения о метаданных не передаются:
Вся информация о метаданных включается в выгрузку:
HTTP-сервисы прикладного решения
HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. Для этого вам проще всего сформировать тело ответа в JSON, получить его как строку, а затем установить из этой строки тело HTTP ответа сервиса. При этом желательно указать, что BOM (Byte Order Mark, метка порядка байтов) использоваться не должна.
Последний параметр (ИспользованиеByteOrderMark.НеИспользовать) вы можете и не указывать, если режим совместимости конфигурации не установлен, или он больше чем Версия8_3_5. Потому что в этом случае BOM автоматически будет использоваться только для кодировок UTF-16 и UTF-32, а для UTF-8, UTF-16LE/UTF-16BE, UTF-32LE/UTF-32BE и других она использоваться не будет.
Взаимодействие со сторонними HTTP сервисами
При взаимодействии со сторонними HTTP интерфейсами у вас также может возникнуть необходимость формирования запросов к ним в формате JSON. В этом случае алгоритм ваших действий будет аналогичным. Формируете тело запроса в JSON. Получаете тело в виде строки. Из этой строки устанавливаете тело HTTP запроса. BOM не используете.
Дальнейшее развитие
Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.
Источник
Ошибка выгрузки документов В JSON.
В общем задача: Есть список документов поступление на РС, которые надо выгрузить в JSON, но не получается.
ЗаписиJSON = Новый ЗаписьJSON;
ЗаписиJSON.ОткрытьФайл(ИмяВременногоФайла. Новый ПараметрыЗаписиJSON(, Символы.Таб));
НастройкиСериал = Новый НастройкиСериализацииJSON;
НастройкиСериал.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
НастройкиСериал.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
Для Каждого СтрСписокДокументов Из СписокДокументов Цикл
Если Не СтрСписокДокументов.Обрабатывать Тогда
Продолжить;
КонецЕсли;
ЗаписиJSON.ЗаписатьНачалоОбъекта();
СтруктураДокумента = ПолучитьСтруктуру(СтрСписокДокументов.Ссылка);
ЗаписатьJSON(ЗаписиJSON, СтруктураДокумента, НастройкиСериал);
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СтрСписокДокументов.Ссылка.ПолучитьОбъект());
ЗаписиJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
СериализаторXDTO.ЗаписатьJSON(ЗаписиJSON, МассивОбъектов, НазначениеТипаXML.Неявное);
ЗаписиJSON.Закрыть();
Ошибка:
<ВнешняяОбработка.ВыгрузкаДокументовНаСайт.Форма.Форма.Форма(298)>: Ошибка при вызове метода контекста (ЗаписатьJSON)
ЗаписатьJSON(ЗаписиJSON, СтруктураДокумента, НастройкиСериал);
по причине:
Неверный порядок записи JSON
по причине:
Неверный порядок записи JSON
И да, получаю Структуру Так:
Функция ПолучитьСтруктуру(знач Объект)
Структура = Новый Структура(); /// реквизиты
Для каждого Реквизит из Объект.Метаданные().СтандартныеРеквизиты Цикл
Если ТипЗнч(Объект[Реквизит.Имя]) = тип(«Число») ИЛИ ТипЗнч(Объект[Реквизит.Имя]) = тип(«Дата») ИЛИ ТипЗнч(Объект[Реквизит.Имя]) = тип(«Булево») тогда
Структура.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]);
иначе
Структура.Вставить(Реквизит.Имя, Строка(Объект[Реквизит.Имя]));
КонецЕсли;
КонецЦикла;
ЗЫ. 15 секунд гугла, первая ссылка. ((
Источник
1С 8.3 : Обмен данными с сайтом используя формат JSON в 1С
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
В платформе с версии 8.3.6:
Потоковое чтение и запись JSON:
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
Результат такой записи:
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
Подробнее вы можете посмотреть здесь
В платформе с версии 8.3.7:
Прежде всего, и в основном, XDTO сериализацию в JSON мы рекомендуем использовать при обмене данными между двумя прикладными решениями 1С:Предприятия. По сравнению с XML формат JSON более компактный, сериализация/десериализация в/из JSON выполняется быстрее. Кроме этого мы предприняли дополнительные меры для того, чтобы сократить объём передаваемых данных.
Кроме обмена между приложениями 1С:Предприятия этот механизм можно использовать и для обмена с внешними системами, готовыми принимать типы данных 1С:Предприятия. Например, XDTO сериализацию в JSON можно использовать для организации собственного HTTP интерфейса прикладного решения. Сервис на платформе 1С:Предприятия будет формировать ответ в памяти в виде строки JSON. А затем передавать её при помощи объекта HTTPСервисОтвет. Реализованный нами механизм сериализации полностью соответствует стандарту JSON. Поэтому внешняя система не должна испытывать каких-либо трудностей с десериализацией.
Использование XDTO сериализации в JSON для других задач видится нам маловероятным. Потому что если внешняя система не готова работать с прикладными типами 1С:Предприятия, то зачем их ей передавать? А если предполагается обмениваться только примитивными типами и коллекциями, то для этой задачи хорошо подходят методы ПрочитатьJSON() и ЗаписатьJSON(). Подробнее здесь
ДО платформы версии 8.3.6, т.е. 8.3.5 и ниже:
На HelpF уже есть статья где описан пример: Работа с форматом JSON в 1С но не приведены функции, вот они:
Примеры их использования:
Пишите комменты
Источник
С помощью ApiStart получаю строку в формате json (тип строка), в итоге нужно преоброзовать в удобочитаемый видв 1с, как это сделать?
ОтветВСтруктуре1С = ПрочитатьJSON(jsontext,Истина) попробуй в соответствие прочитать
{Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьJSON) ОтветВСтруктуре1С = ПрочитатьJSON(jsontext,Истина); по причине: Несоответствие типов (параметр номер ‘1’)
что СП говорит по поводу типа параметра у ПрочитатьJSON?
Глобальный контекст (Global context) ПрочитатьJSON (ReadJSON) Синтаксис: ПрочитатьJSON(<ЧтениеJSON>, <ПрочитатьВСоответствие>, <ИменаСвойствСоЗначениямиДата>, <ОжидаемыйФорматДаты>, <ИмяФункцииВосстановления>, <МодульФункцииВосстановления>, <ДополнительныеПараметрыФункцииВосстановления>, <ИменаСвойствДляОбработкиВосстановления>, <МаксимальнаяВложенность>) Параметры: Тип: ЧтениеJSON. Объект чтения JSON. Тип: Булево. Если установлено Истина, чтение объекта JSON будет выполнено в Соответствие. Если установлено Ложь, объекты будут считываться в объект типа Структура. Примечание. При десериализации объектов JSON в структуру необходимо помнить о требованиях к ключам структуры. Если при десериализации объекта будет найдено имя свойства, недопустимое для ключа структуры, то будет вызвано исключение. Значение по умолчанию: Ложь. <ИменаСвойствСоЗначениямиДата> (необязательный) Тип: Массив, Строка, ФиксированныйМассив. Массив, элементы которого содержат имена свойств JSON, для которых нужно вызывать восстановление даты из строки. Если имя свойства указано в этом параметре и указано в параметре ИменаСвойствДляОбработкиВосстановления, то для таких свойств восстановление осуществляется в функции восстановления. Если восстановление даты из значения свойства невозможно, то будет сгенерировано исключение. Значение по умолчанию: Неопределено. <ОжидаемыйФорматДаты> (необязательный) Тип: ФорматДатыJSON. Ожидаемый формат даты при десериализации объекта в формате JSON. Если в результате десериализации значение не является строкой и имеет формат даты, отличный от ожидаемого, то будет вызвано исключение. Значение по умолчанию: ISO. <ИмяФункцииВосстановления> (необязательный) Тип: Строка. Данная функция вызывается при чтении каждого свойства и должна иметь следующие параметры: <Свойство> — значение типа Строка, указывается только при чтении объектов JSON, <Значение> — значение допустимого для сериализации типа, <ДополнительныеПараметры>. Возвращаемое значение — произвольного типа. Если данный параметр задан и не задан параметр МодульФункцииВосстановления, и наоборот, будет вызвано исключение. Если функция не установлена, то при вызове метода ПрочитатьJSON, параметр ИменаСвойствСоЗначениямиДата игнорируется. Значение по умолчанию: Неопределено. <МодульФункцииВосстановления> (необязательный) Тип: УправляемаяФорма; КомандаКомандногоИнтерфейса; ОбщийМодуль. Указывает модуль, процедура которого будет использована для восстановления значения. В зависимости от типа параметра будет вызван соответствующий метод: УправляемаяФорма — будет вызван метод модуля указанной управляемой формы. КомандаКомандногоИнтерфейса — будет вызван метод модуля команды командного интерфейса. ОбщийМодуль — будет вызван метод неглобального общего модуля. Значение по умолчанию: Неопределено. <ДополнительныеПараметрыФункцииВосстановления> (необязательный) Тип: Произвольный. Дополнительные параметры, которые будут переданы в функцию восстановления значений. Значение по умолчанию: Неопределено. <ИменаСвойствДляОбработкиВосстановления> (необязательный) Тип: Массив. Массив имен свойств JSON, для которых будет вызвана функция восстановления. Параметр игнорируется, если не установлен параметр ИмяФункцииВосстановления. Значение по умолчанию: Неопределено. <МаксимальнаяВложенность> (необязательный) Тип: Число. Максимальный уровень вложенности объекта JSON. При превышении уровня вложенности будет сгенерировано исключение. Значение по умолчанию: 500. Возвращаемое значение: Тип: Произвольный. Описание: Считывает значение из JSON-текста или файла. JSON-текст должен быть корректным. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, интеграция. Примечание: Массив будет десеарилизован в массив. Объект JSON будет преобразован в соответствие или структуру (если ключ структуры окажется недопустимым, будет вызвано исключение). Для дат действует аналогично методу ПрочитатьДатуJSON. Во время выполнения метода может быть вызвана пользовательская функция для восстановления значения — для этого следует использовать параметр ИмяФункцииВосстановления. Функция восстановления должна быть описана с директивой &НаСервере или &НаКлиенте. Использование функции вне контекста не допускается. ——————————————————————————— Методическая информация
1-й параметр должен быть ЧтениеJSON
Тип: ЧтениеJSON. Объект чтения JSON. как строке сказать что она JSON ? ))
Синтаксис: УстановитьСтроку(<СтрокаJSON>) Параметры: <СтрокаJSON> (обязательный) Тип: Строка. Строка, содержащая текст в формате JSON.
{Форма.Форма.Форма}: Ошибка при вызове метода контекста (ПрочитатьJSON) ОтветВСтруктуре1С = ПрочитатьJSON(ЧтениеJSON); по причине: Недопустимое состояние потока записи JSON
а нет все ок, спасибо большое
07.10.2014
Реализовано в версии 8.3.6.1977.
JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.
Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.
Мы видим несколько основных сценариев использования JSON.
Во-первых, это интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т.д.
Во-вторых, это организация собственного HTTP интерфейса прикладного решения.
В-третьих, обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами.
В-четвертых, это использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.
В платформе мы реализовали несколько слоёв работы с JSON. Самые простые и гибкие — это низкоуровневые средства потоковой записи и чтения. Более высокоуровневые и не такие универсальные — средства сериализации в JSON примитивных типов и коллекций 1С:Предприятия.
Потоковое чтение и запись JSON
Объекты потоковой работы — это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.
В качестве иллюстрации потокового чтения JSON можно привести следующий пример:
При записи JSON вы самостоятельно формируете его структуру. Чтобы «подстраховать» вас от ошибок, объект ЗаписьJSON автоматически проверяет правильность записываемой структуры. Для увеличения скорости работы эту проверку можно отключить. В примере ниже это строка:
Также при записи вы можете управлять некоторыми параметрами формируемого текста, например использованием двойных кавычек, переносом строк, символами отступа и экранированием символов. В примере ниже для форматирования текста используется символ табуляции:
Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:
Результат такой записи:
{ "СвойствоТипаМассив": [ "Значение строка", 1.2345E1, true, { "СвойствоТипаСтрока": "Значение строка", "СвойствоТипаНеопределено": null } ] }
Сериализация примитивных типов и коллекций в JSON
Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.
Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.
Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.
В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:
[ { "имя": "Anton", "фамилия": "Иванов", "возраст": 25 }, { "имя": "Ирина", "фамилия": "Иванова", "возраст": 20 } ]
Код 1С:Предприятия, выполняющий десериализацию, может выглядеть следующим образом:
А пример сериализации (записи) в JSON может выглядеть так:
Результат записи:
{ "Фамилия": "Иванов", "Имя": "Иван", "Отчество": "Иванович", "Возраст": 40, "Женат": true, "Телефоны": [ "8-999-999-99-90", "8-999-999-99-91" ] }
Функции преобразования и восстановления при сериализации
Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому мы добавили возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.
В методе ЗаписатьJSON() она называется Функция преобразования и описывается с помощью трёх параметров:
- ИмяФункцииПреобразования;
- МодульФункцииПреобразования;
- ДополнительныеПараметрыФункцииПреобразования.
В методе ПрочитатьJSON() она называется Функция восстановления и для неё есть аналогичные параметры:
- ИмяФункцииВосстановления;
- МодульФункцииВосстановления;
- ДополнительныеПараметрыФункцииВосстановления.
При записи в JSON эта функция полезна потому, что позволяет самостоятельно преобразовать в JSON те типы, которые не подлежат автоматическому преобразованию. Или даже совсем отказаться от их сериализации.
Например, так оказалось, что в записываемой структуре одно из значений — это ссылка на элемент справочника ПодразделенияОрганизаций. Такое значение (ссылка на объект 1С:Предприятия) не может быть автоматически сериализовано средствами платформы. Тогда, используя функцию преобразования, мы можем получить для этого значения его строковое представление в удобном виде. Например, в виде строки «ИП Петров: Отдел рекламы».
Результат выполнения примера:
{ "Фамилия": "Иванов", "Имя": "Иван", "Отчество": "Иванович", "Подразделение": "ИП Петров: Отдел рекламы", "Телефоны": [ "8-999-999-99-90", "8-999-999-99-91" ] }
При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы 1С, которые не могут являться результатом автоматического преобразования, или для того, чтобы самостоятельно (не автоматически) преобразовать даты JSON в даты 1С:Предприятия.
Сериализация типа Дата
Данные типа Дата сериализуются в JSON автоматически, а вот обратное преобразование (десериализация) может быть выполнено не всегда. JSON не содержит типа Дата, значения даты представляются в нём строкой. Конечно, существуют некоторые форматы представления дат, но вообще говоря, внешний вид такой строки может быть самым разнообразным.
Для сериализации типа Дата в JSON у метода ЗаписатьJSON() вы можете использовать параметр НастройкиСериализации. Это объект встроенного языка, который позволяет указать, в каком варианте будет записана дата (UTC, локальная дата или локальная дата со смещением) и в каком формате (ISO, JavaScript или Microsoft).
Код 1С:Предприятия:
Текст JSON:
[ { "Фамилия": "Иванов", "ДатаРождения": "1987-05-14T00:00:00" }, { "Фамилия": "Петров", "ДатаРождения": "1993-11-21T00:00:00" } ]
При чтении даты из JSON всё обстоит сложнее. В параметре ИменаСвойствСоЗначениямиДата вы можете перечислить те свойства JSON, значения которых нужно преобразовать в дату 1С:Предприятия (тип Дата). А в параметре ОжидаемыйФорматДаты вам нужно указать, в каком формате эти данные содержатся в JSON (ISO, JavaScript или Microsoft).
Текст JSON:
[ { "Фамилия": "Иванов", "ДатаРождения": "1987-05-14T00:00:00" }, { "Фамилия": "Петров", "ДатаРождения": "1993-11-21T00:00:00" } ]
Код 1С:Предприятия:
Однако если окажется, что в какой-то момент формат данных JSON не совпадает с ожидаемым форматом, будет вызвано исключение.
В такой ситуации, для большей универсальности, вы можете включить те же самые свойства JSON в массив, подлежащий обработке функцией восстановления — ИменаСвойствДляОбработкиВосстановления. И уже в функции восстановления вы самостоятельно десериализуете даты JSON, в каком бы формате они ни были представлены.
Использование JSON в HTTP интерфейсах приложений
Автоматически генерируемый REST интерфейс прикладных решений
При обращении к REST интерфейсу прикладного решения вы можете получать ответ в формате JSON. Для этого в адресной строке вам нужно указать параметр $format=json. Либо указать MIME тип «application/json» в заголовке Accept HTTP запроса. Например:
Запрос:
GET /TestInfobase/odata/standard.odata/СправочникДляТестов?$format=json HTTP/1.1 MaxDataServiceVersion: 3.0;NetFx Accept: application/json Accept-Charset: UTF-8 User-Agent: Microsoft ADO.NET Data Services
Ответ:
HTTP/1.1 200 OK Content-Length: 9429 Content-Type: application/json;charset=utf-8 Server: Microsoft-IIS/7.5 DataServiceVersion: 3.0 X-Powered-By: ASP.NET Date: Mon, 12 Aug 2013 09:44:07 GMT { "odata.metadata":"http://host/svc/$metadata#СправочникДляТестов", "value":[ { "Ref_Key":guid'cc6a7df3-8cfe-11dc-8ca0-000d8843cd1b', "DataVersion":"AAAAAQAAAAE", "DeletionMark":false, "Parent_Key":guid'bbb079ae-8c51-11db-a9b0-00055d49b45e', "IsFolder":false, "Code":000000025, "Description":"Пинетки", "Поставщик_Key":guid'd1cb82a7-8e8b-11db-a9b0-00055d49b45e', "Поставщик@navigationLinkUrl":"СправочникДляТестов(guid'cc6a7df3-8cfe-11dc-8ca0-000d8843cd1b')/Поставщик", "РеквизитХранилище_Type": "image/jpeg", "РеквизитХранилище_Base64Data@mediaReadLink": "Catalog_ДемоСправочник(guid'cf2b1a24-1b96-11e3-8f11-5404a6a68c42')/РеквизитХранилище_Base64Data", "РеквизитХранилище_Base64Data": <строка с закодированными данными> … }, {…}, {…} ] }
Вы можете управлять объёмом передаваемой информации за счёт изменения детальности представления метаданных в выгрузке. Существуют три уровня: Nometadata, Minimalmetadata и Fullmetadata. По-умолчанию (на примере вверху) используется средний уровень — Minimalmetadata. На уровне Nometadata объём передаваемой информации минимальный, а на уровне Fullmetadata — максимальный. Однако при этом нужно понимать, что сокращение объёма передаваемой информации приводит к более интенсивным вычислениям на клиенте. И наоборот, когда вся информация включается в выгрузку, объём вычислений на клиенте будет минимальным.
Детальность представления метаданных вы можете указать, например, в адресной строке.
Сведения о метаданных не передаются:
GET /TestInfobase/odata/standard.odata/СправочникДляТестов/?$format=application/json;odata= minimalmetadata
Вся информация о метаданных включается в выгрузку:
GET /TestInfobase/odata/standard.odata/СправочникДляТестов/?$format=application/json;odata=fullmetadata
HTTP-сервисы прикладного решения
HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. Для этого вам проще всего сформировать тело ответа в JSON, получить его как строку, а затем установить из этой строки тело HTTP ответа сервиса. При этом желательно указать, что BOM (Byte Order Mark, метка порядка байтов) использоваться не должна.
Последний параметр (ИспользованиеByteOrderMark.НеИспользовать) вы можете и не указывать, если режим совместимости конфигурации не установлен, или он больше чем Версия8_3_5. Потому что в этом случае BOM автоматически будет использоваться только для кодировок UTF-16 и UTF-32, а для UTF-8, UTF-16LE/UTF-16BE, UTF-32LE/UTF-32BE и других она использоваться не будет.
Взаимодействие со сторонними HTTP сервисами
При взаимодействии со сторонними HTTP интерфейсами у вас также может возникнуть необходимость формирования запросов к ним в формате JSON. В этом случае алгоритм ваших действий будет аналогичным. Формируете тело запроса в JSON. Получаете тело в виде строки. Из этой строки устанавливаете тело HTTP запроса. BOM не используете.
Дальнейшее развитие
Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.
Теги:
JSON
8.3.6
разработка