获取 AvroTypeException:未知联合分支

Getting AvroTypeException: Unknown union branch

实际上,我正在使用 AVRO 来验证 json 有效载荷。我正在尝试声明一个字段(定义为记录)可选但它不起作用。

架构

...
    {
      "name" : "buildarea",
      "type" : "com.data.Area",
      "type" : ["null","com.data.Area"],
      "default": null
    }
...

面积定义为

{
  "type": "record",
  "namespace": "com.data",
  "name": "Area",
  "fields": [
        {
          "name": "start",
          "type": "double"
        },
        {
          "name": "end",
          "type": "double"
        }
    ]
 }

Json 例子

如果我定义一个非空值,我会得到一个异常:Unknown union branch start

"buildarea": {
   "start": 10.20,
   "end": 15
}

如果我将字段设置为空,例如"buildarea":null,我收到一条异常消息:预期记录开始。得到 VALUE_NULL

"buildarea": null

如果我删除架构中的可选规范,即

...
    {
      "name" : "buildarea",
      "type" : "com.data.Area"
    }
...

我必须始终定义一个非空的 "buildarea" 对象,这始终不是正确的期望,即 buildarea 可能为空。

任何人都可以给我提示来解决这个问题吗?

您只需定义一次类型即可使其可为空,而不是两次。像这样

 {
  "name" : "buildarea",
  "type" : ["null","com.data.Area"],
  "default": null
 }

这个答案更多是为了我自己的文档,也许可以帮助那些可能有同样问题的人。 假设这是您的两条记录 Area 和 BuildArea 的架构。

{
  "type": "record",
  "namespace": "com.data",
  "name": "Area",
  "fields": [
        {
          "name": "start",
          "type": "double"
        },
        {
          "name": "end",
          "type": "double"
        }
    ]
 }

{
  "name" : "BuildArea",
  "namespace": "com.data",
  "type" : "Record",
  "fields": [
            {
              "name": "area",
              "type": ["null","Area"]
            },

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

你的JSON数据是这样的

{"area":{"start": 45.0, "end": 45.9}, "name":"build_area_0"}

您可能会遇到与此问题所问的错误相同的错误。所以要修复它 在对象键前加上命名空间。看到这个

{"com.data.area":{"start": 45.0, "end": 45.9}, "name":"build_area_0"}

如果这不起作用,请执行此操作

{"area":"com.data.Area":{"start": 45.0, "end": 45.9}, "name":"build_area_0"}}