gifts2017

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

Опубликовал BigB (BigB) в раздел Программирование - Практика программирования

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Валентин Бомбин (so-quest) 20.11.09 13:55
Авансом. Ибо не смотрел.
2. Евгений Люлюк (Evg-Lylyk) 20.11.09 14:27
Привел бы реальный полезный пример допустим парсинг текста запроса
3. BigB (BigB) 20.11.09 14:56
(2) Если честно - то я не понял ваш вопрос. Как можно, а главное для чего нужно парсить текст запроса? Если не сложно уточните по подробнее
4. Евгений Люлюк (Evg-Lylyk) 20.11.09 18:17
(3) Ну например для контекстной подсказки в запросе.
Ну если парсить ну что нить приближенное к 1С можно Текст встроенного языка
5. Ярослав Радкевич (WKBAPKA) 22.11.09 12:47
2(2): а чего его парсить то? парсить несложно, а вот все что дальше делать с результатом парсинга уже посложнее...
6. Евгений Люлюк (Evg-Lylyk) 22.11.09 13:09
(5) Хотел сказать что желательно пример по теме 1С
7. BigB (BigB) 23.11.09 07:09
(6) формат передачи json удобно использовать в связке с JavaScript. В самой 1С его нет смысла использовать.
8. BigB (BigB) 26.11.09 07:37
Полностью обезглючил парсер. Пользуйтесь на здоровье.
andreich_ru; nastrip; Трактор; tango; EugeneM; +5 Ответить 1
9. BigB (BigB) 27.11.09 08:23
Извините, но новая версия. Что нового: в строках можно использовать, как двойные, так и одинарные кавычки и исправлен маленький косячок при парсинге объекта.
10. Terris none (terris) 02.12.09 02:01
Спасибо. Давно искал парсер для 1С.
11. Danil Snissarenko (d.snissarenko) 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) 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) 05.03.12 09:17
20. Артем Блинов (artemkab@yandex.ru) 10.04.12 02:27
Вещица очень кстати, пробую ))
21. Александр Загора (buzzzard) 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) 18.04.13 15:34
Не получается отправляю этим парсером картинки закодированные в base64 (
23. Сергей Карташев (Elisy) 11.06.13 20:16
Добрый день,
попытался воспользоваться JSON-сериализацией.
Есть 2 момента.
1. Сериализация двойных кавычек в строке у вас переводится в \\" (т.е. с лишним обратным слешем)
2. Думаю, что сериализацию типа Ссылка лучше сделать в виде идентификатора. Сейчас Ссылка сериализуется в Наименование.
Спасибо
24. Вячеслав Клюев (slavik27) 20.06.13 06:41
Спасибо, вещь интересная
25. Александр Гаранин (Alexandr671) 05.09.13 11:00
А где файлик то???
$m сняли а фалик не дали???
26. Евгений Шабалин (xzorkiix) 04.06.14 09:41
(17) spacedragon, а как именно перезаписывали? подозреваю, что у меня именно в этом ошибка.

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

Запрос.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ИмяФайлаЗапроса));
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
...Показать Скрыть
27. BigB (BigB) 04.06.14 10:27
(26) xzorkiix, покажите код побольше или прикрепите свою обработку к сообщению. Может чем и помогу.
28. Евгений Шабалин (xzorkiix) 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) 02.08.14 00:41
Супер, сэкономил себе кучу времени, спасибо большое
30. BigB (BigB) 04.08.14 06:22
(29)Да пожалуйста. Пользуйтесь на здоровье :)
31. Сергей Артюхов (Serg3141) 08.08.14 18:21
В работе с этим ПО наткнулся на такую вещь. Удаленный сервер по запросу выдавал строку json, в которой использовались индексы, по своему написанию полностью соответствующие УИД в 1С. При загрузке ПО переводило эти индексы в УИД 1С. Но дело в том, что в моей ситуации это были индексы, а не УИД и этот удаленный сервер (сторонние разработчики) выдавал их в верхнем регистре. После преобразования индексов в УИД строковое написание УИД становилось в маленьком регистре, соответственно связь по индексам терялась. Может стоит ввести некий настроечный параметр, что-то вроде этого "ПреобразовыватьСтроковоеПредставлениеУИД=Истина", чтобы можно было избежать таких казусов, а кому нужно как установить параметр, тот так и установит.
32. BigB (BigB) 08.08.14 21:09
(31)Можете пример показать?
33. Сергей Артюхов (Serg3141) 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) 11.08.14 09:26
(33)Функция UnJson с УИДами не работает. Они для неё являются простыми строками.
После преобразования индексов в УИД строковое написание УИД становилось в маленьком регистре

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

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

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

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


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

Исправил
 
Х=СтрЗаменить(Х,"\","\\");
//Х=СтрЗаменить(Х,"'","\'"); //убрать точно
Х=СтрЗаменить(Стр,"""","\""");
...Показать Скрыть
47. BigB (BigB) 23.01.16 19:25
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа