1С и JSON: работа над ошибками
UPD: новая версия
Пилотная версия функции преобразования данных 1С в JSON оказалась вполне удачной. Делюсь новой версией: http://pastebin.com/y2K5V3Xt
Исправления:
- типы
Неопределено
иNull
преобразуются вnull
; - добавлен тип
СписокЗначений
; - исправлен ISO-формат даты;
- строки преобразовываются в последовательности вида
\uxxxx
.
Напомню, что код состоит из одной функции и не зависит от сторонних модулей и компонент.
Пример:
с = новый СписокЗначений;
с.Добавить("Привет!");
с.Добавить(42);
с.Добавить(ТекущаяДата());
с.Добавить(Неопределено);
с.Добавить(Null);
с.Добавить("!№2№%Ё~{}");
с.Добавить(новый Структура("поле1, поле2", ВидДвиженияБухгалтерии.Дебет, новый Массив(3)));
Сообщить(json(с));
Результат:
[
"\u041f\u0440\u0438\u0432\u0435\u0442!",
42,
"2012-11-13T10:17:55",
null,
null,
"!\u21162\u2116%\u0401~{}",
{
"\u043f\u043e\u043b\u04352": [
null,
null,
null
],
"\u043f\u043e\u043b\u04351": "\u0414\u0435\u0431\u0435\u0442"
}
]
Комментарии из старого блога
11/21/12 Артемий Зайцев: А зачем все символы заменять на
подстановки \u0414
? Вместо “N” (1 байт) получим замену в 6 байт
при передаче по интернету. Вся прелесть JSON теряется. XML
становится выгоднее.
11/21/12 Иван Гришаев: Заменяются не все символы, а только те, что
не входят в диапазон 0x20-0x7f (A-z, 0-9)
. Если у вас английский
текст, то разницы не будет.
\uxxxx
- это код символа Unicode. Согласно стандарту JSON строки
должны быть представлены Unicode-последовательностями. Это правило
можно нарушать, но тогда никто не гарантирует корректный разбор
JSON-документа со строками, скажем, на украинском.
Преимущество JSON перед XML не в меньшем объеме данных, а в удобстве сериализации и парсинга. Одной функцией структура сворачивается в JSON, другой – обратно. Генерация и парсинг XML занимают больше времени и сил.
11/21/12 Артемий Зайцев: Проверил с разными языками. В UTF всё работает. Еще у вас подстановок спецсимволов в строке. Если в тексте есть знаки / \ “, то JSON ломается.
Сделал как-то так:
Если Тип = Тип("Строка") Тогда
Возврат """" + MyJSONМаскировать(Объект) + """";
....
Функция MyJSONМаскировать(Знач Стр)
Стр=СтрЗаменить(Стр,"\","\\");
Стр=СтрЗаменить(Стр,Символы.ПС,"\n");
Стр=СтрЗаменить(Стр,Символы.ВК,"\r");
Стр=СтрЗаменить(Стр,Символы.Таб,"\t");
Стр=СтрЗаменить(Стр,"/","\/");
Стр=СтрЗаменить(Стр,"""","\""");
Возврат Стр
КонецФункции
11/21/12 Иван Гришаев: Да, спасибо, только что сам обнаружил, что с кавычками косяк, нужно их экранировать заменой, как у вас. Завтра выложу новую версию функции.
05/31/13 Кирилл: Спасибо автору!
05/31/13 Зайцев Артемий Анатольевич: Кирилл, рано автора
хвалить. Он только начинает учить 1С. Есть еще ошибки:
(Формат(Объект, "ДФ=yyyy-MM-ddThh:mm:ss")
- после буквы T ничего не
пишет.
05/31/13 Иван Гришаев: Вы комментируете старую версию функции. Вот новая. Там много чего исправлено. Эта крутится в продакшене уже больше года.
05/31/13 Зайцев Артемий Анатольевич: Иван. В новой тот же косяк с датой:
Возврат json(Формат(Объект, "ДФ=yyyy-MM-ddThh:mm:ss"));
надо как-то:
Возврат json(Формат(Объект, "ДФ=yyyy-MM-dd") + "T" + Формат(Объект, "ДФ=hh:mm:ss") );
05/31/13 Иван Гришаев: Похоже, вы правы, спасибо. В моем проекте часы и минуты не нужны, не обратил внимания.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter