2017-02-03 3 views
0

Разрешает ли FlatBuffer преобразовывать двоичный файл fbs в JSON и из него (конечно, будет известна схема)?Преобразование FlatBuffer в JSON с разных языков

Моей идеей является определение схемы структур для трубы & архитектуры фильтра в FlatBuffer. Файлы FlatBuffer также будут обмениваться между трубами. Однако некоторые инструменты в некоторых фильтрах потребуют от меня передать простые старые json-объекты, преобразованные из файлов FlatBuffer. И у меня есть несколько языков для поддержки (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 является оригинальным автором порта JS в FlatBuffers, поэтому указанный вами проект может быть полезен, но я не думаю, что он активно его поддерживает.

В качестве альтернативы, если это выполняется на сервере, и вы можете запускать утилиты командной строки, вы можете использовать двоичный файл flatc, чтобы выполнить преобразование для вас через файл.

В идеале, на всех языках будет свой собственный собственный парсер, но это много работы по дублированию. В то время как взаимодействие с C/C++ является болью, оно имеет то преимущество, что дает вам очень быстрый парсер.

0

Конвертировать плоский буфер буфера в JSON с использованием Flat C версии (FlatCC).

Пожалуйста, обратитесь к образцу образцов в исходном пути flatcc: flatcc-master/test/json_test.

  1. Сформировать необходимые вспомогательные JSON заголовки файлов с помощью:

    flatcc_d -a --json <yourData.fbs> 
    
  2. Он будет генерировать yourData_json_printer.h. Включите этот заголовочный файл в свою программу.

  3. Изменить нижеприведенный код, чтобы он был <yourData>. Буфер - это ваш вложенный битбуфер, полученный от другого конца. Также не используйте 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"); 
    
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^