Имя: Пароль:
1C
1C 7.7
v7: Парсинг JSON
0 Sam1C
 
09.06.17
12:54
Доброго дня!
В 1С получаю данные в формате JSOM с помощью скрипта на JScript:

    ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language="jscript";
    ScrptCtrl.AddCode(КодНаJScript);
        Объект = scriptCtrl.run("parseJSON",СтрокаОтвета); // - на этой строке валится 1С, если размер СтрокаОтвета большой. Ни кто не встречал такого?
1 Sam1C
 
09.06.17
12:55
(0) Скрипт такой:
    КодНа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));
        |  }
        | }
        |";
2 Sam1C
 
09.06.17
12:56
(0) Извиняюсь, не JSOM, а JSON. Опечатка
3 Вафель
 
09.06.17
13:08
не понятен смысл этого кода
4 ramir
 
09.06.17
13:11
Не помню уже 1cv7, но там вроде нет ни соответствий, ни структур. Как без них можно JSON парсить - не ясно. В com объект загонять - не лучшая идея, поэтому, возможно, и падает.
5 Sam1C
 
09.06.17
13:16
(3) Какого не понятно? Этого Объект = scriptCtrl.run("parseJSON",СтрокаОтвета);? Выполняет функцию parseJSON на JScript с параметром strJSON = СтрокаОтвета.
Скрип JScript в (1)
6 mistеr
 
09.06.17
13:39
(0) Попробуй через временный файл текст передавать.
7 Torquader
 
12.06.17
01:30
Правильно валится, так как в 1С 7.7 строка однобайтовая, а в OLE - двухбайтовая - и просто не хватает памяти для перевода строк.
Тут либо строку сразу получать внутри скрипта через ServerXMLHTTPRequest или передавать по частям.

Опять же, парсер JsOn прекрасно пишется на самом 1С, в качестве хранилища структур можно использовать внешний OLE-объект Scripting.Dictionary
8 Антириус
 
12.06.17
10:40
(0) Попробуйте так https://antirius.io/content/json1c
9 Злопчинский
 
12.06.17
12:17
Для хранения ключ-значение подходит СписокЗначений
Готовые парсеры для 77 есть на ИС
10 trdm
 
12.06.17
14:21
можно написать приблуду, конвертирующую джейсона в хмл а потом сам хмл разбирать встроенными средствами.
уж хмл парсеры более оптимизированные по потреблению памяти.
как вариант.
11 dmitryds
 
12.06.17
15:17
(1) мне кажется проблема в том, что json-объект постоянно передается в этот объект-прослойку.
в (8) такого недостатка нет
12 dmitryds
 
16.06.17
10:28
(0) проблема решена?
13 Вафель
 
16.06.17
10:44
Так в этом коде parseJSON - возвращает функцию, которая возвращает...
А вот непонятно, что возвращает та вложенная функция.
Но никакого парса тут не видно.
А все нижележащие функции вообще не вызываются
14 dmitryds
 
16.06.17
11:34
(13) в этой функции при преобразовании строки в код JS автоматом получается объект json, который туда подставлен в виде строки
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший