Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/92: Рейтинг темы: голосов - 92, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 06.01.2019
Сообщений: 15
1

Библиотека JSON, чтение файла

17.01.2019, 11:34. Показов 16995. Ответов 6
Метки нет (Все метки)

Использую следующую библиотеку JSON для C++ - https://github.com/nlohmann/json, по ней так же имеется статья на русском - https://habr.com/ru/company/infopulse/blog/254075/
Проблема заключается в том, что я не могу отыскать, как же парсить, читать определенные значения идентификатора непосредственно с файла JSON. К примеру, файл JSON выглядит так:
JSON
1
{"Settings":{"AutoReload":true,"CheckingUpdates":false}}
И необходимо получить значение Settings -> AutoReload, получить значение Settings -> CheckingUpdates, но как это сделать?
Может кто-то посоветует сменить библиотеку? Смотрел RapidJSON и jsonCPP, но не понял, каким образом там создаются объекты.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2019, 11:34
Ответы с готовыми решениями:

JSON библиотека
Как и распарсить так и сбилдить. Что бы кушало utf-16,и было совместимо с visual studio.Есть ли...

Работа с Json-файлами. Библиотека jsoncpp C+
Здраствуйте. Начал работу с json-файлами. С подключением всё нормально, но как только начинаю...

Json c++ send end write - существует ли готовая библиотека
Здрасте, нужна такая штука которая бы умела посылать json обьекты методом post на кукую-нить...

Чтение JSON-файла с помощью Newtonsoft.Json
И так, у нас есть JSon-файл вот такого типа: { "objects": { ...

6
884 / 340 / 78
Регистрация: 17.05.2015
Сообщений: 1,095
17.01.2019, 12:10 2
Лучший ответ Сообщение было отмечено harryss как решение

Решение

Цитата Сообщение от harryss Посмотреть сообщение
И необходимо получить значение Settings -> AutoReload, получить значение Settings -> CheckingUpdates, но как это сделать?
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
#include <iostream>
 
#include <nlohmann/json.hpp>
 
using json = nlohmann::json;
 
int main()
{
    json config = {
        "Settings": {
            "AutoReload"      :true,
            "CheckingUpdates" :false
        }
    };
    
    const auto& settings = config["Settings"];
    
    const bool auto_reload 
        = settings.at("AutoReload").get<bool>();
    
    const bool checking_updates 
        = settings.at("CheckingUpdates").get<bool>();
 
    std::cout << "auto_reload = "      << auto_reload << '\n';
    std::cout << "checking_updates = " << checking_updates << '\n';
    
}
Цитата Сообщение от harryss Посмотреть сообщение
Может кто-то посоветует сменить библиотеку?
На мой взгляд, nlohmann - самая лучшая на сегодняшний день библиотека для json)))

Сочетает в себе такие качества, как эконочичность, быстродействие и высокое юзабилити.
Главная киллер-фича nlohmann - тщательно продуманные, настроенные,
готовые к употреблению из коробки, удобные средства сериализации/десериализации.

другие представленные либки не дотягивают)))

Цитата Сообщение от harryss Посмотреть сообщение
jsonCPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <jsoncpp/json/json.h> // or something
 
using namespace std;
 
int main() {
    // create the characters array
    Json::Value ch;
    ch[0]["name"] = "Jabberwock";
    ch[0]["chapter"] = 1;
    ch[1]["name"] = "Cheshire Cat";
    ch[1]["chapter"] = 6;
    ch[2]["name"] = "Mad Hatter";
    ch[2]["chapter"] = 7;
 
    // create the main object
    Json::Value val;
    val["book"] = "Alice in Wonderland";
    val["year"] = 1865;
    val["characters"] = ch;
 
    cout << val << '\n';
}
Цитата Сообщение от harryss Посмотреть сообщение
RapidJSON
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
// rapidjson/example/simpledom/simpledom.cpp`
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
 
using namespace rapidjson;
 
