FlatBuffer是否允许将二进制fbs文件转换为JSON(当然,架构是已知的)?
我的想法是在FlatBuffer中定义管道和过滤器架构的结构模式。 FlatBuffer文件也将在管道之间交换。但是,某些过滤器中的某些工具需要我传递从FlatBuffer文件转换而来的普通旧json对象。我有几种语言可以支持(C ++,Python,Java,JS)。
我找到了一个似乎这样做的javascript库: https://github.com/evanw/node-flatbuffers/
但它似乎已经过时了,我对官方支持的方式很感兴趣。
答案 0 :(得分:2)
只有C ++提供开箱即用的功能。
对于其他语言,您可以包装C ++解析器/生成器,并调用它(例如,参见Java:http://frogermcs.github.io/json-parsing-with-flatbuffers-in-android/)。
@evanw是FlatBuffers中JS端口的原作者,所以你提到的项目可能是可用的,但我认为他不再积极维护它了。
或者,如果它在服务器上运行并且您可以运行命令行实用程序,则可以使用flatc
二进制文件通过文件为您进行转换。
理想情况下,所有语言都有自己的本机解析器,但复制需要做很多工作。虽然与C / C ++接口很麻烦,但它具有为您提供非常快速的解析器的优势。
答案 1 :(得分:1)
使用Flat C版本(FlatCC)很容易将flatbuffer缓冲区转换为JSON。
请参考flatcc源路径中的示例测试:flatcc-master / test / json_test。
使用以下方法生成所需的json助手头文件:
flatcc_d -a --json <yourData.fbs>
它将生成yourData_json_printer.h。在程序中包含此头文件。
修改以下代码以适合<yourData>
。 buffer是从另一端收到的flatbuffer输入。
另外,不要使用sizeof()从缓冲区获取缓冲区用于缓冲区。在调用之前打印buffersize
功能
void flatbufToJson(const char *buffer, size_t bufferSize) {
flatcc_json_printer_t ctx_obj, *ctx;
FILE *fp = 0;
const char *target_filename = "yourData.json";
ctx = &ctx_obj;
fp = fopen(target_filename, "wb");
if (!fp) {
fprintf(stderr, "%s: could not open output file\n", target_filename);
printf("ctx not ready for clenaup, so exit directly\n");
return;
}
flatcc_json_printer_init(ctx, fp);
flatcc_json_printer_set_force_default(ctx, 1);
/* Uses same formatting as golden reference file. */
flatcc_json_printer_set_nonstrict(ctx);
//Check and modify here...
//the following should be re-written based on your fbs file and generated header file.
<yourData>_print_json(ctx, buffer, bufferSize);
flatcc_json_printer_flush(ctx);
if (flatcc_json_printer_get_error(ctx)) {
printf("could not print data\n");
}
fclose(fp);
printf("######### Json is done: \n");
}