pubsub 主题模式验证是否支持嵌套 json?

Does pubsub topic schema validation support nested json?

我在使用嵌套消息创建 AVRO 模式时遇到问题。

例如JSON 留言,

{"metadata": {"key1": "value1", "key2": "value2"}, "payload": {"key1": "value1", "key2": "value2"}}

根据 apache avro 文档,我认为这个模式定义应该有效,但似乎无效:

    {
  "type" : "record",
  "name" : "Avro",
  "fields" : [
    {
      "name" : "metadata",
      "type" : "record",
      "fields": [
        {
          "type" : "string",
          "name" : "key1"
        },
        {
          "type" : "string",
          "name" : "key2"
        }
      ]
    },
    {
      "name" : "payload",
      "type" : "record",
      "fields": [
        {
          "type" : "string",
          "name" : "key1"
        },
        {
          "type" : "string",
          "name" : "key2"
        }
      ]
    }
  ]
}

是我做错了什么还是不支持嵌套?

您提供的 Avro 架构定义实际上无效。指定此模式的方式是:

{
   "type":"record",
   "name":"Avro",
   "fields":[
      {
         "name":"metadata",
         "type":{
            "type":"record",
            "name":"MetadataRecord",
            "fields":[
               {
                  "type":"string",
                  "name":"key1"
               },
               {
                  "type":"string",
                  "name":"key2"
               }
            ]
         }
      },
      {
         "name":"payload",
         "type":{
            "type":"record",
            "name":"PayloadRecord",
            "fields":[
               {
                  "type":"string",
                  "name":"key1"
               },
               {
                  "type":"string",
                  "name":"key2"
               }
            ]
         }
      }
   ]
}

还有更多工作要做,以确保在 public 预览功能时,架构创建时返回的错误消息提供更多详细信息。

如果您 运行 通过 avro 解析器 Python:

,您可以看到有关错误的更多详细信息
import avro.io

schema = """
{
  "type" : "record",
  "name" : "Avro",
  "fields" : [
    {
      "name" : "metadata",
      "type" : "record",
      "fields": [
        {
          "type" : "string",
          "name" : "key1"
        },
        {
          "type" : "string",
          "name" : "key2"
        }
      ]
    },
    {
      "name" : "payload",
      "type" : "record",
      "fields": [
        {
          "type" : "string",
          "name" : "key1"
        },
        {
          "type" : "string",
          "name" : "key2"
        }
      ]
    }
  ]
}
"""
parsed_schema = avro.schema.parse(schema)

运行 此脚本将产生错误:

avro.schema.SchemaParseException: Type property "record" not a valid Avro schema: Could not make an Avro Schema object from record.