В этой статье я приведу примеры функций работы в 1С7.7 с JSON.
Функции были взяты с просторов сети и слегка доработаны (самую малость).
//****************************
//Процедура создает объект "MSScriptControl.ScriptControl" для разбора JSON
Процедура СоздатьСкриптJSON(Скрипт)
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="jscript";
КодСкрипта = "
|
| function parseJSON(strJSON) {
| var tmpFunc = (new Function('return('+strJSON+');'))();
| return(tmpFunc);
| }
|
| // Получить элемент массива
| function aGet(Array, index) {
| return(Array[index]);
| }
|
| // Получить ключ пары по индексу
| function oKey(Obj, index) {
| var size = 0, key;
| for (key in Obj) {
| if (size == index) break;
| if (Obj.hasOwnProperty(key)) size++;
| }
| return(key);
| }
|
| // Получить значение пары по ключу
| function oValueByKey(Obj, key) {
| return(Obj[key]);
| }
|
| //Получить количество пар в объекте
| Object.size = function(obj) {
| var size = 0, key;
| for (key in obj) {
| if (obj.hasOwnProperty(key)) size++;
| }
| return(size);
| }
|
| //Получить размер объекта (количество пар в нём)
| function oSize(Obj) {
| return(Object.size(Obj));
| }
|
| // Получить тип объекта (number, string, object, array)
| function eType(Element) {
| if (Element instanceof Array) {
| return(""array"");
| } else if (Object.prototype.toString.call(Element) === '[object Array]') {
| return(""array"");
| } else {
| return(typeof(Element));
| }
| }
|";
Скрипт.AddCode(КодСкрипта);
КонецПроцедуры
//****************************
// Функция преобразует строку JSON в список значений
// Параметры:
// Нет
// Возвращаемое значение:
// Список значений или 0
Функция ДанныеJSONВСписок(ДанныеJSON, Скрипт)
Перем Ключ, Значение;
Перем Счетчик;
РезультатРазбора = СоздатьОбъект("СписокЗначений");
ТипОбъекта = Скрипт.run("eType", ДанныеJSON);
Если ТипОбъекта = "object" Тогда
Для Счетчик = 0 По Скрипт.run("oSize", ДанныеJSON)-1 Цикл
Ключ = Скрипт.run("oKey", ДанныеJSON, Счетчик);
Значение = Скрипт.run("oValueByKey", ДанныеJSON, Ключ);
ТипЗнач = Скрипт.run("eType", Значение);
Если Найти("number, string", ТипЗнач) > 0 Тогда
Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
Значение=СтрЗаменить(Значение,"\\","\");
Значение=СтрЗаменить(Значение,"\/","/");
РезультатРазбора.ДобавитьЗначение(Значение, Ключ);
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
РезультатРазбора.ДобавитьЗначение(ДанныеJSONВСписок(Значение, Скрипт), Ключ);
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипОбъекта = "array" Тогда
Для Счетчик = 0 По ДанныеJSON.length-1 Цикл
Значение = Скрипт.run("aGet", ДанныеJSON, Счетчик);
ТипЗнач = Скрипт.run("eType", Значение);
Если Найти("number, string", ТипЗнач) > 0 Тогда
Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
Значение=СтрЗаменить(Значение,"\\","\");
Значение=СтрЗаменить(Значение,"\/","/");
РезультатРазбора.ДобавитьЗначение(Значение, СокрЛП(Строка(Счетчик)));
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
РезультатРазбора.ДобавитьЗначение(ДанныеJSONВСписок(Значение, Скрипт), СокрЛП(Строка(Счетчик)));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат РезультатРазбора;
КонецФункции
//****************************
// Функция преобразует строку JSON в список значений
// Параметры:
// Нет
// Возвращаемое значение:
// Список значений или 0
Функция JSONВСписок(Знач СтрокаJSON, Скрипт = 0)
Перем Результат, ДанныеJSON;
Перем ТекстСообщения;
Если ПустоеЗначение(Скрипт) = 1 тогда
СоздатьСкриптJSON(Скрипт);
КонецЕсли;
Попытка
ДанныеJSON = Скрипт.run("parseJSON", СтрокаJSON);
Результат = ДанныеJSONВСписок(ДанныеJSON, Скрипт);
Исключение
ТекстСообщения = "Ошибка при разборе JSON: " + Лев(СтрокаJSON, 220);
Сообщить(ТекстСообщения, "!!");
Результат = 0;
КонецПопытки;
Возврат Результат;
КонецФункции
//****************************
// Функция формирует строку JSON
// Параметры:
// Объект
// Возвращаемое значение:
// Строка json
Функция ЗначениеВJSON(Объект, ДобавлятьРазделительСтрок = 0)
Перем Разделитель;
Разделитель = "";
Если ДобавлятьРазделительСтрок = 1 Тогда
Разделитель = РазделительСтрок;
КонецЕсли;
Тип = ТипЗначенияСтр(Объект);
Если Тип = "СписокЗначений" Тогда
//то определим с ключами или без
Если Объект.РазмерСписка() = 0 Тогда
Тип = "СписокЗначенийбезКлючей";
Иначе
Ключ = "";
Значение = Объект.ПолучитьЗначение(1,Ключ);
Если ПустоеЗначение(Ключ) = 1 Тогда
Тип = "СписокЗначенийбезКлючей";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Тип = "ТаблицаЗначений" Тогда
сзКолонки = СоздатьОбъект("СписокЗначений");
Для СчЦ = 1 По Объект.КоличествоКолонок() Цикл
ИмяКолонки = Объект.ПолучитьПараметрыКолонки(СчЦ);
сзКолонки.ДобавитьЗначение(ИмяКолонки);
КонецЦикла;
КоличКолонок = сзКолонки.РазмерСписка();
Результат = "["+Разделитель;
КоличСтрок = Объект.КоличествоСтрок();
Для СчСтрок = 1 По КоличСтрок Цикл
Результат = Результат + "{";
Для СчК = 1 По сзКолонки.РазмерСписка() Цикл
Ключ = сзКолонки.ПолучитьЗначение(СчК);
Значение = Объект.ПолучитьЗначение(СчСтрок,Ключ);
Результат = Результат + "" + ЗначениеВJSON(Ключ) + ":" + ЗначениеВJSON(Значение) + ?(СчК < КоличКолонок, "," + Разделитель, "");
КонецЦикла;
Результат = Результат + Разделитель + "}";
Если СчСтрок < КоличСтрок Тогда
Результат = Результат + ","+Разделитель;
КонецЕсли;
Состояние("Обработка таблицы значений "+Окр(СчСтрок/КоличСтрок*100,2)+"%");
КонецЦикла;
Результат = Результат + Разделитель + "]";
Возврат Результат;
ИначеЕсли Тип = "СписокЗначенийбезКлючей" Тогда //без ключей
Количество = Объект.РазмерСписка();
Результат = "[";
Для н = 1 ПО Количество Цикл
Результат = Результат + ЗначениеВJSON(Объект.ПолучитьЗначение(н)) + ?(н < Количество, ",", "");
КонецЦикла;
Результат = Результат + "]";
Возврат Результат;
ИначеЕсли Тип = "СписокЗначений" Тогда //с ключами
н = 0;
Количество = Объект.РазмерСписка();
Результат = "{";
Для СчЦ = 1 По Количество Цикл
Ключ = "";
Значение = Объект.ПолучитьЗначение(СчЦ,Ключ);
Результат = Результат + ЗначениеВJSON(Ключ) + ":" + ЗначениеВJSON(Значение) + ?(СчЦ < Количество, ",", "");
КонецЦикла;
Результат = Результат + "}";
Возврат Результат;
ИначеЕсли Тип = "Строка" Тогда
Результат = СокрЛП(Объект);
Результат = СтрЗаменить(Результат, "\", "\\");
Результат = СтрЗаменить(Результат, "/", "\/");
Результат = СтрЗаменить(Результат, """", "\""");
Результат = СтрЗаменить(Результат, "'", "\'");
Результат = СтрЗаменить(Результат, Симв(13), "\r");
Результат = СтрЗаменить(Результат, СимволТабуляции,"\t");
Результат = СтрЗаменить(Результат, Симв(10), "\n");
Возврат """" + Результат + """";
ИначеЕсли Тип = "Число" Тогда
Возврат Формат(Объект, "Ч");
ИначеЕсли Тип = "Дата" Тогда
Возврат ЗначениеВJSON("" + ДатаГод(Объект) + "-" + Прав("00" + ДатаМесяц(Объект), 2) + "-" + Прав("00" + ДатаЧисло(Объект), 2));
ИначеЕсли Тип = "НеизвестныйОбъект" Тогда
Возврат "null";
Иначе
Возврат ЗначениеВJSON(Строка(Объект));
КонецЕсли;
КонецФункции // ЗначениеВJSON()
13 thoughts on “JSON и 1С7.7”