nlohmann json 将键和值解析为 class
nlohmann json parsing key and value to a class
我有以下数据文件
{
"France": {
"capital": "paris",
"highpoint": "20",
},
"Germany": {
"size": "20",
"population": "5000"
}
}
我正在使用nlohmann/json解析它
我需要把它解析成一个国家class
country.h
class Country {
public:
friend void to_json(json &j , const Country &c);
friend void from_json(const json &j , Country &c);
private:
std::string _name;
std::map _detail;
to_json
和 from_json
实施
to_json(json &j, const Country &c) {
j = json{{c._name, c._detail}};
void from_json(const json& j, Item& cat){
auto c = j.get<std::map<std::string, std::map<std::string, std::string>>>();
cat._id = c.begin()->first;
cat._entry = c.begin()->second;
当我尝试从 json 获取国家/地区时,它不会像这样工作
std::ifstream in("pretty.json");
json j = json::parse(in);
Country myCountry = j.get<Country>();
我查看了文档,我唯一看到的创建 from_json 的方法是事先知道密钥,请参阅 doc
j.at("the_key_name").get_to(country._name);
有没有办法在不知道密钥的情况下解析它?在 from_json 方法中 ?
我认为您需要为 Country
的矢量而不是单个对象自定义 to/from JSON。
您需要解析 JSON 文件中的外部对象,并在解析内部映射值之前为每个对象添加名称。
#include <map>
#include <string>
#include "nlohmann/json.hpp"
#include <sstream>
#include <iostream>
using nlohmann::json;
class Country {
public:
friend void to_json(json& j, const std::vector<Country>& value);
friend void from_json(const json& j, std::vector<Country>& value);
private:
std::string _name;
std::map<std::string, std::string> _detail;
};
void to_json(json& j, const std::vector<Country>& value)
{
for (auto& c : value)
{
j[c._name] = c._detail;
}
}
void from_json(const json& j, std::vector<Country>& value)
{
for (auto& entry : j.items())
{
Country c;
c._name = entry.key();
c._detail = entry.value().get<std::map<std::string, std::string>>();
value.push_back(c);
}
}
int main()
{
try
{
std::stringstream in(R"({
"France": {
"capital": "paris",
"highpoint": "20"
},
"Germany": {
"size": "20",
"population": "5000"
}
})");
json j = json::parse(in);
std::vector<Country> myCountry = j.get<std::vector<Country>>();
json out = myCountry;
std::cout << out.dump(2);
}
catch (std::exception& ex)
{
std::cout << ex.what() << "\n";
}
}
请注意,您在问题中提供的 JSON 无效 JSON。
尽量避免使用友元函数,最好在 class 中添加 getter 和 setter 以及构造函数。
我有以下数据文件
{
"France": {
"capital": "paris",
"highpoint": "20",
},
"Germany": {
"size": "20",
"population": "5000"
}
}
我正在使用nlohmann/json解析它
我需要把它解析成一个国家class
country.h
class Country {
public:
friend void to_json(json &j , const Country &c);
friend void from_json(const json &j , Country &c);
private:
std::string _name;
std::map _detail;
to_json
和 from_json
实施
to_json(json &j, const Country &c) {
j = json{{c._name, c._detail}};
void from_json(const json& j, Item& cat){
auto c = j.get<std::map<std::string, std::map<std::string, std::string>>>();
cat._id = c.begin()->first;
cat._entry = c.begin()->second;
当我尝试从 json 获取国家/地区时,它不会像这样工作
std::ifstream in("pretty.json");
json j = json::parse(in);
Country myCountry = j.get<Country>();
我查看了文档,我唯一看到的创建 from_json 的方法是事先知道密钥,请参阅 doc
j.at("the_key_name").get_to(country._name);
有没有办法在不知道密钥的情况下解析它?在 from_json 方法中 ?
我认为您需要为 Country
的矢量而不是单个对象自定义 to/from JSON。
您需要解析 JSON 文件中的外部对象,并在解析内部映射值之前为每个对象添加名称。
#include <map>
#include <string>
#include "nlohmann/json.hpp"
#include <sstream>
#include <iostream>
using nlohmann::json;
class Country {
public:
friend void to_json(json& j, const std::vector<Country>& value);
friend void from_json(const json& j, std::vector<Country>& value);
private:
std::string _name;
std::map<std::string, std::string> _detail;
};
void to_json(json& j, const std::vector<Country>& value)
{
for (auto& c : value)
{
j[c._name] = c._detail;
}
}
void from_json(const json& j, std::vector<Country>& value)
{
for (auto& entry : j.items())
{
Country c;
c._name = entry.key();
c._detail = entry.value().get<std::map<std::string, std::string>>();
value.push_back(c);
}
}
int main()
{
try
{
std::stringstream in(R"({
"France": {
"capital": "paris",
"highpoint": "20"
},
"Germany": {
"size": "20",
"population": "5000"
}
})");
json j = json::parse(in);
std::vector<Country> myCountry = j.get<std::vector<Country>>();
json out = myCountry;
std::cout << out.dump(2);
}
catch (std::exception& ex)
{
std::cout << ex.what() << "\n";
}
}
请注意,您在问题中提供的 JSON 无效 JSON。
尽量避免使用友元函数,最好在 class 中添加 getter 和 setter 以及构造函数。