Имя: Пароль:
1C
1C 7.7
v7: Форматирование JSON данных в 1с 7.7
0 From_RB
 
15.11.20
09:56
Возможно кому-то попадался  аналог https://jsonformatter.curiousconcept.com/# для форматирования JSON текста в "удобоваримый" вид) ?
1 babytype
 
15.11.20
13:53
Мне хватало этого (нарыто на просторах сети давно) для небольших размеров json

Процедура СкриптКонтролИнит(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 (взято из сети)
Функция 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 (взято из сети)
//Возвращаемое значение можно разбирать с помощью стандартной функции
//Получить(<Имя поля>)
// для типа переменной "Список значений", или стандартной же функции
//ПолучитьЗначение(<НомерПоля>[,<Ключ>])
Функция ПреобразоватьJSONВДревовидныйСписок(Знач Стр)
    Если ПустоеЗначение(scriptCtrl)=1 тогда
        СкриптКонтролИнит(scriptCtrl);
    КонецЕсли;
    Рез = scriptCtrl.run("parseJSON", стр );                              
    сп = jsonВСписок(Рез);
    Возврат сп;
КонецФункции //
//======================================================================
//из древовидной структуры выгружает данные в линейный список по пути через точку
// список - древовидный список
// РезСписок - линейный список
// Путь - служебный, для рекурсии
Функция ПреобразоватьДревовидныйСписокВЛинейный(Список,РезСписок,Путь = "")
    Представление = "";
    Рзд = ".";
    Для НомПП=1 По Список.РазмерСписка() Цикл
        Значение = Список.ПолучитьЗначение(НомПП, Представление);    
        Если ТипЗначения(Значение) = 100 Тогда //если список значений - пишем путь через разделитель
            Путь = ?(Путь = "",Представление,Путь+Рзд+Представление);
            ПреобразоватьДревовидныйСписокВЛинейный(Значение, РезСписок, Путь);    
            Путь = ?(Найти(Путь,Рзд)>0,Лев(Путь,СтрДлина(Путь)-СтрДлина(Рзд+Представление)),СтрЗаменить(Путь,Представление,""));
            Продолжить;
        КонецЕсли;
        ПутьВСписок = ?(Путь = "",Представление,Путь+Рзд+Представление);
        РезСписок.ДобавитьЗначение(Значение,ПутьВСписок);
        //Сообщить(ПутьВСписок + " : " + Значение + ", Тип:"+СокрЛП(ТипЗначения(Значение)));    
    КонецЦикла;
    Возврат 0;
КонецФункции // ПреобразоватьДревовидныйСписокВЛинейный
//======================================================================
//Функция для конвертации JSON в линейный список.
//На входе строка в текущей системной кодировке
//Возвращает список значений
Функция РазборJSON(Знач Стр)
    спДревовидный = СоздатьОбъект("СписокЗначений");
    спЛинейный = СоздатьОбъект("СписокЗначений");
    спДревовидный = ПреобразоватьJSONВДревовидныйСписок(Стр);
    ПреобразоватьДревовидныйСписокВЛинейный(спДревовидный,спЛинейный);
    Возврат спЛинейный;
КонецФункции // РазборJSON
2 From_RB
 
15.11.20
15:28
(1) Спасибо, но немного не то.
В данном случае мне надо не распарсить json, а отформатировать для удобного анализа структуры.
3 Ёпрст
 
15.11.20
19:12
(2) нотепаде++ умеет, точнее, плаггин к нему
4 From_RB
 
15.11.20
20:05
(3) Как вариант поставил плагин для нотепад++ https://github.com/kapilratnani/JSON-Viewer/releases/tag/v1.40

з.ы. Однако хотелось бы все-таки под сабж)))
5 tgu82
 
15.11.20
21:14
(1) А для меня как раз то. Писать в джейсон могем а вот читать его в структуры 1С пока не могем а похоже что надо уже.
6 Ёпрст
 
15.11.20
23:46
(4) такой стоит, вроде, не помню
https://www.sunjw.us/jstool/npp/
7 Ёпрст
 
15.11.20
23:47
Тебе онлайн надо что ле ?
8 trdm
 
16.11.20
06:38
(4) > з.ы. Однако хотелось бы все-таки под сабж)))

Ну и в чем проблема?
Если жабаскрипт его разбирает, что для него плевое дело, то на нем же пишешь обход коллекции с форматированием и добавляешь метод к (1).
9 alyuev
 
16.11.20
12:35
Есть такой вариант: http://json.parser.online.fr/
Независимо от того, куда вы едете — это в гору и против ветра!