java - 如何使用 Avro 序列化/反序列化动态 json 类型

标签 java json api serialization avro

过去一周我一直在尝试使用 Avro 来映射来自流 api 的数据。 我使用 ReflectData 从表示 json 响应的 POJO 创建架构。

然后,我使用 ReflectDatumReader 将 json 转换为 avro 字节,反之亦然。

我面临的问题与我收到的 json 响应有关。响应可能会根据发送的消息类型而变化。

{
"id": 001,
"text": {
    "type": "comment",
    "event": "event",
    "comment": {    
    ...
}

但这也可以

{
"id": 001,
"text": {
    "type": "status",
    "event": "event",
    "status": {
    ...
}

所以,正如您所看到的,类型对象反射(reflect)了稍后 json 对象的名称。 我找不到一种方法来表示这样的模式。我过去曾使用 jackson 来表示这样的多态类型,但我无法找到使用 Avro 的 Java API 来实现此目的的方法。

我非常感谢对此的任何帮助/建议。 :) 非常感谢。

最佳答案

您可能必须使用 Avro 术语中所谓的“架构投影”:也就是说,您定义正在解析的不同架构的超集,并且 Avro 会根据需要忽略缺少的架构字段。它在架构解析部分进行了描述:

http://avro.apache.org/docs/1.7.7/spec.html

至少这是理论上的。在实践中,我经常不得不深入研究(Java-)API 代码并显式处理 null 等。

关于java - 如何使用 Avro 序列化/反序列化动态 json 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26656140/

相关文章:

javascript - 通过ajax发送json对象

Angular 订阅。无法获取数据

java - 使用 slf4j Logger 记录所有 HashMap 键和值

java - 需要在单元测试中使用依赖注入(inject) - 我应该使用 junit 还是 testng?

java - 我如何区分 actionPerformed 中的两个不同的 JButton?

java - 使用 GSON 将多个 Collection<String> 合并为一个 JSON String

java - var<T> 在 Java 中做什么?

java - 在 Java 中将具有无效 XML 字符的任意 JSON 转换为 XML

android - 访问 Android Play API 以进行订阅

api - Laravel5 和 Codeception 中的 ExternalUrlException