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 Иван Гришаев: Похоже, вы правы, спасибо. В моем проекте часы и минуты не нужны, не обратил внимания.