【发布时间】:2021-03-03 16:36:11
【问题描述】:
我有一个将 JSON 数据转换为 Avro 特定记录的用例。当我说 JSON 时,它是纯 JSON(不是由 Avro 生成的具有类型信息的)。我有 Avro Schema 及其生成的类。
当我尝试转换 using Avro 实用程序时,出现以下异常,
Expected start-union. Got VALUE_NUMBER_INT
如果 JSON 由 Avro 库生成,则 Avro 实用程序运行良好,因为它向其中添加了类型和联合信息。但是,在我的用例中,我有一个纯 JSON,没有其他服务生成的类型信息。
经过长期研究,我在 JIRA 中找到了未解决的问题 - https://issues.apache.org/jira/browse/AVRO-1582
上述问题是关于通用用例的,但是,我有架构及其生成的类,所以当我使用 Java 有架构时,是否有任何选项可以将 JSON 转换为 Avro 特定记录?
【问题讨论】:
-
JsonDecoder 用于阅读Avro's JSON encoding。它不是通用的 JSON 解析器。
-
对,这就是我的理解,我的用例有什么解决方案吗?
-
使用Jackson 等JSON 库将JSON 反序列化为Java 对象。
-
是的,它可以工作,但是当字段名称包含“_”时它会失败,因为 Java 生成的类删除了 getter/setter 中的下划线。一种解决方案是指定使用 addMixIn 并覆盖 setter/getter,但这看起来很 hacky。是否有任何选项/配置可以避免在生成 Avro 记录类时重命名 getter/setter 中的字段?
-
如果Jackson的ObjectMapper属性命名策略设置为PropertyNamingStrategy.SNAKE_CASE,那么Jackson会转换由下划线分隔的小写单词组成的JSON属性名称。
标签: java json avro avro-tools