当前位置: 首页 > 面试题库 >

如何为复杂的json文档定义avro模式?

艾宏远
2023-03-14
问题内容

我有一个想要转换为Avro的JSON文档,并且需要为此指定一种模式。这是我要为其定义avro模式的JSON文档:

{
 "uid": 29153333,
 "somefield": "somevalue",
 "options": [
   {
     "item1_lvl2": "a",
     "item2_lvl2": [
       {
         "item1_lvl3": "x1",
         "item2_lvl3": "y1"
       },
       {
         "item1_lvl3": "x2",
         "item2_lvl3": "y2"
       }
     ]
   }
 ]
}

我可以为非复杂类型定义架构,但不能为复杂的“选项”字段定义架构:

{
  "namespace" : "my.com.ns",
  "type" :  "record",
  "fields" : [
     {"name": "uid", "type": "int"},
     {"name": "somefield", "type": "string"}
     {"name": "options", "type": .....}
  ]
}

谢谢您的帮助!


问题答案:

您需要使用Avro
复杂类型,尤其是数组和记录。然后将它们嵌套在一起:

{
  "namespace" : "my.com.ns",
  "name": "myrecord",
  "type" :  "record",
  "fields" : [
     {"name": "uid", "type": "int"},
     {"name": "somefield", "type": "string"},
     {"name": "options", "type": {
        "type": "array",
        "items": {
            "type": "record",
            "name": "lvl2_record",
            "fields": [
                {"name": "item1_lvl2", "type": "string"},
                {"name": "item2_lvl2", "type": {
                    "type": "array",
                    "items": {
                        "type": "record",
                        "name": "lvl3_record",
                        "fields": [
                            {"name": "item1_lvl3", "type": "string"},
                            {"name": "item2_lvl3", "type": "string"}
                        ]
                    }
                }}
            ]
        }
     }}
  ]
}

另外,为了提高可读性,您可以将架构分为多个文件。



 类似资料:
  • 我是Avro架构的新手。我尝试使用kafka发布/消费我的java对象。我有java bean类,它包含LocalDateTime和byte[]的字段。如何在avro架构基元类型中定义两者?我可以用于LocalDateTime的最佳基元类型是什么? 我定义了这样的东西;但是 类强制转换异常[1] [1] Caused by: java.lang.ClassCastException: [B can

  • 我试图用Swagger来描述我正在构建的web-api。问题是我无法理解如何描述复杂的json对象? 比如如何描述这个对象:

  • 有一个网站这样做,但我想要一个图书馆或CLI。 谢了!

  • 我正在用Protobuf在golang写一个新的服务。我想在.proto文件中对以下请求JSON建模。 目前存在两个问题: 每个数组元素中的键事先是不知道的,因此我不能在.proto文件中创建消息并重复它。我需要保持它的映射 我无法对json建模,因为它只是一个没有键的数组。每次执行此操作时,都会显示以下错误:解码请求失败:JSON:无法将数组反编入Go值 以下是我的.proto文件: 我尝试过使

  • 我正在尝试使用OpenAPI 3.0记录一个micros服务。该服务返回具有任何字段名并且可以包含任何数组、字符串、数字、true、false、null但不包含对象的Json。字符串可能包含ISO日期。只有很少的已知字段名(例如“@id”) 示例: 无效样本: 所以我的第一次尝试是: 我检查了OpenAPI字典规范,建议使用: 但这将允许对象。 我走对了吗?或者说“任何名称、任何值,只是不是另一个