В этой статье я приведу примеры функций работы в 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()