Имя: Пароль:
1C
1C 7.7
v7: как правильно распарсить массив JSON
,
0 ksa-nsk
 
03.10.20
00:46
Приветствую все умные головы. Есть JSON-файл, единичные значения вытаскиваю, не могу допереть, как вытащить значения из массива.
Для теста создал строку.

Процедура ХХХ()
    scriptCtrl =  СоздатьОбъект("MSScriptControl.ScriptControl");
    scriptCtrl.Language="jscript";          
    scriptCtrl.AddCode("              
    | function parseJSON(strJSON) {
    |  return(JSON.parse(strJSON));
    |}");
        стр = "{""name"":""John"",""age"":30,""cars"":[""Ford"",""BMW"",""Fiat""]}";
        Инф = scriptCtrl.Eval("("+стр+")");

        name = Инф.name; // работает
        car1 = Инф.cars[0]; // ошибка
КонецПроцедуры

Инф.cars  = OLE.JScriptTypeInfo / в отладчике
Как я понимаю, весь затык имеено в массиве, т.е. надо как-то хитрозадо передать, что надо отдать элемент массива ((.
Выручайте, кто уже столкнулся, голова уже взрывается.
1 ksa-nsk
 
03.10.20
01:22
Инф.cars.length = 3
показ размера массива работает, а вот добраться... [] со скобками вроде как затык
3 Cthulhu
 
03.10.20
02:11
сюда загляни:
https://gist.github.com/r72cccp/9991957
4 ksa-nsk
 
03.10.20
08:27
Cthulhu, оттуда и взял код. Парсер JSON работает, показывает значения ххх.ааа, проблема с передачей команды из 1С для обработки массива типа ххх.ааа[0]. Наверно, как-то по другому квадратные скобки надо передавать или может как-то в ScriptControl можно передать повторно для парсинга уже извлечённого массива ххх.ааа?
5 ksa-nsk
 
03.10.20
08:54
еще раз посмотрел ту страницу, там после получения результата идет его обработка функцией
сп = jsonВСписок(Рез);

в этой функции есть стока
ТипОбъекта = scriptCtrl.run("eType", obj);

и здесь семерка вываливается
Выше тоже была команда с "run"
Рез = scriptCtrl.run("parseJSON", стр );

, тоже вываливалась я ее заменил на
Инф = scriptCtrl.Eval("("+стр+")");

как тогда правильно заменить "run" на "Eval" здесь?
ТипОбъекта = scriptCtrl.run("eType", obj);
6 Злопчинский
 
03.10.20
09:01
На ИС есть для 77 в\из JSON
7 ksa-nsk
 
03.10.20
09:04
Злопчинский, можно поподробнее, ИС - это? и где взять "для 77 в\из JSON"
8 ksa-nsk
 
03.10.20
09:33
всем спасибо, (3) - всё работает, ночь не спал, туплю жутко...
Мои извинения за лишнее беспокойство умных голов).
9 zenon46
 
03.10.20
10:05
(8) а решение где?
10 trdm
 
03.10.20
10:13
(9) +1
11 Salimbek
 
03.10.20
10:15
(10) видимо, судя по (3): aGet(cars,0)
12 Salimbek
 
03.10.20
10:17
+(11) точнее:

   Значение = scriptCtrl.run("aGet", cars, 0);
13 ksa-nsk
 
03.10.20
13:27
(8) - все решение действительно, было на (3): https://gist.github.com/r72cccp/9991957, ступил, невнимательно посмотрел.
Единственно, что сделал - заменил в
Процедура СкриптКонтролИнит(scriptCtrl)

код
  | function parseJSON(strJSON) {
  |  var tmpFunc = (new Function('return('+strJSON+');'))();
  |  return(tmpFunc);
  | }

на (рекомендация внизу страницы):
    | function parseJSON(strJSON) {
    |  return(JSON.parse(strJSON));
    | }

как пишет автор коммента, так значительно быстрее работает.

(3) - после бессонной ночи ступил, потом по твоей ссылке ещё раз проработал и вот отпустило - всё чётко парсится, сижу, наслаждаюсь, как мозги в штатный режим переходят))

Да, на всякий случай добавлю, на будущее, для таких мамонтов, как я:
конечная команда парсера
сп = jsonВСписок(Рез);

Далее - поместил строку JSON в первый попавшийся онлайн-конвертер https://jsonparseronline.com/
ну, а затем отладчик (мне так удобнее было), и после получения в нем результата того или значения пишу код в конфигураторе, типа

ИНН = сп.Получить("items").ПолучитьЗначение(Н); // это цикл перебора массива "items"

В общем, идет "сп.", потом перебор массивов (если есть до конечного значения) и в конце вытаскиваем нужное:
- если массив, то "Получить("ХХХ")"
- если конечное значение, то "ПолучитьЗначение("ххх")"

Всё, тема закрыта полностью, всем спасибо за соучастие, редко захожу, но здесь реально получить помощь/совет)).
14 Злопчинский
 
03.10.20
15:21
(7) ИС - это Инфостарт
Закон Брукера: Даже маленькая практика стоит большой теории.