avro::jsonEncoder 和 union

问题描述 投票:0回答:1

我在

data_avro.json
文件中有以下 avro 架构定义:

[
 {
     "namespace": "my.data",
     "type": "record",
     "name": "Data1",
     "fields" : [
         {"name": "i", "type": "int"}
     ]
 },
 {
     "namespace": "my.data",
     "type": "record",
     "name": "Data2",
     "fields" : [
         {"name": "u", "type": "double"},
         {"name": "val", "type": "int"}
     ]
 }
]

现在,我正在尝试像这样编码数据:

avrodata::Data1 data1;
data1.i = 1;

avrodata::Data2 data2;
data2.val = 0;
data2.u = 2.5;

std::ifstream ifs("data_avro.json");
avro::ValidSchema schemas;

std::string err;

if (!avro::compileJsonSchema(ifs, schemas, err))
    std::cerr << "compileJsonSchema error : " << err << std::endl;
else
    std::cout << "compileJsonSchema success" << std::endl;

auto encoder = avro::jsonEncoder(schemas);
auto out = avro::memoryOutputStream();
encoder->init(*out);

avro::encode(*encoder, data1); // avro::Exception is thrown here

但是有错误,输出是:

compileJsonSchema success
terminate called after throwing an instance of 'avro::Exception'
  what():  Invalid operation. Expected: Int got Union
然而,

avro::binaryEncoder
似乎比
avro::jsonEncoder
工作得更好。 如何使用
avro::jsonEncoder
来编码这些数据?

谢谢你。

c++ avro
1个回答
0
投票

正如我在评论中提到的,我曾经/正在面临与您相同(或至少相似)的问题。即使这可能无法解决您的问题,它至少应该提供一些清晰的信息。

正如我所怀疑的,问题在于你的

data_avro.json
。 (旁注:看起来约定是使用
.avsc
文件扩展名而不是
av
ro schemas 的 .json)。

为了使

jsonEncoder
正常工作,您使用的架构不得被
[ ... ]
包围。更准确地说,您的架构似乎必须是单个
record
,在顶层由一对
{ ... }
包围。

我最初也有一个

.avsc
,其中
[ ... ]
位于顶层,以便能够重用
record
并避免复制粘贴错误...一旦我愚蠢地将所有记录粘贴到一个单一的、巨大的记录中,就我而言,
jsonPrettyEncoder
效果很好。

对于您来说,这意味着您需要将模式拆分为 2 个文件,如下所示:

// Data1.avsc:
{
 "namespace": "my.data",
 "type": "record",
 "name": "Data1",
 "fields" : [
     {"name": "i", "type": "int"}
 ]
}

// Data2.avsc:
{
 "namespace": "my.data",
 "type": "record",
 "name": "Data2",
 "fields" : [
     {"name": "u", "type": "double"},
     {"name": "val", "type": "int"}
 ]
}
© www.soinside.com 2019 - 2024. All rights reserved.