int main() {
    // 1. Parse a JSON string into DOM.
    const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
    Document d;
    d.Parse(json);
 
    // 2. Modify it by DOM.
    Value& s = d["stars"];
    s.SetInt(s.GetInt() + 1);
 
    // 3. Stringify the DOM
    StringBuffer buffer;
    Writer<StringBuffer> writer(buffer);
    d.Accept(writer);
 
    // Output {"project":"rapidjson","stars":11}
    std::cout << buffer.GetString() << std::endl;
    return 0;
}
2
0 / 0 / 0
Регистрация: 06.01.2019
Сообщений: 15
17.01.2019, 12:31  [ТС] 3
Большое спасибо, огромное!
0
884 / 340 / 78
Регистрация: 17.05.2015
Сообщений: 1,095
17.01.2019, 12:42 4
Цитата Сообщение от harryss Посмотреть сообщение
json :: parse()
Не нужно.
Загрузка из файла осуществляется так:

C++
1
2
3
4
5
6
7
8
9
10
        std::ifstream src(filename);
        if(!src)
            throw std::runtime_error(
                "[load] can not open the file '" + filename + "'"
            );
 
        Json     jsn;
        src   >> jsn;
 
        // дальше работаем с jsn
Добавлено через 1 минуту
Цитата Сообщение от harryss Посмотреть сообщение
// Как работать с полученным gotten_obj далее?
C++
1
2
3
4
5
6
7
8
9
10
    const auto& settings = gotten_obj ["Settings"];
    
    const bool auto_reload 
        = settings.at("AutoReload").get<bool>();
    
    const bool checking_updates 
        = settings.at("CheckingUpdates").get<bool>();
 
    std::cout << "auto_reload = "      << auto_reload << '\n';
    std::cout << "checking_updates = " << checking_updates << '\n';
1
2228 / 1731 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
17.01.2019, 13:11 5
Цитата Сообщение от harryss Посмотреть сообщение
получить значение Settings -> AutoReload, получить значение Settings -> CheckingUpdates, но как это сделать?
через 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
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
namespace bpt = boost::property_tree;
 
 
int main()
{
    try
    {
        std::ifstream ifs{"in.json"};
        if (!ifs.is_open())
        {
            throw std::runtime_error{"Unable to open file"};
        }
 
        bpt::ptree pt;
        bpt::read_json(ifs, pt);
        bool sar = pt.get<bool>("Settings.AutoReload");
        bool scu = pt.get<bool>("Settings.CheckingUpdates");
        std::cout << std::boolalpha << sar << '\n' << scu << std::endl;
 
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}
0
0 / 0 / 0
Регистрация: 06.01.2019
Сообщений: 15
17.01.2019, 17:04  [ТС] 6
eva2326,
Я тогда поспешил с написанием сообщения, разобрался, но за данный ответ все-равно большое спасибо.
Если есть возможность, то хочу задать еще один вопрос. Не отыскал в документации то, как изменять значение содержимого .JSON, переписывать.

Добавлено через 3 часа 33 минуты
Ребяты, по-прежнему нуждаюсь в помощи.
Разобраться в том, как изменять, перезаписывать значения самого .JSON файла.
0
2 / 2 / 3
Регистрация: 04.12.2015
Сообщений: 113
25.01.2019, 19:17 7
eva2326, Вы можете набросать небольшой ХелпМи для того, чтобы скомпилировать свой "nlohmann/json.hpp" из исходниов гитхаба?
У меня проблема, VS2015 апдейт1 отказывается работать с этим файлом выплевывая ошибку
Код
 error C2100: недопустимое косвенное обращение
Ошибка ссылкой идет в код
C++
1
2
3
4
5
6
// taken from ranges-v3
template<typename T>
struct static_const
{
    static constexpr T value{};
};
По видимому сборка только для релиса VS2017 или хотябы Апдейт3 на VS2015

Добавлено через 1 час 54 минуты
Не дождался ответ, рискнул, обновил VS2015 до апдейта 3, включить в проект json.hpp получилось.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2019, 19:17

Чтение JSON - файла
Помогите считать данные с json'а. Есть файл с таким вот содержимым: { &quot;URLS&quot;: } Нужно...

Чтение JSON файла
Здравствуйте! Только начал работать с json, нужна помощь знающих. Помогите пожалуйста с проблемой:...

Чтение из файла / json
Хелп, нужна помощь, не могу понять в чем проблема. if (radioButton3.Checked) { ...

Чтение JSON файла
Здравствуйте, имеется следующий по структуре JSON файл: { &quot;results&quot;: Прочитал...


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

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

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