将FlatBuffer转换为各种语言的JSON

时间:2017-02-03 01:09:39

标签: flatbuffers

FlatBuffer是否允许将二进制fbs文件转换为JSON(当然,架构是已知的)?

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

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

但它似乎已经过时了,我对官方支持的方式很感兴趣。

2 个答案:

答案 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。

  1. 使用以下方法生成所需的json助手头文件:

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

  3. 修改以下代码以适合<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");
    
    }