Json nlohmann : универсальная функция, возвращающая значение, состоящее из нескольких ключей

#c #json

Вопрос:

Мне нужна функция для получения содержимого значения, для доступа к которому требуется более одного ключа. В приведенном ниже примере я успешно получаю значение file_content["happy"] , но как написать свою функцию get() , чтобы принимать более одного ключа, например, для доступа file_content["answer"]["everything"] ?

Обратите внимание, что это может быть более 2 ключей.

 #include <nlohmann/json.hpp>
#include <string>
#include <fstream>
#include <iostream>


using json = nlohmann::json;

class My_config {
    public:
    My_config(const std::string config_path) {
        // Open and read Configuration file
        std::ifstream ifs(config_path);
        if (ifs.is_open()) {
            file_content = json::parse(ifs);
            ifs.close();
        }
    }

    json get(std::string key) {
        return file_content[key];
    }

    private:
    json file_content;
};

int main() {
    auto my_conf = My_config("../test.json");

    std::cout << "Get happy : " << my_conf.get("happy") << std::endl;
    
    // How to get ["answer"]["everything"] ?
    std::cout << "Get [answer][everything] : " << my_conf.get("answer", "everything") << std::endl;

    return 0;
}
 

тест.json :

 {
    "answer": {
        "everything": 42
    },
    "happy": true
}
 

Комментарии:

1. Зачем нужна эта функция? Почему бы не выставить постоянное представление file_content напрямую?

2. На самом деле мне нужно знать, когда мой file_content json изменяется или считывается для вызова определенной функции. @Холт, у тебя есть лучший способ сделать это ?

Ответ №1:

Использование цикла должно выполнить эту работу:

 json get(std::initializer_list<std::string> keys) {
    json data = file_content;
    for (autoamp; key : keys) {
        data = data[key];
    }
    return data;
}
 

требуется дополнительная {} плата на месте вызова:

 my_conf.get({"answer", "everything"});