Имя: Пароль:
1C
1С v8
Получить значения из JSON
, ,
0 never_be
 
13.05.14
08:44
Есть такой JSON
[
  {
    "Цена" : "183",
    "Наименование" : "STEP Пазл 1000 Гаваи. Остров Оаху",
    "Количество" : "1",
    "Артикул" : "79078"
  },
  {
    "Цена" : "183",
    "Наименование" : "STEP Пазл 1000 Гаваи. Остров Оаху",
    "Количество" : "1",
    "Артикул" : "79078"
  }
]

Хочу пройтись по нему циклом и забрать значения

Вижу такой код как пример

СтрокаJSON = "{""server"":""10234"",""user"":""3745"",""hash"":""8263ad83ce""}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

Но в результат  будет структура с каким-то 1 значением или я что-то не понял, как по нему циклом пройтись ?
1 never_be
 
13.05.14
08:49
Или просто

Для каждого тек из Результат Цикл
    
КонецЦикла;

?
2 Лодырь
 
13.05.14
08:53
Дружище ну открой ты для себя отладчик, если лень читать код процедуры.
3 Apokalipsec
 
13.05.14
08:55
(1) а зайти в функцию слабо? Там строку разбирают по регулярным выражениям и возвращают тебе структуру вида:
"server" "10234"
"user" "3745"
4 never_be
 
13.05.14
08:57
(2) (3) Просто пишу в web сервисе, а как его отлаживать еще не разобрался.
5 Лодырь
 
13.05.14
08:59
Установи в настройках автоматическое подключение отладчика и все.
6 Apokalipsec
 
13.05.14
08:59
(4) Отлаживать через Администрирование публикация там галочка разрешить отладку веб-сервиса
7 never_be
 
13.05.14
10:33
Ребята вот так (1) не получается, тек.Цена и прочее вываливает ошибку, как правильно пройтись по структуре которую я получил методом ЗаполнитьСтруктуруИзJSON?
8 Apokalipsec
 
13.05.14
10:37
(7) Отладка.Структура не обходится циклом.
Результат.Цена - будет содержать значение.
Результат.Наименование - будет содержать наименование.
9 never_be
 
13.05.14
10:50
(8) Так у меня внутри много значений, как мне их получить, или оно возвращает только первый, что-то я совсем запутался.
10 never_be
 
13.05.14
10:53
Например Цена у меня в JSON 10 штук в примере выше 2, как мне до них добраться ?
11 Леша1с
 
13.05.14
10:54
(8)>>Отладка.Структура
это что есть такое?
(9)"как мне их получить"
получить элемент структуры по ключу?
12 Эмбеддер
 
13.05.14
10:55
а в примере (0) только 1 элемент СтрокаJSON = "{""server"":""10234"",""user"":""3745"",""hash"":""8263ad83ce""}"
13 never_be
 
13.05.14
10:57
(11) (12)  Ребята в примере (0)  2 номенклатуры, каким методом мне их распарсить и получить значение каждого по очереди ?
14 never_be
 
13.05.14
10:57
вот такой

[
  {
    "Цена" : "183",
    "Наименование" : "STEP Пазл 1000 Гаваи. Остров Оаху",
    "Количество" : "1",
    "Артикул" : "79078"
  },
  {
    "Цена" : "183",
    "Наименование" : "STEP Пазл 1000 Гаваи. Остров Оаху",
    "Количество" : "1",
    "Артикул" : "79078"
  }
]
15 Лодырь
 
13.05.14
10:58
Дружище, мы не знаем как устроена твоя функция
ЗаполнитьСтруктуруИзJSON(СтрокаJSON);

Если бы речь шла о знакомых нам функциях, дело бы пошло легче.
16 Enders
 
13.05.14
10:59
(13) написать свой парсер с блекджеком и...
Скачать готовый, примеров масса)
Судя по всему ты уже скачал, но как работает - не знаешь, а код не показываешь. Каких ответов ждем?)
17 never_be
 
