获取AvroTypeException:未知的union分支

时间:2017-09-28 16:07:42

标签: json avro

实际上,我使用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示例

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

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

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

"buildarea": null

如果我删除了模式中的可选规范,即

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

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

有人可以给我一些解决方法吗?

2 个答案:

答案 0 :(得分:0)

您必须只定义一次类型才能使其可为空,而不是两次。喜欢这个

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

答案 1 :(得分:0)

这个答案更多地是针对我自己的文档,也许可以帮助遇到相同问题的人。 假设这是您的两个记录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"}

您可能会得到与该问题所询问的错误相同的错误。所以要修复它 在对象键之前添加名称空间。看到这个answer

{"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"}}