查询模式和JSON数据转换



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

更多更新:我们使用flatc编译器根据模式生成头文件,并将这些文件与FB库集成到我们的代码中,以便进一步序列化/反序列化。

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

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;

如上所述,表Components是递归嵌套的。目的是组件可以有具有相同字段的子组件。

我有几个查询:

  • Flatc在架构编译时没有给我任何错误递归嵌套表。但这在现场得到支持吗对这些表的访问?
  • 我试图根据上述数据生成一个示例json数据文件,但我我看不出有什么阴谋诡计。我知道facebook没有序列化默认值。所以,我去掉了默认值在模式中分配。但是,它仍然没有写入json数据文件。在这一点上,我还了解到我们可以强制写入文件使用force_defaults选项。我不知道这是怎么回事将:放在属性中还是放在其他地方?
  • 我可以创建枚举字段的结构体吗?

是否有任何API来设置Flatbuffer选项,否则我们将传递给编译器参数?或者如果没有,可能是我认为我们必须修补FB库代码。请建议。

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

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

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

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

最新更新