模式查询和 JSON 数据转换

Queries on schema and JSON data conversion

我们已经在我们的软件代码中嵌入了 flatbuffer 库,用于生成具有 JSON 输出数据的简单模式。

更多更新: 我们正在使用 flatc 编译器针对模式生成头文件,并将这些文件与 FB 库一起集成到我们的代码中以进一步 serialization/deserialization。

现在我们还需要支持以下模式树。

namespace SampleNS;

/// user defined key value pairs to add custom metadata
/// key namespacing is the responsibility of the user
table KeyValue {
    key:string (key, required); 
    value:string (required);
}

enum SchemaVersion:byte {
    V1,
    V2
}

table Sometable {
    value1:ubyte;
    value2:ushort (key);
}

table ComponentData {
    inputs: [Sometable];
    outputs: [Sometable];
}

table Node {
    name:string (key);
    
    /// IO definition
    data:ComponentData;
            
    /// nested child
    child:[Components];
}

table Components {
    type:ubyte;
    index:ubyte;
    nodes:[Node];
}

table GroupMasterData {

    schemaversion:SchemaVersion = sampleNS::SchemaVersion::V1;

    metainfo:[KeyValue];

    /// List of expected components in the system
    components:[Components];
}

root_type GroupMasterData;

如上所示,table Components 是递归嵌套的。目的是组件可能有具有相同字段的子组件。

我有几个问题:

他们是否 API 设置我们传递给编译器参数的 Flatbuffer 选项?或者如果没有,我认为我们可能必须修改 FB 库代码。请提出建议。

方法一: 在我们的序列化方法中,我们这样做:

flatbuffers::Parser* parser = new flatbuffers::Parser();
parser->opts.output_default_scalars_in_json = true;

这是正确的方法还是我应该使用其他方法API?

  • 是的,完全支持树(甚至 DAG)结构。类型定义是递归的,但数据最终将具有带有空子向量的叶节点,大概。
  • V1 的整数值为 0,这也是所有未指定明确默认值的字段的默认值。转换时使用--defaults-json可以看到这个字段。请注意,模式中的显式版本是一种反模式,因为模式自然可以进化而不会破坏向后兼容性。
  • 您可以将枚举字段放入结构中,是的。是这个意思吗?