获取 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"}}
实际上,我正在使用 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"}}