Avro联合类型的JSON编码

5

我的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"}
           ]
   }

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

你应该展示一些代码来说明你是如何做的,以获得帮助。 - TuyenNTA
{btsdaf} - Prashanth
你解决了吗?我也遇到了同样的问题。 - Nate
我正在努力保留输出JSON中的类型指示器。你是怎么做到有类型指示器的?我使用org.apache.avro.util.RandomData(schema, 1).iterator()从avsc生成随机数据到JSON示例,但它不包括类型指示器。 - undefined
2个回答

4
编辑整个答案 :)
看起来直接使用Avro API是不可能做到的。有一个挂起的拉取请求已经等待支持这个可为空类型的功能了。
https://issues.apache.org/jira/browse/AVRO-1582
根据您的评论,我发现在没有数据类型的情况下尝试序列化时出现了相同的问题,最终我使用了在https://avro.apache.org/docs/1.8.1/api/java/org/apache/avro/generic/GenericData.html#toString(java.lang.Object)中定义的toString函数。唯一无法正常工作的情况是具有循环引用的模式。

我不确定你的意思 - 你能否详细说明一下? - eng007
谢谢您的回答,但我的问题不同。它与avro模式无关,而是基于avro模式的json序列化。因此,当我的模式中有一个union时,我希望基于模式的序列化json不包括类型信息。我正在尝试消除联合的类型指示器,在这种情况下是int,以便它变成:{"name": "Alyssa", "favorite_number": 7, "favorite_color": "blue"} - eng007
@eng007 嘿,我也有同样的问题,你找到解决方案了吗? - Leyla Lee
1
如果您使用二进制序列化通过从json构建嵌套的GenericRecord,它将按您所希望的方式工作。问题在于json序列化与联合的二进制序列化不同。如果您在GenericRecord上调用toString()方法,您将得到您要查找的json。 GenericRecord类似于Map,因为您可以通过get方法从GR中恢复数据。关键是从您的json构建一个嵌套的Generic Record。就像遍历嵌套的Map一样。每个嵌套的Map都是另一个GenericRecord。 - George Smith
关于扩展限制,GenericDatatoString()对于逻辑类型UUID也无法正常工作,因为它省略了引号来界定其字符串表示形式,从而破坏了JSON语法。这里使用的是Avro版本1.9.2。 - spi-x-i
如何在C++中实现相同的功能? https://avro.apache.org/docs/1.9.2/api/cpp/html/classavro_1_1GenericRecord.html - undefined

0

我想知道如何在传入的JSON负载中,像这样: { "name": "Alyssa", "favorite_number": 7, "favorite_color": "blue" } 添加数据类型并获取更新后的JSON数据以适应Avro Union要求的简单方法是什么? { "name": "Alyssa", "favorite_number": { "int": 7 }, "favorite_color": null } 提前致谢。


1
目前你的回答不够清晰,请编辑并添加更多细节以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
这似乎是原问题的重复,而不是答案。考虑添加更多关于如何解决原问题的信息。为了建立您的声誉,请提出一些问题。回答您能回答的任何问题。对问题的不同看法可能会像修复问题的代码一样有帮助。 - Ray N. Franklin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接