Ну, и далее:
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Made by AAA
Функция jsonВСписок(obj,scriptCtrl)
Перем сп,ТипОбъекта,Ключ,Значение,ТипЗнач;
//Сообщить(scriptCtrl.run("oSize", obj)); //Размер объекта (количество пар ключ-значение)
//Сообщить(scriptCtrl.run("oKey", obj, 1)); //Ключ пары с номером 1
//Сообщить(scriptCtrl.run("oValueByKey", obj, "id")); //Получить значение объекта по ключу
//Сообщить(scriptCtrl.run("aGet", obj.products, 0).id); //Получить Элемент массива с индексом 0
//Сообщить(scriptCtrl.run("eType", obj.products)); //Получить тип объекта, даже если он - массив
сп = СоздатьОбъект("СписокЗначений");
ТипОбъекта = scriptCtrl.run("eType", obj);
Если ТипОбъекта = "object" Тогда
Для н=0 По scriptCtrl.run("oSize", obj)-1 Цикл
Ключ = scriptCtrl.run("oKey", obj, н);
Значение = scriptCtrl.run("oValueByKey", obj, Ключ);
ТипЗнач = scriptCtrl.run("eType", Значение);
Если Найти("number, string", ТипЗнач) > 0 Тогда
Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
Значение=СтрЗаменить(Значение,"\\","\");
Значение=СтрЗаменить(Значение,"\/","/");
сп.ДобавитьЗначение(Значение, Ключ);
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
сп.ДобавитьЗначение(jsonВСписок(Значение,scriptCtrl), Ключ);
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипОбъекта = "array" Тогда
Для н=0 По obj.length-1 Цикл
Значение = scriptCtrl.run("aGet", obj, н);
ТипЗнач = scriptCtrl.run("eType", Значение);
Если Найти("number, string", ТипЗнач) > 0 Тогда
Значение=СтрЗаменить(Значение,"\""","""");// убираем экранирование, сделанное с помощью \
Значение=СтрЗаменить(Значение,"\\","\");
Значение=СтрЗаменить(Значение,"\/","/");
сп.ДобавитьЗначение(Значение, СокрЛП(Строка(н)));
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда
сп.ДобавитьЗначение(jsonВСписок(Значение,scriptCtrl), СокрЛП(Строка(н)));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат сп;
КонецФункции //jsonВСписок(obj)
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Made by AAA
Функция глРазборJSON(Знач Стр) Экспорт //На входе строка в текущей системной кодировке
Перем scriptCtrl,Рез,сп,РегВыр,код;
Если ПустаяСтрока(Стр)=1 Тогда Возврат СоздатьОбъект("СписокЗначений");КонецЕсли;
//Взято здесь https://gist.github.com/r72cccp/9991957
scriptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
scriptCtrl.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));
| }
| }
|";
scriptCtrl.AddCode(код);
//В строках нельзя использовать символ "\"!!! Его нужно экранировать, как \\. Вообще ошибки описаны здесь http://json.parser.online.fr/ в Samples, а здесь - http://json.org - все правила
//Стр = СтрЗаменить(Стр,"\","/"); //+Al 2015-07-15 20:35:32 Я для JIRA я добавлял эту замену? Если JSON не парсится - значит он кривой!
РегВыр = СоздатьОбъект("VBScript.RegExp");
РегВыр.IgnoreCase=1; РегВыр.Global=1; РегВыр.Multiline=1;
РегВыр.Pattern="([^\\])\\([^\\])"; //+Al 2015-08-13 18:41:39 Чистим неправильный JSON, в котором есть одиночный \. Его нужно экранировать, т.е. заменить на \\. В частности JIRA неправильно формирует JSON
Стр = РегВыр.Replace(Стр,"$1\\$2");// Может, если будет глючит - перенести Регулярку в JavaScript
Рез = scriptCtrl.run("parseJSON", стр ); //Работает
сп = jsonВСписок(Рез,scriptCtrl);
Возврат сп;
КонецФункции //глРазборJSON(Знач Стр)