#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"});