13.05.14
11:01
(15) (16) В инете такой код везде его и использовал

Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
    
    Результат = Новый Структура;
    
    ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");    // заменим последовательность \" на "
    ТекстJSON = СтрЗаменить(ТекстJSON, """", "");        // а теперь удалим все кавычки
    
    Если Лев(ТекстJSON, 1) = "{" Тогда
        // начало структуры
        ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
        
    ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
        // начало массива
        МассивДанных = Новый Массив;
        ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
        
        Результат.Вставить("Значение", МассивДанных);
        
    КонецЕсли;
        
    Возврат Результат;
    
КонецФункции

Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
    
    ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));    // удалим открывающий символ структуры(массива)
    
    НомерЗначения = 0;
    
    Пока ТекстJSON <> "" Цикл
        
        ПервыйСимвол = Лев(ТекстJSON, 1);
        Если ПервыйСимвол = "{" Тогда
            // вложенная структура
            Значение = Новый Структура;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            ИначеЕсли ТипДанных = "Массив" Тогда
                Результат.Добавить(Значение);
            КонецЕсли;
        
        ИначеЕсли ПервыйСимвол = "[" Тогда
            // вложенный массив
            Значение = Новый Массив;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            Иначе
                Результат.Добавить(Значение);
            КонецЕсли;
            
        ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
            // структура закончилась
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
            
        ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
            // массив закончился
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
            
        Иначе
            
            Если ТипДанных = "Структура" Тогда
                //ПервыйКавычка = Ложь;
                //Если Лев(ТекстJSON, 1) = """" Тогда
                //    ПервыйКавычка = Истина;
                //КонецЕсли;
                
                Поз = Найти(ТекстJSON, ":");
                Если Поз = 0 Тогда
                    // неверный формат, прервемся
                    Прервать;
                КонецЕсли;
                
                //ПредпоследнийКавычка = Ложь;
                //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда
                //    ПредпоследнийКавычка = Истина;
                //КонецЕсли;

                
                ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
                ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");
                
                ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
                                
                Если Лев(ТекстJSON, 1) = "{" Тогда
                    // значение является структурой
                    Значение = Новый Структура;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
                    
                ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
                    // значение является массивом
                    Значение = Новый Массив;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
                    
                Иначе
                    // обычное значение
                    ПервыйКавычка = Ложь;
                    ПредпоследнийКавычка = Ложь;
                    Поз = 0;
                    Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                        Символ = Сред(ТекстJSON, Сч, 1);
                        
                        Если Символ = """" Тогда
                            Если ПервыйКавычка Тогда
                                ПредпоследнийКавычка = Истина;
                            Иначе
                                ПервыйКавычка = Истина;
                            КонецЕсли;                            
                        КонецЕсли;
                        
                        Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                            Поз = Сч;
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                    
                    //ПредпоследнийКавычка = Ложь;
                    //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда
                    //    ПредпоследнийКавычка = Истина;
                    //КонецЕсли;
                    
                    Если Поз = 0 Тогда
                        Значение = ТекстJSON;
                        ТекстJSON = "";
                        
                    Иначе
                        Значение = Лев(ТекстJSON, Поз - 1);
                        Значение = СтрЗаменить(Значение, """", "");
                        ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));                        
                    КонецЕсли;
                    
                    Значение = СокрЛП(Значение);
                    
                КонецЕсли;
                
                Результат.Вставить(ИмяЗначения, Значение);
                
            ИначеЕсли ТипДанных = "Массив" Тогда
                
                // обычное значение
                Поз = 0;
                Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                    Символ = Сред(ТекстJSON, Сч, 1);
                    Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                        Поз = Сч;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                
                //ПредпоследнийКавычка = Ложь;
                //Если Сред(ТекстJSON, Поз - 1, 1) = """" Тогда
                //    ПредпоследнийКавычка = Истина;
                //КонецЕсли;
                
                Если Поз = 0 Тогда
                    Значение = ТекстJSON;
                    ТекстJSON = "";
                    
                Иначе
                    Значение = Лев(ТекстJSON, Поз - 1);
                    Значение = СтрЗаменить(Значение, """", "");
                    ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                    
                КонецЕсли;
                
                Значение = СокрЛП(Значение);
                
                Результат.Добавить(Значение);
                
            КонецЕсли;
                
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры
18 Лодырь
 
13.05.14
11:03
Ну.. слово "массив" тебе ни на что ненамякивает?
19 Леша1с
 
13.05.14
11:10
(18) ну, ему что структура, что массив - обозвали "Структура", значит, массив обратился сам собой в структуру. Как в сказке. Главное - знать волшебное слово :))
20 Эмбеддер
 
13.05.14
11:15
(17) если что-то не пойдет с этой функцией, советую использовать эту библиотеку
http://legionwfz.blogspot.ru/
21 never_be
 
13.05.14
11:17
(19) (18)  То есть Результат это масив внутри элементов которого лежит структура ? Никогда просто с таким не работал, как обратится в таком случае ?

Результат[0].Цена ?
22 Леша1с
 
13.05.14
11:43
(21)примерно. А вообще, для начала проверить, какой тип возвращается, и от этого парсить результат.
А то вдруг прекратит возвращать массив, и снова будет возвращать структуру... ))