JSON и UnJSON в 1С (версия от 27/11/2009)

Программирование - Практика программирования

JSON и парсер json строк в 1С. Версия от 27/11/2009.
Что нового: в строках можно использовать, как двойные, так и одинарные кавычки и исправлен маленький косячок при парсинге объекта.

Парсер имеет недостаток, он не проводит валидацию JSON-строки, поэтому если строка "битая" или неправильная, то результат непредсказуем.
В смысле — в результате работы парсинга будет возвращена какая-нибудь лабуда.

Скачать файлы

Наименование Файл Версия Размер
JSON and UnJSON (27/11/2009)
.epf 14,30Kb
27.11.09
460
.epf 14,30Kb 460 Скачать

См. также

Комментарии
1. Валентин Бомбин (so-quest) 126 20.11.09 13:55 Сейчас в теме
Авансом. Ибо не смотрел.
2. Евгений Люлюк (Evg-Lylyk) 2018 20.11.09 14:27 Сейчас в теме
Привел бы реальный полезный пример допустим парсинг текста запроса
3. BigB (BigB) 163 20.11.09 14:56 Сейчас в теме
(2) Если честно - то я не понял ваш вопрос. Как можно, а главное для чего нужно парсить текст запроса? Если не сложно уточните по подробнее
4. Евгений Люлюк (Evg-Lylyk) 2018 20.11.09 18:17 Сейчас в теме
(3) Ну например для контекстной подсказки в запросе.
Ну если парсить ну что нить приближенное к 1С можно Текст встроенного языка
5. Ярослав Радкевич (WKBAPKA) 202 22.11.09 12:47 Сейчас в теме
2(2): а чего его парсить то? парсить несложно, а вот все что дальше делать с результатом парсинга уже посложнее...
6. Евгений Люлюк (Evg-Lylyk) 2018 22.11.09 13:09 Сейчас в теме
(5) Хотел сказать что желательно пример по теме 1С
7. BigB (BigB) 163 23.11.09 07:09 Сейчас в теме
(6) формат передачи json удобно использовать в связке с JavaScript. В самой 1С его нет смысла использовать.
8. BigB (BigB) 163 26.11.09 07:37 Сейчас в теме
Полностью обезглючил парсер. Пользуйтесь на здоровье.
andreich_ru; nastrip; Трактор; tango; EugeneM; +5 Ответить 1
9. BigB (BigB) 163 27.11.09 08:23 Сейчас в теме
Извините, но новая версия. Что нового: в строках можно использовать, как двойные, так и одинарные кавычки и исправлен маленький косячок при парсинге объекта.
10. Terris none (terris) 02.12.09 02:01 Сейчас в теме
Спасибо. Давно искал парсер для 1С.
11. Danil Snissarenko (d.snissarenko) 217 06.01.11 20:37 Сейчас в теме
12. Maxim (parallel588) 07.09.11 11:00 Сейчас в теме
13. d3 r3 (ctulhua) 29.09.11 13:01 Сейчас в теме
Все отлично, пара мелких глюков, элементарно исправляемых и можно лететь в космос)
14. BigB (BigB) 163 04.10.11 12:02 Сейчас в теме
(13) ctulhua, какие именно глюки?
15. Артур Балян (Ortos) 21.01.12 12:26 Сейчас в теме
16. BigShmax Широков (BigShmax) 15.02.12 12:12 Сейчас в теме
Хмм мне принесли инструкцию API для автоматизации закзов в интернет магазине фирмы КАЛИТА про жалюзи. мне этот парсер ни как не может быть полезен? я вообще не знаю с какой стороны подойти к поставленной задаче :-( нужно из заказа покупателей жалюзи заказать при помощи этого чудо JSON о котором я услышал в первые 10 митнут назад :-(
ООО "Торговый дом "Матрица"; +1 Ответить
17. Serg (spacedragon) 03.03.12 17:54 Сейчас в теме
При работе с ВЕБ сервисом, который принимает запросы в JSON и отвечает также всплыла интересная ситуация. Стандратный РНР парсер не понимает строку из 1С из-за символа BOM (Символ.НПП). Пришлось в запросе НТТР.POST предварительно перезаписывать файл для того, чтобы убрать первые 3 невидимых символа. Кто нибудь такое встречал? Ваш парсер такую ситуацию как то обыграет?
18. Serg (spacedragon) 03.03.12 18:32 Сейчас в теме
19. BigB (BigB) 163 05.03.12 09:17 Сейчас в теме
20. Артем Блинов (artemkab@yandex.ru) 10.04.12 02:27 Сейчас в теме
Вещица очень кстати, пробую ))
21. Александр Загора (buzzzard) 51 28.04.12 02:01 Сейчас в теме
OAuth2.0 у Google, на втором этапе авторизации выдает JSON вида:
{
  "access_token" : "ya29.AHES6ZRmi4n2MK9hBTtD0Uu5W2E8Syxs_lHg",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "id_token" : "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJhY2N-DqKlZ9camBK_oF5rPfstZ3Ei89nsUQ",
  "refresh_token" : "1/_KwyqNDsjz9pGzBSqF2RDpJ2PKHYX2BgYIjIQMY0nCA"
}
...Показать Скрыть


