【问题标题】:Convert JSON (not generated by AVRO) to Avro Specific Record将 JSON(不是由 AVRO 生成)转换为 Avro 特定记录
【发布时间】: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


【解决方案1】:

您可以使用json-avro-converter library。它在没有额外类型信息的情况下解码纯 json。

【讨论】:

    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2020-07-13
    • 2020-05-20
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多