-
-
Save eks1985/96d9a04e2b97fed3e2366b317bcbfaa0 to your computer and use it in GitHub Desktop.
1C 7.7 JSON parser 2.0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Процедура СкриптКонтролИнит(scriptCtrl) | |
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(код); | |
КонецПроцедуры | |
//******************************************* | |
Функция jsonВСписок(obj) | |
Если ПустоеЗначение(scriptCtrl)=1 тогда | |
СкриптКонтролИнит(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ВСписок(Значение), Ключ); | |
КонецЕсли; | |
КонецЦикла; | |
ИначеЕсли ТипОбъекта = "array" Тогда | |
Для н=0 По obj.length-1 Цикл | |
Значение = scriptCtrl.run("aGet", obj, н); | |
ТипЗнач = scriptCtrl.run("eType", Значение); | |
Если Найти("number, string", ТипЗнач) > 0 Тогда | |
сп.ДобавитьЗначение(Значение, СокрЛП(Строка(н))); | |
ИначеЕсли Найти("object, array", ТипЗнач) > 0 Тогда | |
сп.ДобавитьЗначение(jsonВСписок(Значение), СокрЛП(Строка(н))); | |
КонецЕсли; | |
КонецЦикла; | |
КонецЕсли; | |
Возврат сп; | |
КонецФункции //jsonВСписок(obj) | |
//********************************************************************************* | |
Функция глРазборJSON(Знач Стр) Экспорт //На входе строка в текущей системной кодировке | |
Если ПустоеЗначение(scriptCtrl)=1 тогда | |
СкриптКонтролИнит(scriptCtrl); | |
КонецЕсли; | |
Рез = scriptCtrl.run("parseJSON", стр ); //Работает | |
сп = jsonВСписок(Рез); | |
Возврат сп; | |
КонецФункции //глРазборJSON(Знач Стр) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment