Last active
July 10, 2022 18:12
-
-
Save bsa7/9991957 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(Знач Стр) |
@sanekkop - Пробуй в json сохранять эти значения в стоковом типе. А после парсера, уже в твоей обработке, конвертируй обратно в числовой формат 1С.
r72cccp - Если бы я формировал сам этот json. Мне его возвращает api. Как это обойти я уже придумал. Я думал может есть способ без "костылей".
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Добрый день!
Может кто сталкивался с подобной проблемой. При работе с "большими" числовыми значениями, зануляет последние символы.
"{""item"":{""item_id"":1000000000000001}}";
В итоге значение number возвращает "1000000000000000".
Понимаю, что дело в bigint, но как заставить его понимать это?