Java 使用AVRO编码可选字符串

Java 使用AVRO编码可选字符串,java,avro,Java,Avro,我使用的是Avro版本1.10.2 我有以下模式,可选JSON字符串为optionalField: { "namespace": "foo.bar", "name": "FooBar", "type": "record", "fields": [ { "name": "optionalFiel

我使用的是Avro版本1.10.2

我有以下模式,可选JSON字符串为
optionalField

{
  "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":"value"}
据我所知,中的任何内容似乎都不意味着只有记录是可选的。此外,根据工会:

如上所述,联合使用JSON数组表示。例如,[“null”,“string”]声明的模式可以是null或string

我的理解正确吗?Avro真的允许可选字符串字段吗?这是虫子吗?我错过了什么

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

是,Avro支持
null
string

我错过了什么


Avro JSON编码器的工作方式与您预期的不同。如中所述,使用类型信息将联合编码为字典,而不仅仅是值。Avro票证跟踪器中有一个悬而未决的问题,它询问您正在寻找的格式,但尚未解决:

我在这里发现了一个类似的问题:。我要试一试。与此同时,我把这个问题标记为重复问题。
{"optionalField":"value"}