Так вот параметр refresh_token после JSON -> UnJSON -> JSON получается таким:
"refresh_token":"1\/_KwyqNDsjz9pGzBSqF2RDpJ2PKHYX2BgYIjIQMY0nCA"


Разбираться не стал. Пока интересен только UnJSON, а он правильно отработал.

Спасибо огромное за труд!
22. Andrey Karetskiy (silberRus) 47 18.04.13 15:34 Сейчас в теме
Не получается отправляю этим парсером картинки закодированные в base64 (
23. Сергей Карташев (Elisy) 881 11.06.13 20:16 Сейчас в теме
Добрый день,
попытался воспользоваться JSON-сериализацией.
Есть 2 момента.
1. Сериализация двойных кавычек в строке у вас переводится в \\" (т.е. с лишним обратным слешем)
2. Думаю, что сериализацию типа Ссылка лучше сделать в виде идентификатора. Сейчас Ссылка сериализуется в Наименование.
Спасибо
24. Вячеслав Клюев (slavik27) 19 20.06.13 06:41 Сейчас в теме
Спасибо, вещь интересная
25. Александр Гаранин (Alexandr671) 3 05.09.13 11:00 Сейчас в теме
А где файлик то???
$m сняли а фалик не дали???
26. Евгений Шабалин (xzorkiix) 28 04.06.14 09:41 Сейчас в теме
(17) spacedragon, а как именно перезаписывали? подозреваю, что у меня именно в этом ошибка.

Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку(JSONСтрока);
Текст.Записать(ИмяФайлаЗапроса,КодировкаТекста.UTF8);

Запрос.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ИмяФайлаЗапроса));
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
...Показать Скрыть
27. BigB (BigB) 163 04.06.14 10:27 Сейчас в теме
(26) xzorkiix, покажите код побольше или прикрепите свою обработку к сообщению. Может чем и помогу.
28. Евгений Шабалин (xzorkiix) 28 05.06.14 17:00 Сейчас в теме
(27) BigB, разобрался (в 8.3.5 точно работает)

// http://help1c.com/faq8/view/1404.html
// Как записать файл в кодировке UTF-8 без BOM
Функция ЗаписатьФайлВформате_UTF8_без_BOM(текст,полноеИмяФайла) Экспорт

// записываем в файл с символами BOM в начале файле
ТекстовыйФайлUTF8_Bom = Новый ТекстовыйДокумент();
ТекстовыйФайлUTF8_Bom.ДобавитьСтроку(текст);
ТекстовыйФайлUTF8_Bom.Записать(полноеИмяФайла,"UTF-8");

// открываем файл и считываем символы после символов BOM
Данные = Новый ДвоичныеДанные(полноеИмяФайла);
Строка64=Base64Строка(Данные);
Строка64=Прав(Строка64,СтрДлина(Строка64)-4);
ДанныеНаЗапись=Base64Значение(Строка64);
ДанныеНаЗапись.Записать(полноеИмяФайла); // записываем

КонецФункции

