2

FlatBuffer 是否允许将二进制 fbs 文件与 JSON 转换(当然模式是已知的)?

我的想法是在 FlatBuffer 中为管道和过滤器架构定义结构模式。FlatBuffer 文件也将在管道之间交换。但是,某些过滤器中的某些工具将要求我传递从 FlatBuffer 文件转换而来的普通旧 json 对象。而且我有几种语言要支持(C++、Python、Java、JS)。

我找到了一个似乎可以做到这一点的 javascript 库: https ://github.com/evanw/node-flatbuffers/

但它似乎被抛弃了,我对官方支持的方式很感兴趣。

4

2 回答 2

2

使用 Flat C 版本 (FlatCC) 很容易将 flatbuffer 缓冲区转换为 JSON。

请参考 flatcc 源路径中的示例测试:flatcc-master/test/json_test。

  1. 使用以下命令生成所需的 json 帮助头文件:

    flatcc_d -a --json <yourData.fbs>
    
  2. 它将生成 yourData_json_printer.h。在你的程序中包含这个头文件。

  3. 修改以下代码以适应<yourData>. buffer 是从另一端接收到的 flatbuffer 输入。也不要使用 sizeof() 从 bufferSize 获取 flatbuffer。在调用此函数之前打印缓冲区大小

    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");
    
    }
    
于 2017-06-29T01:25:30.230 回答
2

只有 C++ 开箱即用地提供此功能。

对于其他语言,您可以包装 C++ 解析器/生成器,然后调用它(参见例如 Java: http: //frogermcs.github.io/json-parsing-with-flatbuffers-in-android/)。

@evanw 是 Fl​​atBuffers 中 JS 端口的原作者,所以你提到的项目可能是可用的,但我认为他不再积极维护它了。

或者,如果它在服务器上运行并且您可以运行命令行实用程序,则可以使用flatc二进制文件通过文件为您进行转换。

理想情况下,所有语言都有自己的本地解析器,但要复制的工作量很大。虽然与 C/C++ 交互很痛苦,但它的优势在于为您提供了一个非常快速的解析器。

于 2017-02-03T01:33:37.677 回答