Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
1

JSON данные в C++

17.09.2020, 23:06. Просмотров 830. Ответов 35
Метки нет (Все метки)

Есть код создание запроса GET и получения данных в формате JSON. А как бы с этими данными взаимодействовать, привести к нормальному виду, сравнивать там. ( Использую библиотеку boost )
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
46
47
48
49
#pragma once
#include<iostream>
#include <boost/beast.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
namespace http = boost::beast::http;
using std::string;
using std::cout;
using std::endl;
class client
{
private: 
    const string MAIN_API;
    const string API_ARGUMENTS;
    string LastData;   
public:
    client(string host, string target) : MAIN_API(host), API_ARGUMENTS(target), LastData("")
    {
 
    }
    string getResponse();
    string getLastData();
    string getFieldFromJSON(string json_, string field_);
};
 
string client::getResponse()
{
    boost::asio::io_context ioc;
    boost::asio::ip::tcp::resolver resolver(ioc);
    boost::asio::ip::tcp::socket socket(ioc);
    string argument = API_ARGUMENTS;
    boost::asio::connect(socket, resolver.resolve(MAIN_API, "80"));
    http::request<http::string_body> req(http::verb::get, argument, 11);
    req.set(http::field::host, MAIN_API);
    req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
    http::write(socket, req);
    string response;
    {
        boost::beast::flat_buffer buffer;
        http::response<http::dynamic_body> res;
        http::read(socket, buffer, res);
        response = boost::beast::buffers_to_string(res.body().data());
    }
    socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
    LastData = response;
    return response;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "jsonanalyzer.h"
using namespace std;
int main()
{
    //"api.saveecobot.com","/output.json/" - eco bot
    client obj("api.saveecobot.com","/output.json/");
    string response = obj.getResponse();
    cout << endl << response << endl;
    cout << endl << obj.getFieldFromJSON(response,"Dnipro");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2020, 23:06
Ответы с готовыми решениями:

Как распарсить данные из первого json-а и перекинуть их в другой json
Добрый день, столкнулся с такой задачей. Есть вот такой json Необходимо извлечь...

Json данные
При парсе получаю данные JSON Application. у кого-нибудь есть примеры uJSON (почитал на форуме, что...

Данные json
Пожалуйста помогите мне решить вопрос, буду очень благодарен! &lt;?php $ch = curl_init();...

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

35
Эксперт С++
8323 / 6076 / 603
Регистрация: 10.12.2010
Сообщений: 28,208
Записей в блоге: 27
18.09.2020, 00:24 2
Честного говоря не понимаю идеи использовать boost для таких задач, это блин мазохизм.
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 01:02  [ТС] 3
Цитата Сообщение от Avazart Посмотреть сообщение
Честного говоря не понимаю идеи использовать boost для таких задач, это блин мазохизм.
Ситуация следующая: мне дали мою первую работу, её суть - достать данные с сайта ht tps://www.saveec obot.com/m aps
Данные достаются в формате JSON при работе с которым я 0. После этого я должен сравнить эти данные с данными с другого сайта и результатирующий набор данных вернуть в JSON( а там уже человек положит его в БД.
Так вот если с С++ у меня хоть имеется какой-то опыт и представление азов, то с JSON впервые столкнулся. Сижу перелопачиваю тонны информации - исходя из которой выбрал библиотеку BOOST.
Доставание информации в формате JSON с последующим выводом используя тип string - я при помощи примеров горе как сделал. Используя всё те же примеры и уроки попытался реализовать функцию парсинга на основне готовых и изложенных в BOOST. Но функции выдают ошибку ( открывается реализация c breakpoint throw_exception.hpp ), хотя они практически те же что и в примерах. Вот функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string client::getFieldFromJSON(string json_, string field_)
{
    std::stringstream jsonDecoded(json_);
    boost::property_tree::ptree root;
    boost::property_tree::read_json(jsonDecoded, root);  
    if (!root.empty())
    {
        cout << endl << endl << root.get<string>(field_);
        return root.get<string>(field_);
    }
    else
    {
        cout << "Root Empty" << endl;
    }
}
Если можете помочь советом или направить в нужное русло - буду благодарен.

Добавлено через 8 минут
Я вижу реализацию так:
1. Данные из JSON конвиртируются в пользовательский тип данных с теми же полями.
2. Затем ложатся в вектор.
3. Сравниваются с такими же данными с другого сайта.
4. Данные результата конвертируются обратно в JSON.
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 01:03 4
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Есть код создание запроса GET и получения данных в формате JSON
можете показать мне образец энтих уже полученных данных?
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 01:06  [ТС] 5
Цитата Сообщение от XLAT Посмотреть сообщение
можете показать мне образец
сейчас картинку загружу, а то сюда не вставляется
вот:
ht tps://imgur .com/a/m9RHRKC

а так их предоставляет сайт для выгрузки:
htt ps://api.saveecobot.com/output.json

Вот набросал тип данных. Думаю в вектор такого типа записывать данные из JSON.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class jsondatatype
{
public:
    size_t id;
    string cityName;
    string stationName;
    string localName;
    string timezone;
    float latitude;
    float longtitude;
    string pollutantstype;
    string time;
    float countpollutants;
    string averaging;
};
1
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 01:16 6
Цитата Сообщение от SkYMaaN Посмотреть сообщение
htt ps://api.saveecobot.com/output.json
тю, да тут у вас всё готовое!
а я то думал, что вы это достаете из html и преобразуете в json
даже уже начал вам сочувствовать ...
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 01:23  [ТС] 7
Цитата Сообщение от XLAT Посмотреть сообщение
а я то думал, что вы это достаете из html и преобразуете в json
У меня используя пример с ютуба даже получилось данные в консольном приложении получить.
Не подскажете в каком направлении копать чтобы форматировать вывод ( а не кашку как на скрине получать ) и доставать пообъектно данные из JSON и ложить в:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class jsondatatype
{
public:
    size_t id;
    string cityName;
    string stationName;
    string localName;
    string timezone;
    float latitude;
    float longtitude;
    string pollutantstype;
    string time;
    float countpollutants;
    string averaging;
};
vector<mytype> v;   - сюда
Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
из html и преобразуете в json
это ведь возможно?
0
Эксперт С++
8323 / 6076 / 603
Регистрация: 10.12.2010
Сообщений: 28,208
Записей в блоге: 27
18.09.2020, 01:30 8
Я к тому что я бы использовал curl и какой нибудь rapidjson
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 01:35 9
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Не подскажете в каком направлении копать чтобы форматировать вывод
общее, но важное:
прежде всего я бы позаботился о приобретении у себя строгой спецификации на выходной формат:
это первое, что нужно сделать,
иначе вы всё время будете плавать в кофейной гуще.

вижу тут некоторую сложность в том, что вы как исполнитель не можете в полном объеме знать о том,
что может реально быть нужным заказчику,
ну, а заказчик, допустим сильно занят, чтобы добровольно уделить вам время в этом вопросе.
1
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 01:37  [ТС] 10
Цитата Сообщение от XLAT Посмотреть сообщение
спецификации на выходной формат
Это значит максимально чётко сформулировать свой тип данных?
Или имеется ввиду какого типа данные я буду отдавать после обработки?
JSON->MyType->JSON - думаю будет хорошим вариантом
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 01:40 11
Цитата Сообщение от Avazart Посмотреть сообщение
Я к тому что я бы использовал curl и какой нибудь rapidjson
на стекфлоу видел пост, где автор выложил 20 способов, читайте библиотек, как грабить сайты,
щас не могу быстро это найти для вас, но уже это не важно, а именно неважно для ТС.

Добавлено через 3 минуты
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Или имеется ввиду какого типа данные я буду отдавать после обработки?
именно это,
если это у вас работа, то за работу кто-то платит, и тот кто платит желает иметь осязаемый результат - логично?

Результат сравнения может быть какой угодно РАЗНЫЙ,
например, выделить общую часть или наоборот, выделить отличия,
или ваще зашквар с тонкостями ..
.
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 01:49  [ТС] 12
Цитата Сообщение от XLAT Посмотреть сообщение
логично
более чем.
мне дали понять, что в базу данных будет проще ложить JSON, поэтому я и решил обратно в JSON конвертировать

Добавлено через 6 минут
Цитата Сообщение от XLAT Посмотреть сообщение
Результат сравнения
не одинаковые ли данные, значения которое меньше чем полученное с другого сайта - сохраняем
это конкретно о цифре отображающей загрязнённость воздуха.
к пример на сайте "а" в Москве - 45
а на сайте "б" в Москве - 46
данные из сайта "а" предпочтительнее
но чтобы сравнить надо же JSON перевести в пользовательский тип, по крайней мере это единственное что в голову пришло
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 01:59 13
Цитата Сообщение от SkYMaaN Посмотреть сообщение
чтобы форматировать вывод ( а не кашку как на скрине получать )
после запятой пишите перенос строки '\n'
после закрывающей '}' можно два переноса.
также можно спереди добавлять ТАБы по вкусу,

хз не вижу тут ваще проблемы, это жонсон читать должен не человек, а программа,
поэтому вам должно быть пофиг на форматирование.
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 02:02  [ТС] 14
Цитата Сообщение от XLAT Посмотреть сообщение
вместо запятой пишите перенос строки '\n'
после закрывающей '}' можно два переноса.
также можно спереди добавлять ТАБы по вкусу,
Вы об этом кусочке кода? О какой запятой речь?
C++
1
2
3
        client obj("api.saveecobot.com","/output.json/");
    string response = obj.getResponse();
    cout << endl << response << endl;
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 02:04 15
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Вы об этом кусочке кода?
я про ваш скрин где данные, про который вы говорите что там каша

причем тут код и его форматирование?
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 02:20  [ТС] 16
XLAT,
вывод это
C++
1
2
3
client obj("api.saveecobot.com","/output.json/");
 string response = obj.getResponse();
 cout << endl << response << endl;
response выводится как одна строка размером в 163383 символа, и получается что редактирова вывод я не могу

Добавлено через 12 минут
как только я вывожу строку - оно бросает в меня все 163 тысячи символов, получается так
0
Эксперт С++
8323 / 6076 / 603
Регистрация: 10.12.2010
Сообщений: 28,208
Записей в блоге: 27
18.09.2020, 11:23 17

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
на стекфлоу видел пост, где автор выложил 20 способов, читайте библиотек, как грабить сайты,
щас не могу быстро это найти для вас, но уже это не важно, а именно неважно для ТС.
20 высасоных из пальца наверное. Ибо нет столько. Если исключить фреймворки то останеться только curl.
Очевидно что WinSocks, WinInet и boost/asio плохо подходят ибо низкоуровневые слишком.



Добавлено через 3 минуты
Цитата Сообщение от SkYMaaN Посмотреть сообщение
мне дали понять, что в базу данных будет проще ложить JSON, поэтому я и решил обратно в JSON конвертировать
Это как это класть json в бд ? В БД кладут данные по таблицам через библиотеки этой БД или через API сайта
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 12:58  [ТС] 18
Написал "конвертацию" если можно так назвать с JSON строки в объект класса, и обратно.
Как сделать чтобы функция from_JSON() помимо названий доставала ещё и значения?
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
jsondatatype client::from_JSON(string str)
{
    jsondatatype obj;
    boost::property_tree::ptree in;
    boost::property_tree::read_json(str, in);
    obj.id = in.get<size_t>("jsondatatype.id");
    obj.cityName = in.get<string>("jsondatatype.cityName");
    obj.stationName = in.get<string>("jsondatatype.stationName");
    obj.localName = in.get<string>("jsondatatype.localName");
    obj.timezone = in.get<string>("jsondatatype.timezone");
    obj.latitude = in.get<float>("jsondatatype.latitude");
    obj.longtitude = in.get<float>("jsondatatype.longtitude");
    obj.pollutantstype = in.get<string>("jsondatatype.pollutantstype");
    obj.time = in.get<string>("jsondatatype.time");
    obj.countpollutants = in.get<float>("jsondatatype.countpollutants");
    obj.averaging = in.get<string>("jsondatatype.averaging");
    vec.push_back(obj);
    return obj;
}
 
string client::to_JSON(jsondatatype const& obj)
{
    boost::property_tree::ptree out;
    out.put("jsondatatype.id", obj.id);
    out.put("jsondatatype.cityName", obj.cityName);
    out.put("jsondatatype.stationName", obj.stationName);
    out.put("jsondatatype.localName", obj.localName);
    out.put("jsondatatype.timezone", obj.timezone);
    out.put("jsondatatype.latitude", obj.latitude);
    out.put("jsondatatype.longtitude", obj.longtitude);
    out.put("jsondatatype.pollutantstype", obj.pollutantstype);
    out.put("jsondatatype.time", obj.time);
    out.put("jsondatatype.countpollutants", obj.countpollutants);
    out.put("jsondatatype.averaging", obj.averaging);
    std::stringstream oss;
    boost::property_tree::write_json(oss, out);
    return oss.str();
}
0
бах-бах и в продакшен!
1694 / 1005 / 381
Регистрация: 23.09.2014
Сообщений: 3,248
Записей в блоге: 4
18.09.2020, 13:09 19
Цитата Сообщение от SkYMaaN Посмотреть сообщение
Как сделать чтобы функция from_JSON() помимо названий доставала ещё и значения?
ага, вот тут самое интересное:
берёте документацию на эту функцию - читаете - профит.

обычно все любят самодокументировать,
но не все умеют это делать так, чтобы было понятно ещё кому-либо,
кроме автора.

возможно вам повезёт,
но моё имхо: написать порой с нуля под задачу в разы быстрее.
0
9 / 6 / 2
Регистрация: 05.04.2019
Сообщений: 204
18.09.2020, 13:19  [ТС] 20
Цитата Сообщение от XLAT Посмотреть сообщение
берёте документацию на эту функцию
так это мною написанная функция, она использует контейнер boost-а
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2020, 13:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Дополнительные сведения: Cannot deserialize the current JSON object (e.g. {&quot;name&quot;:&quot;value&quot;}) into...

Ошибка при обработке Json - Cannot deserialize the current JSON array because the type requires a JSON object
Всем привет! Помогите, плиз, разобраться с ошибкой: An unhandled exception of type...

Записать JSON-данные в БД
Есть json такого вида $json =' {&quot;Operation&quot;: &quot;Payment&quot;, &quot;Id&quot;: &quot;16&quot;, &quot;Price&quot;:...

Данные из json в spinner
Здравствуйте! В общем получаю к примеру json Нужно запихать это в spinner и чтобы при выборе...

PHP - Данные json
Всем привет. Выводил: &lt;?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,...

Получить данные JSON
Получаю так: $json = file_get_contents(&quot;http://api.rutracker.org/v1/static/pvc/f/7&quot;); $data =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.