2017-02-03 32 views
0

FlatBufferはバイナリfbsファイルをJSONとの間で変換できますか(もちろんスキーマはわかります)?FlatBufferをさまざまな言語からJSONに変換する

私の考えは、FlatBufferのパイプ&フィルタアーキテクチャの構造のスキーマを定義することです。 FlatBufferファイルもパイプ間で交換されます。しかし、フィルタの中には、FlatBufferファイルから変換された普通の古いjsonオブジェクトを渡す必要があるツールがあります。私はいくつかの言語をサポートしています(C++、Python、Java、JS)。

私はこれを行うには思わJavaScriptライブラリ見つけた: https://github.com/evanw/node-flatbuffers/

をしかし、それはabdondenedと私は公式にサポートされている方法ではなく、興味があるようです。

答えて

1

C++だけがこの機能をそのまま使用できます。

他の言語の場合は、C++パーサー/ジェネレータをラップして呼び出すことができます(Javaの場合はhttp://frogermcs.github.io/json-parsing-with-flatbuffers-in-android/を参照)。

@evanwはFlatBuffersのJSポートの元の作者なので、あなたが言及しているプロジェクトは使用可能かもしれませんが、彼は積極的にこれを管理しているとは思われません。

また、これがサーバー上で実行され、コマンドラインユーティリティを実行できる場合は、flatcバイナリを使用してファイルを使用して変換を実行できます。

理想的には、すべての言語に独自のネイティブパーサーがありますが、それは複製する作業の多くです。 C/C++とのインターフェースは苦痛ですが、それはあなたに本当に速いパーサーを与える利点があります。

0

FlatCバージョン(FlatCC)を使用してフラットバッファバッファをJSONに簡単に変換できます。

flatccソースパス:flatcc-master/test/json_testのサンプルテストを参照してください。

  1. 使用して、必要なJSONヘルパーのヘッダファイルを生成します。

    flatcc_d -a --json <yourData.fbs> 
    
  2. をそれはyourData_json_printer.hを生成します。このヘッダーファイルをプログラムに含めます。

  3. <yourData>に適合するように以下のコードを変更してください。 bufferは、相手側から受信したフラットバッファ入力です。 また、flatfufferのbufferからbufferSizeを取得するためにsizeof()を使用しないでください。

    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"); 
    
    } 
    
この 関数を呼び出す前にBUFFERSIZEを印刷
関連する問題