【问题标题】:json encoding of avro unionavro union的json编码
【发布时间】:2017-08-10 22:07:05
【问题描述】:

我的 avro 模式中有一个用于 favorite_number 的联合,它可以是 null 或 int。当我对我得到的对象进行 json 编码时:

{"name": "Alyssa", "favorite_number": {"int": 7}, "favorite_color": null}

我试图去掉联合的类型指示符,在这种情况下是 int,这样它就变成了:

{"name": "Alyssa", "favorite_number": 7, "favorite_color": "blue"}

avro 架构:

{"name": "person", "type": "record",
           "fields": [
              {"name": "name", "type": "string"},
              {"name": "favorite_number", "type": ["null", "int"], "default": null},
              {"name": "favorite_color", "type": "string"}
           ]
   }

有没有办法做到这一点?谢谢!

【问题讨论】:

  • 你应该展示一些代码你是如何做到的以获得帮助
  • 你知道如何解决这个问题吗?
  • 你解决了吗?我有同样的问题

标签: java json avro


【解决方案1】:

编辑整个答案:)

看来直接使用 Avro API 是不可能的。有一个拉取请求等待一段时间以支持可空类型的此功能

https://issues.apache.org/jira/browse/AVRO-1582

编辑:

根据您的 cmets,我在尝试在没有数据类型的情况下进行序列化时发现了同样的问题,我最终使用了 https://avro.apache.org/docs/1.8.1/api/java/org/apache/avro/generic/GenericData.html#toString(java.lang.Object) 中定义的 toString 函数,它无法正常工作的唯一情况是具有循环引用的模式。

【讨论】:

  • 我不确定你的意思 - 请你详细说明一下
  • 谢谢你的回答,但我的问题不同。它与 avro 模式无关,但与基于 avro 模式的 json 序列化有关。因此,当我的架构中有一个联合时,我希望基于架构的序列化 json 不包含类型信息。 {"name": "Alyssa", "favorite_number": {"int": 7}, "favorite_color": null} I am trying to get rid of the type indicator for the union, in this case the int, so that it becomes: {"name": "Alyssa", "favorite_number": 7, "favorite_color": "blue"}
  • @eng007 嘿,我也有同样的问题,你找到解决办法了吗?
  • 如果您通过从 json 构建嵌套的 GenericRecord 来使用二进制序列化,它将按您的意愿工作。问题是 json 序列化与联合的二进制序列化有何不同。如果你在 GenericRecord 上调用 toString() 方法,你得到的是你正在寻找的 json。 GenericRecord 看起来类似于 Map,因为您可以通过 get 方法从 GR 中恢复数据。关键是从您的 json 构建一个嵌套的通用记录。就像遍历嵌套的 Map。每个嵌套映射都是另一个 GenericRecord。
  • 至于扩展限制,GenericDatatoString() 也不适用于logicalType UUID,因为它省略了分隔其字符串表示的引号,因此它破坏了JSON 语法。 Avro 版本 1.9.2 在这里。
【解决方案2】:

我想知道传入的 json 有效载荷是否像这样 { “名称”:“艾莉莎”, “最喜欢的号码”:7, “最喜欢的颜色”:“蓝色” } 添加数据类型并获取更新的 json 数据以适应 Avro Union 要求的简单方法是什么。 { “名称”:“艾莉莎”, “最喜欢的号码”:{ “整数”:7 }, “最喜欢的颜色”:空 } 提前致谢。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 这似乎是对原始问题的重复,而不是答案。考虑添加有关如何解决原始问题的更多信息。为了建立您的声誉,请提出一些问题。回答你能回答的任何问题。对问题的不同看法可能与解决问题的代码一样有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
相关资源
最近更新 更多