Avro C++如何将解码得到的二进制对象转换为JSON字符串?
Avro C++ 二进制对象转JSON字符串实现方案
Avro C++库内置了JSON序列化工具,无需额外实现,核心是使用jsonEncoder配合encode函数完成转换,以下分两种场景给出具体实现:
场景1:使用代码生成的具体类型对象
如果你是通过Avro代码生成工具(avrogencpp)将Schema编译成了C++类(比如MyRecord),解码得到该类实例后,可按如下方式转换:
#include <avro/Encoder.hh> #include <avro/ValidSchema.hh> #include <avro/JsonEncoder.hh> #include <sstream> // 假设已完成解码,得到目标对象MyRecord obj,以及对应的ValidSchema schema std::ostringstream oss; // 创建JSON编码器 auto jsonEncoder = avro::jsonEncoder(schema); // 绑定输出流 jsonEncoder->init(oss); // 编码对象到JSON avro::encode(*jsonEncoder, obj); // 刷新缓冲区 jsonEncoder->flush(); // 最终JSON字符串 std::string jsonStr = oss.str();
场景2:使用通用GenericRecord对象
如果是通过通用API解码得到avro::GenericRecord实例,转换逻辑类似:
#include <avro/Generic.hh> #include <avro/Encoder.hh> #include <avro/JsonEncoder.hh> #include <sstream> // 假设已完成解码,得到avro::GenericRecord record,以及对应的ValidSchema schema std::ostringstream oss; auto jsonEncoder = avro::jsonEncoder(schema); jsonEncoder->init(oss); avro::encode(*jsonEncoder, record); jsonEncoder->flush(); std::string jsonStr = oss.str();
注意事项
- 必须使用ValidSchema:如果你的Schema是未验证的原始
Schema对象,需先转换为ValidSchema,示例:avro::ValidSchema validSchema(rawSchema); - 复杂结构支持:嵌套Record、枚举、数组、Map等类型,只要Schema定义正确,
jsonEncoder会自动处理对应的JSON结构 - 编译链接:确保编译时包含Avro C++的JSON模块,默认编译配置下该模块已启用,无需额外设置
内容的提问来源于stack exchange,提问作者JackG
相关产品推荐
相关产品推荐

