c++ 如何将一个类的第一个构造函数参数设置为nlohmann::json对象?

5ktev3wc  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个类,它需要一个nlohmann::json对象作为它的第一个构造函数参数。我已经为我的类实现了to_jsonfrom_json,但是from_json不会被调用(除非我显式地调用它),并且默认的非结构化只是将整个对象放入json参数中。下面是一些示例代码。

  1. #include <iostream>
  2. #include "nlohmann/json.hpp"
  3. using json = nlohmann::json;
  4. class ExampleClass
  5. {
  6. public:
  7. ExampleClass(json data = json::object(), std::string some_string = "") : m_Data(data), m_String(some_string) {}
  8. ~ExampleClass() {}
  9. json m_Data;
  10. std::string m_String;
  11. };
  12. void to_json(json& j, const ExampleClass& example)
  13. {
  14. j = json{ {"Data", example.m_Data}, {"String", example.m_String} };
  15. }
  16. void from_json(const json& j, ExampleClass& example)
  17. {
  18. j.at("Data").get_to(example.m_Data);
  19. j.at("String").get_to(example.m_String);
  20. }
  21. int main()
  22. {
  23. ExampleClass example(json{ {"key", "value"} }, "here's a string");
  24. std::cout << json(example) << std::endl; // {"Data":{"key":"value"},"String":"here's a string"}
  25. ExampleClass example_two = json::parse("{\"Data\":{\"key\":\"value\"},\"String\":\"here's a string\"}");
  26. std::cout << json(example_two) << std::endl; // {"Data":{"Data":{"key":"value"},"String":"here's a string"},"String":""}
  27. ExampleClass example_three;
  28. from_json(json::parse("{\"Data\":{\"key\":\"value\"},\"String\":\"here's a string\"}"), example_three);
  29. std::cout << json(example_three) << std::endl; // {"Data":{"key":"value"},"String":"here's a string"}
  30. }

字符串
正如你所看到的,显式调用我写的from_json方法可以正常工作,但我已经读到你不应该这样做。我在项目中的其他地方对几十个类使用了这种模式,只有需要json对象作为第一个(或唯一的)构造函数参数的类遇到了这个问题。把一个非json参数放在第一个会让一切正常工作,但我不明白我做错了什么这对我不起作用

tv6aics1

tv6aics11#

问题是你实际上并不想在example_two的情况下调用构造函数。因此,你应该让你的构造函数explicit来避免意外调用。

  1. class ExampleClass
  2. {
  3. public:
  4. explicit ExampleClass(json data = json::object(), std::string some_string = "") : m_Data(data), m_String(some_string) {}
  5. ~ExampleClass() {}
  6. json m_Data;
  7. std::string m_String;
  8. };

字符串
演示:https://godbolt.org/z/Tr1YxTa5j

相关问题