比如在java中,将json字符串转为对象可以用gson,转的方式大致如下:
public static <T> T json2obj(String json, Class<T> clz) {
Gson gson = new Gson();
T object = gson.fromJson(json, clz);
return object;
}
这是一个通用的方法,将json字符串转为对象,不用关心对象里面的字段名称;我现在刚接触c++,在http请求服务器后解析json,每个http请求所返回的字段都不一样,是否也可以像java一样写一个统一的转换方法,而不是给每个请求的每个字段都写一个转换并赋值的方法
不可以,因为c++的类缺少元数据(metadata),因此无法实现java那样的反射(rtti/dc)
不过作为变通,可以在C++里定义一种支持递归的通用类型结构,来接受你json的数据(具体类结构模型,你可以参考微软的 IHTMLDocument 接口的实现方式)
用jsoncpp这个库吧 (https://github.com/open-source-parsers/jsoncpp ), 像java那样直接解析成类是不可以的。
#include <json/reader.h>
Json::CharReaderBuilder b;
Json::CharReader* reader (b.newCharReader());
Json::Value root;
Json::Value valu;
JSONCPP_STRING errs;
bool ok = reader->parse(message, message + std::strlen(message), &root, &errs);
if (!ok) {
delete reader;
return;
}
if (!(valu = root["name"]).isNull()) {
...;
}
用我的库吧:https://github.com/leoxiaofei/msserialization
应该也是实现,参考protobuf的方法,定义一个对象转的基类,写一个对象定义工具。生成类似.proto文件,保存对象的名称、命名空间、还有每个字段的名称、类型。再写一个代码生成工具,自动生成头文件和源文件,每个类都从基类继承。就可以实现任意对象(通过工具生成的)objecttojson、objectfromjson转换。