首页 > 解决方案 > 使用 AVRO 编码可选字符串

问题描述

我正在使用 Avro 版本 1.10.2

我有以下架构,optionalField作为可选的 JSON 字符串:

{
  "namespace": "foo.bar",
  "name": "FooBar",
  "type": "record",
  "fields": [
    {
      "name": "optionalField",
      "type": [
        "null",
        "string"
      ]
    }
  ]
}

我使用 Avro Maven 插件来执行代码生成。

但是,当我使用以下代码对该对象的实例进行编码时:

FooBar fooBar = FooBar.newBuilder()
                .setOptionalField("value")
                .build();

Schema schema = fooBar.getSchema();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Encoder jsonEncoder = EncoderFactory.get().jsonEncoder(schema, byteArrayOutputStream);
SpecificDatumWriter<Object> writer = new SpecificDatumWriter<>(schema);
writer.write(fooBar, jsonEncoder);
jsonEncoder.flush();

System.out.println(byteArrayOutputStream.toString());

输出是:

{"optionalField":{"string":"value"}}

而不是我所期望的:

{"optionalField":"value"}

据我所知,Avro 规范中的任何内容似乎都没有暗示只有记录可以是可选的。此外,在工会下:

如上所述,联合使用 JSON 数组表示。例如,["null", "string"] 声明一个模式,它可以是 null 也可以是字符串。

我的理解是否正确,Avro 真的允许可选的字符串字段吗?这是一个错误吗?我错过了什么?

标签: javaavro

解决方案


我的理解是否正确,Avro 真的允许可选的字符串字段吗?

是的,Avro 支持nullstring

我错过了什么?

Avro JSON 编码器的工作方式与您的预期不同。如https://avro.apache.org/docs/current/spec.html#json_encoding中所述,联合使用类型信息作为字典进行编码,而不仅仅是值。Avro 票务跟踪器中有一个未解决的问题,要求您提供您正在寻找的格式,但尚未解决:https ://issues.apache.org/jira/browse/AVRO-1582


推荐阅读