Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Форматирование JSON данных в 1с 7.7

v7: Форматирование JSON  данных в 1с 7.7
Я
   From_RB
 
15.11.20 - 09:56
Возможно кому-то попадался  аналог https://jsonformatter.curiousconcept.com/# для форматирования JSON текста в "удобоваримый" вид) ?
   babytype
 
1 - 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
   From_RB
 
2 - 15.11.20 - 15:28
(1) Спасибо, но немного не то.
В данном случае мне надо не распарсить json, а отформатировать для удобного анализа структуры.
   Ёпрст
 
3 - 15.11.20 - 19:12
(2) нотепаде++ умеет, точнее, плаггин к нему
   From_RB
 
4 - 15.11.20 - 20:05
(3) Как вариант поставил плагин для нотепад++ https://github.com/kapilratnani/JSON-Viewer/releases/tag/v1.40

з.ы. Однако хотелось бы все-таки под сабж)))
   tgu82
 
5 - 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
Тебе онлайн надо что ле ?
   trdm
 
8 - 16.11.20 - 06:38
(4) > з.ы. Однако хотелось бы все-таки под сабж)))

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.