java - 使用 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 真的允许可选的字符串字段吗?这是一个错误吗?我错过了什么?
解决方案
我的理解是否正确,Avro 真的允许可选的字符串字段吗?
是的,Avro 支持null
和string
我错过了什么?
Avro JSON 编码器的工作方式与您的预期不同。如https://avro.apache.org/docs/current/spec.html#json_encoding中所述,联合使用类型信息作为字典进行编码,而不仅仅是值。Avro 票务跟踪器中有一个未解决的问题,要求您提供您正在寻找的格式,但尚未解决:https ://issues.apache.org/jira/browse/AVRO-1582
推荐阅读
- javascript - Vue - 如何在甜蜜警报中加载组件?
- domain-driven-design - DDD 战略设计:共享内核模式与发布语言模式
- spring - 如何使用 Spring Boot Crudrepository 将数据插入到同一数据库中的 2 个表中?
- flutter - 如何使用 extendBodyBehindAppBar = false 使 SliverAppbar 像 Scaffold Appbar
- android - DialogFragment的width和height是wrap content,但是我在attributes中写了match parent
- assembly - 当涉及到二叉树时,如何在汇编语言中将一个节点相互链接?
- python - Python:ElementTree 中 NoneType 的解决方法
- sql - Laravel 查询生成器 从子查询中选择
- c# - 使用 AddFontResourceW 后跟 SendMessage 添加字体时,InstalledFontCollection 未实现
- c++ - 堆栈数据结构括号匹配