幸运的是,C++没有提供简单的方法来模糊网络通信内容和程序源代码之间的界限。类似于所有那些可怕的基于反射的 JSON库不可能发生在C++中。巧合的是,虽然我不能说C#,但基于反射的Java语言JSON库严重违反了Joshua Bloch着名的Effective Java书中列出的最佳实践。见第53项,宁可反射接口:
作为一项规则,对象不应该反思在正常 应用程序在运行时
访问在C++中,我们并不需要这样一个准则,因为没有反映。这主要是好的事情。
现在,这并不是说您必须编写自己的JSON解析器,当然。虽然JSON解析不是标准库的一部分,但存在第三方替代方案。例如,看看JSON for Modern C++。
无论您使用哪种图书馆,您都必须明确以某种方式读取和写入您的班级成员。
也就是说,如果有下面的类(其或多或少匹配你链接的C#示例):
struct Product
{
std::string name;
int price;
std::vector<std::string> sizes;
};
然后与上述的库,就不得不把一个Product
对象到JSON像这样:
json j = {
{ "name", product.name }, // explicit relationship between "name" and "name"
{ "price", product.price }, // explicit relationship between "price" and "price"
{ "sizes", product.sizes } // explicit relationship between "sizes" and "sizes"
};
std::cout << j << "\n";
和阅读:
json j;
std::cin >> j;
Product product;
product.name = j["name"]; // explicit relationship between "name" and "name"
product.price = j["price"]; // explicit relationship between "price" and "price"
product.sizes = j["sizes"]; // explicit relationship between "sizes" and "sizes"
这样的一种方法也被称为非侵入式序列化/反序列化。另一方面,与成员或friend
函数相比,一个入侵方法将是唯一需要访问私有成员变量的方法。
事情要记住:
- 运行时反射是危险的,容易出错,其中支持的语言。
- C++没有运行时反射。 (1)JSON解析,(2)类的序列化/反序列化。
- 存在用于JSON解析的免费第三方库。
参见响应http://stackoverflow.com/a/39904347/606515。 – kola