实际上,我使用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。
有人可以给我一些解决方法吗?
答案 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"}}