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_jsonfrom_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 以及构造函数。