29. Сергей Артюхов (Serg3141) 8 02.08.14 00:41 Сейчас в теме
Супер, сэкономил себе кучу времени, спасибо большое
30. BigB (BigB) 163 04.08.14 06:22 Сейчас в теме
(29)Да пожалуйста. Пользуйтесь на здоровье :)
31. Сергей Артюхов (Serg3141) 8 08.08.14 18:21 Сейчас в теме
В работе с этим ПО наткнулся на такую вещь. Удаленный сервер по запросу выдавал строку json, в которой использовались индексы, по своему написанию полностью соответствующие УИД в 1С. При загрузке ПО переводило эти индексы в УИД 1С. Но дело в том, что в моей ситуации это были индексы, а не УИД и этот удаленный сервер (сторонние разработчики) выдавал их в верхнем регистре. После преобразования индексов в УИД строковое написание УИД становилось в маленьком регистре, соответственно связь по индексам терялась. Может стоит ввести некий настроечный параметр, что-то вроде этого "ПреобразовыватьСтроковоеПредставлениеУИД=Истина", чтобы можно было избежать таких казусов, а кому нужно как установить параметр, тот так и установит.
32. BigB (BigB) 163 08.08.14 21:09 Сейчас в теме
(31)Можете пример показать?
33. Сергей Артюхов (Serg3141) 8 10.08.14 17:14 Сейчас в теме
вот начало json-строки:
{"jsonrpc":"2.0","errors":[],"notifications":[],"result":{"Time":"2014-08-10T17:06:39+04:00","RequestID":"53e76e52af632c4c0f000000","Format":"Combined","Data":[{"Gate":"Production","GDS":"AmadeusWS","Office":null,"RecommendationID":"D308D0C5-EA60-44B8-A346-544CB8870341","RecommendationGDSID":"1","ValidatingAirline":"SU","ValidatingAirlines":"SU","LastTicketDate":1403985600,"Refundable":"No","ETicket":true,"Itineraries":[{"ItineraryID":0,"Variants":[{"VariantID":"DB6713B2-2ED6-491B-8DCB-F8F53968D84E","VariantGDSID":"1","Duration":80

здесь как раз два разных ID в верхнем регистре.
34. BigB (BigB) 163 11.08.14 09:26 Сейчас в теме
(33)Функция UnJson с УИДами не работает. Они для неё являются простыми строками.
После преобразования индексов в УИД строковое написание УИД становилось в маленьком регистре

Кто мешает воспользоваться функцией ВРег?
35. Сергей Артюхов (Serg3141) 8 12.08.14 11:12 Сейчас в теме
(34) мешает то, что разработчик не гарантирует, что те самые последовательности символов останутся в верхнем регистре при смене ПО (а у них периодически это происходит). Да для себя я проблем не вижу - там УИД точно передаваться не будет, так что я просто закомментировал преобразование в УИД, и все. Я просто подумал, что следует такую, возможно и мелочь, подсказать. Я из-за нее потратил время, пока разобрался, что у меня регистр меняется.
36. BigB (BigB) 163 08.10.14 08:59 Сейчас в теме
УРА! СВЕРШИЛОСЬ!
В платформе 8.3.6 будет встроенный JSON!
Средства работы с JSON из Зазеркалья
Осталось дождаться выхода платформы.
37. Евгения Карук (ekaruk) 3031 14.10.14 12:35 Сейчас в теме
Спасибо за обработку. Срочно понадобился JSON.
Просто подключается, все корректно распознает.
38. Евгений Шабалин (xzorkiix) 28 15.10.14 10:21 Сейчас в теме
(36) BigB, пришел увидеть здесь именно этот комментарий :)
39. BigB (BigB) 163 15.10.14 11:40 Сейчас в теме
40. Станислав Раташнюк (stanru1) 81 28.10.14 18:03 Сейчас в теме
Спасибо большое! В ожидании реализации от 1С вы сэкономили мне кучу времени :-)
41. Сергей Карташев (Elisy) 881 28.11.14 08:03 Сейчас в теме
По скорости, если кому-то интересно. Сериализация Json работает очень медленно по сравнению с XML-сериализацией.
Оптимизация делалась для веб-сайта http://www.oboi.kg
На данных из примерно 5 тысяч записей таблицы значений перевод в XML уменьшил время обработки со 120 секунд (2 минуты) до 4 секунд.
42. BigB (BigB) 163 29.11.14 23:03 Сейчас в теме
(41) Конечно же скорость сериализации в XML будет быстрее, потому что она делается средствами платформы. Сериализация же в json делается средствами языка.
В платформе 8.3.6 сериализация в json то же будет средствами платформы. Я полагаю, что скорость будет не хуже, а может быть, даже лучше чем при сериализации в XML.
43. Матвей Кудашкин (Patriot1S) 75 29.04.15 12:24 Сейчас в теме
В Функции ПолучитьЗначениеJSON( я бы изменил строку

Объект=Новый Соответствие; на Объект=Новый Структура;

Для совместимости со встроенным JSON 8.3.Хотя понимаю, что скорость работы упадет.
44. Сергей Ожерельев (Поручик) 3624 25.11.15 15:36 Сейчас в теме
Функцию Экранировать тоже пришлось пофиксить, иначе декодирование на php json_decode падает с ошибкой. Смысл фикса в добавлении дополнительного слэша \ к спецсимволам.

//Экранирует недопустимые символы
Функция Экранировать(Стр)
	Х=СтрЗаменить(Стр,"""","\""");
	//Х=СтрЗаменить(Х,"'","\'"); //??? Не уверен в этой строке. Кто нибудь может подтвердить или опровергнуть нужность этой строки.
	Х=СтрЗаменить(Х,"\","\\");
	Х=СтрЗаменить(Х,"/","\/"); //Тут тоже не уверен, но пока оставлю.
	Х=СтрЗаменить(Х,Символ(8),"\\b");
	Х=СтрЗаменить(Х,Символы.ПФ,"\\f");
	Х=СтрЗаменить(Х,Символы.ПС,"\\n");
	Х=СтрЗаменить(Х,Символы.ВК,"\\r");
	Х=СтрЗаменить(Х,Символы.Таб,"\\t");
	Х=СтрЗаменить(Х,Символы.ВТаб,"\\v");
	Возврат Х
КонецФункции
...Показать Скрыть
45. BigB (BigB) 163 25.11.15 16:18 Сейчас в теме
(44) Поручик, сайт покоцал код. Не понял, что вы изменили?
46. Сергей Кудашкин (sikuda) 499 21.01.16 15:37 Сейчас в теме
Х=СтрЗаменить(Стр,"""","\""");
и потом 
Х=СтрЗаменить(Х,"\","\\");


Это специально чтобы внутри строки символ " превращался в \\" а не в \"

Исправил
 
Х=СтрЗаменить(Х,"\","\\");
//Х=СтрЗаменить(Х,"'","\'"); //убрать точно
Х=СтрЗаменить(Стр,"""","\""");
...Показать Скрыть
kostyaomsk; BigB; +2 Ответить 1
47. BigB (BigB) 163 23.01.16 19:25 Сейчас в теме
48. Сергей Вегнер (Sibcar) 2 31.05.17 08:19 Сейчас в теме
Для какой версии платформы обработка?
49. BigB (BigB) 163 31.05.17 16:29 Сейчас в теме
(48) Для любой. Изначально писалось под 8.1.
JSON формируется и парсится средствами языка, а не средствами платформы.
Сейчас я полагаю, что обработка уже не актуальна.
50. Сергей Вегнер (Sibcar) 2 01.06.17 06:40 Сейчас в теме
51. Александр Крынецкий (echo77) 742 22.07.17 17:20 Сейчас в теме
(49) Для тех, кто еще сидит на старых версиях платформы - актуальна.
А так, одна функция подобная функция делает все быстрее и проще.
Функция UnJSONШтатно(СтрJSON) Экспорт
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(СтрJSON);
	
	Значение = ПрочитатьJSON(ЧтениеJSON, Истина);
	
	ЧтениеJSON.Закрыть();
	
	Возврат Значение
	
КонецФункции
...Показать Скрыть
52. BigB (BigB) 163 23.07.17 21:58 Сейчас в теме
(51) Вот код который я сам сейчас использую:
Функция JSON(Структура) Экспорт
	ЗаписьJSON=Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON,Структура,Новый НастройкиСериализацииJSON,"ПреобразованиеJSON",JSON);
	Возврат ЗаписьJSON.Закрыть()
КонецФункции

Функция ПреобразованиеJSON(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
	Если Значение=Null Тогда
		Возврат Неопределено
	ИначеЕсли ТипЗнч(Значение)=Тип("ТаблицаЗначений") Тогда
		Колонки=Значение.Колонки;
		Массив=Новый Массив;
		Для Каждого СтрокаТЗ Из Значение Цикл
			Структура=Новый Структура;
			Для Каждого Колонка Из Колонки Цикл
				Структура.Вставить(Колонка.Имя,СтрокаТЗ[Колонка.Имя])
			КонецЦикла;
			Массив.Добавить(Структура);
		КонецЦикла;
		Возврат Массив
	Иначе
		Возврат Строка(Значение)
	КонецЕсли;
	Отказ=Истина
КонецФункции

Функция UnJSON(СтрокаJSON) Экспорт
	ЧтениеJSON=Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
	Значение=ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	Возврат Значение
КонецФункции
...Показать Скрыть
53. Александр Крынецкий (echo77) 742 24.07.17 19:21 Сейчас в теме
(52)
Значение=ПрочитатьJSON(ЧтениеJSON);

Читает в Структуру, что не всегда хорошо. Даже в этой публикации вы пишите, код, который читает в соответствие, поэтому лучше так:
Значение = ПрочитатьJSON(ЧтениеJSON, Истина);
Оставьте свое сообщение