我在使用 Avro schema 验证和消息测试时遇到了令人费解的问题,特别是在 Google Cloud Pub/Sub schema 中。在我的架构中,我定义了可以为空的自定义对象列表。
但是,当我尝试验证这样的示例 JSON 消息时:
{
"nullable_list": [
{"field1": 10, "field2": "example1"},
{"field1": 20, "field2": "example2"}
]
}
我收到错误消息:“根据架构,该消息无效。”
令人惊讶的是,如果我提供这样的 JSON 消息:
{
"nullable_list": null
}
它表示:“根据模式,消息是有效的。”
这是我的架构:
{
"type": "record",
"name": "MyRecord",
"fields": [
{
"name": "nullable_list",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "MyObject",
"fields": [
{"name": "field1", "type": "int"},
{"name": "field2", "type": "string"}
]
}
}
],
"default": null
}
]
}
有人可以解释为什么会发生这种情况吗?
Avro JSON 编码规范:
联合的值在 JSON 中编码如下:因此,该消息的正确 JSON 表示形式为:
如果其类型为 null,则将其编码为 JSON null;
- 否则它会被编码为一个 JSON 对象,具有一个名称/值对,其名称是类型的名称,其值是递归的 编码值。对于 Avro 的命名类型(记录、固定或枚举) 使用用户指定的名称,对于其他类型,使用类型名称。
{
"nullable_list": {
"array": [
{
"field1": 10,
"field2": "example1"
},
{
"field1": 20,
"field2": "example2"
}
]
}
}