【问题标题】:Avro schema: Cannot make fields optionableAvro 架构:无法使字段可选
【发布时间】:2021-08-26 16:57:18
【问题描述】:

我在我的 avro 架构中定义了一个字段,如下所示。

                {
                  "name": "currency",
                  "type": ["null","string"],
                  "default": null
                },

我收到一些不包含字段货币的 json 数据,它总是抛出这个错误。

Expected field name not found: currency

我使用以下代码将其转换为通用对象。

       DecoderFactory decoderFactory = new DecoderFactory();
        Decoder decoder = decoderFactory.jsonDecoder(schema, eventDto.toString());
        DatumReader<GenericData.Record> reader =
                new GenericDatumReader<>(schema);
        GenericRecord genericRecord = reader.read(null, decoder);

大多数 stackoverflow 和 github 答案表明我在上面所做的应该使这些字段成为可选的并且应该可以正常工作。但这似乎对我不起作用。有没有办法解决这个问题。

【问题讨论】:

  • 你在用什么库?
  • @SimranTea avro maven 依赖项。 1.10.2版

标签: java json avro


【解决方案1】:

这是一个很常见的误解。当未找到字段时,Java JSON 解码器不使用默认值。这是因为 JSON 编码器在创建 JSON 时会包含该字段,因此解码器希望该字段存在。

如果您想支持它以您期望的方式使用默认值,您可以在 their tracker here 上找到类似的问题并添加评论。

【讨论】:

  • 所以必须明确给出空字段?
  • 如果您使用的是 Avro JSON 编码器,它将写出那些空字段。这里的问题是尝试解码使用 Java 库当前不支持的旧模式生成的任意 JSON 或 JSON。
猜你喜欢
  • 2014-09-16
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2021-06-26
  • 2022-01-02
  • 2018-04-16
相关资源
最近更新 更多