25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
1

Не читается объект внутри объекта JSON строки

28.09.2020, 20:30. Показов 1535. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть функция которая должна заполнять объект класса значениями из объектов JSON cтроки. При попытке достать объект из объекта внутри строки получаю ошибку: Что я сломал?
Assertion failed: m_value.object->find(key) != m_value.object->end(), file C:\Users\sasha\Documents\mvsclibs\json-develop\single_include\nlohmann\json.hpp, line 20301 + на скриншоте.
Объект с внутренними объектами JSON:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"status": "ok",
  "data": {
        idx:7397,
        aqi:71,
        time:{
            v:1481396400,
            s:"2016-12-10 19:00:00",
            tz:"-06:00"
        },
        city:{
            name:"Chi_sp, Illinois",
            url:"https://aqicn.org/city/usa/illinois/chi_sp/",
            geo:["41.913600","-87.723900"]
        },
        iaqi:{
            pm25:{
                v:71
            }
        },
        forecast:{
            daily: {
                pm25: [{
                    avg: 154,
                    day: "2020-06-13",
                    max: 157,
                    min: 131
                }, {
                    avg: 163,
                    day: "2020-06-14",
                    max: 173,
                    min: 137
                }]
            }
        }
Функция :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void client::from_JSONARRAY_IQAIR(string& st)
{
    json str = str.parse(st);
    for (const auto& element : str)
    {
        jsondatatype obj;
        ofstream test("aboutdatadump.txt");
        test << element.dump();
        for (const auto& aboutdata : str["data"])
        {     
            obj.id = aboutdata["idx"].get<int>();
            for (const auto& abouttime : aboutdata["time"])
            {
                obj.timezone = abouttime["tz"].get<string>();
            }
            for (const auto& aboutcity : aboutdata["city"])
            {
                obj.cityName = aboutcity["name"].get<string>();
                for (const auto& aboutgeo : aboutcity["geo"])
                {
                    obj.latitude = aboutgeo["latitude"].get<string>();
                    obj.longitude = aboutgeo["longtitude"].get<string>();
                }
            }
            for (const auto& aboutforecast : aboutdata["forecast"])
            {
                for (const auto& aboutdailyforecast : aboutforecast["daily"])
                {
                    for (const auto& aboutpollutant : aboutdailyforecast["pm25"])
                    {
                        pollutanttype pollutantobj;
                        pollutantobj.pol_ = "PM2.5";
                        pollutantobj.unit_ = "mg/3";
                        pollutantobj.averaging_ = aboutpollutant["avg"].get<string>();
                        pollutantobj.time_ = aboutpollutant["day"].get<string>();
                        obj.pollutantvector.push_back(pollutantobj);
                    }
                }
            }   
        }
        vec.push_back(obj);
    }
}
подобной реализации функция для другой строки JSON работает успешно, прикрепил ещё текстовый файл с дампом полной строки
Миниатюры
Не читается объект внутри объекта JSON строки  
Вложения
Тип файла: txt aboutdatadump.txt (4.0 Кб, 4 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2020, 20:30
Ответы с готовыми решениями:

Объект внутри объекта / метод внутри метода
Салам, братва. Я вроде как новичок в ООП... Не подскажите, что это такое в плане конструкции и где...

Прочитать вложенный объект внутри Json
При запросе отправляю объект Data: public class Data { public Data() =&gt; ...

Работа с json: Ссылка на объект не указывает на экземпляр объекта
вот сижу долблюсь уже часа 2 сам jscon { &quot;result&quot;: , &quot;final&quot;: true } ], ...

Получить объект, который внутри другого объекта
Создаю ScrollViewer,затем создаю StackPanel и вкладываю в него еще пару элементов TextBlock:...

6
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.09.2020, 20:51 2
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Объект с внутренними объектами JSON:
Для начала посмотри, на какой конкретно строчке отваливается, при запросе какого атрибута
Здесь, например, geo это массив, у нtго нет атрибутов latitude и longtitude
Цитата Сообщение от SkYMaaN Посмотреть сообщение
for (const auto& aboutgeo : aboutcity["geo"])
                {
                    obj.latitude = aboutgeo["latitude"].get<string>();
                    obj.longitude = aboutgeo["longtitude"].get<string>();
                }
Цитата Сообщение от SkYMaaN Посмотреть сообщение
for (const auto& abouttime : aboutdata["time"])
А разве объект должен запрашиваться через цикл? Это ж вроде не массив
1
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
28.09.2020, 20:57  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Для начала посмотри, на какой конкретно строчке отваливается, при запросе какого атрибута
Точка останова выбивает - сразу после шага со строки 11.
C++
1
obj.id = aboutdata["idx"].get<int>();
( менял на int на string, тоже ошибка )
Если пытаюсь сделать следующим образом - ничего не записывается. Смею допустить, что в переменную aboutdata уже ничего не поступает:
C++
1
2
3
4
5
6
7
8
9
    json str = str.parse(st);
    for (const auto& element : str)
    {
        jsondatatype obj;
        
        for (const auto& aboutdata : str["data"])
        {     
            ofstream test("aboutdatadump.txt");
            test << aboutdata.dump();
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это ж вроде не массив
Массив объектов V,S,TZ - если я не ошибаюсь.


Писал из своего опыта написания прошлой функции для другого сайта, всё отлично работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void client::from_JSONARRAY_ECOBOT(string& st)
{
    json str = str.parse(st);
    for (const auto& element : str)
    {
        jsondatatype obj;
        obj.id = element["id"].get<string>();
        obj.cityName = element["cityName"].get<string>();
        obj.stationName = element["stationName"].get<string>();
        obj.localName = element["localName"].get<string>();
        obj.timezone = element["timezone"].get<string>();
        obj.latitude = element["latitude"].get<string>(); //
        obj.longitude = element["longitude"].get<string>(); //
        
        for (const auto& elem : element["pollutants"])
        {         
            pollutanttype pollutantobj;
            pollutantobj.averaging_ = elem["averaging"].get<string>();
            pollutantobj.pol_ = elem["pol"].get<string>();
            try 
            { 
                pollutantobj.time_ = elem["time"].get<string>(); 
            } 
            catch(exception& ex)
            {
                continue;
            }
            pollutantobj.unit_ = elem["unit"].get <string>();
            try 
            { 
                pollutantobj.value_ = elem["value"].get<float>(); 
            } 
            catch(exception& ex)
            {
                continue; 
            }
//try нужен для обработки двух "некорректных" датчиков
            obj.pollutantvector.push_back(pollutantobj);
        }
        
        obj.stationName = element["stationName"].get<string>();
        obj.timezone = element["timezone"].get<string>();
        vec.push_back(obj);
    }
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.09.2020, 21:01 4
Цитата Сообщение от SkYMaaN Посмотреть сообщение
( менял на int на string, тоже ошибка )
Если пытаюсь сделать следующим образом - ничего не записывается:
У тебя ж на входе строка. Сделай вот так и покажи aboutdatadump.txt
C++
1
2
3
4
5
6
7
8
9
void client::from_JSONARRAY_IQAIR(string& st)
{
        ofstream test("aboutdatadump.txt");
        test << st;
 
    json str = str.parse(st);
    for (const auto& element : str)
    {
        jsondatatype obj;
0
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
28.09.2020, 21:04  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
покажи aboutdatadump.txt
Вот:
Вложения
Тип файла: txt aboutdatadump.txt (4.0 Кб, 3 просмотров)
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.09.2020, 21:07 6
Лучший ответ Сообщение было отмечено SkYMaaN как решение

Решение

Вернее
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Вот:
Там нет атрибута idx
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"status":"ok",
"data":[
{
"uid":11431,
"aqi":"102",
"time":{
"tz":"+03:00",
"stime":"2020-09-28 21:00:00",
"vtime":1601316000
},
"station":{
"name":"Pobeda-6, Geroev Avenue, 40, Dnipro, Ukraine",
"geo":[
48.408944,
35.072505
],
"url":"ukraine/dnipro/pobeda-6--geroev-avenue--40"
}
},
1
25 / 19 / 8
Регистрация: 05.04.2019
Сообщений: 338
28.09.2020, 21:10  [ТС] 7
oleg-m1973, благодарю. Название поля действительно отличается от названия поля в документации сайта, не idx а uid
0
28.09.2020, 21:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2020, 21:10
Помогаю со студенческими работами здесь

Как создать ссылку на объект внутри члена класса этого объекта
Подскажите пожалуйста, как мне создать ссылку на объект внутри члена класса этого объекта. В с++,...

Java, JSON и JSON Simple. Непонятка с созданием объекта JSON на сервере для отправки на фронт
Здравствуйте. Разрабатываю интернет-магазин на Java. Мне нужно на фронте получить список товаров из...

Ошибка преобразования json строки в объект C#
Не обращайте внимание , что все свойства типа string , это я потом поменяю. public class...

Парсинг Json строки в объект и массив
{ &quot;json&quot;: }, { &quot;tovar&quot;: } ] } string js = &quot;{ &quot;json&quot;...

Ошибка "ссылка на объект не указывает на экземпляр объекта" при разборе Json
Столкнулся с такой ошибкой компилятора: ссылка на объект не указывает на экземпляр объекта...

Целесообразно ли возвращение из функции не объекта, а Json строки?
Здравствуйте. Один товарищ сказал, что если функция возвращает Json строчку, а не объект, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru