当前位置: 首页 > 知识库问答 >
问题:

如何在avro模式中声明对象类型的实体

燕志学
2023-03-14

我有一个JSON对象,其中一部分如下:

{
  "bounding_box": {
    "coordinates": [
      [
        [
          -74.026675,
          40.683935
        ],
        [
          -74.026675,
          40.877483
        ]
      ]
    ],
    "type": "Polygon"
  }
}

这里,坐标作为Object的数组发送。现在,对于这个JSON对象,我想创建avro模式(. avsc文件),到目前为止,如下所示:

{
    "name": "bounding_box",
    "type": {
        "namespace": "my.tweet.stream",
        "type": "record",
        "name": "BoundingBox",
        "fields": [{
                "name": "coordinates",
                "type": {
                    "type": "array",
                    "items": "object"
                }
            },
            {
                "name": "type",
                "type": ["string", "null"]
            }
        ]
    }
}

但是,对于当前模式,我得到以下错误:

执行生成目标org.apache.avro:avro-maven-plugin:1.8.1:模式失败:未定义的名称:"对象"

如果有人能帮忙,我如何指定java。lang.Object是否在avro架构中键入?

谢谢。

共有1个答案

冷宏茂
2023-03-14

Avro是跨语言的,因此没有java。lang.Object映射,仅记录类型,可以嵌套。

您可以嵌套数组(我只做了两个级别,但您应该可以有更多)

在IDL(payload.avdl

@namespace("com.example.mycode.avro")
protocol ExampleProtocol {
  record BoundingBox {
    array<array<double>> coordinates;
   }

  record Payload {
    BoundingBox bounding_box;
    union{null, string} type = null;
  }
}

或者在AVSC中

用java-jar生成的avro-tools-1.8.1.jaridl2schematapayload.avdl

{
  "type" : "record",
  "name" : "Payload",
  "namespace" : "com.example.mycode.avro",
  "fields" : [ {
    "name" : "bounding_box",
    "type" : {
      "type" : "record",
      "name" : "BoundingBox",
      "fields" : [ {
        "name" : "coordinates",
        "type" : {
          "type" : "array",
          "items" : {
            "type" : "array",
            "items" : "double"
          }
        }
      } ]
    }
  }, {
    "name" : "type",
    "type" : [ "null", "string" ],
    "default" : null
  } ]
}
 类似资料:
  • 在编写对象时,有没有方法键入对象的属性?与预先定义类型/接口相反。 我唯一能想到的是,但这太宽松了。考虑一下: 我想要<code>myData。myComment</code>抛出相同的错误。 这当然是一个微不足道的例子。但是如果我正在写一个大的复杂的对象,能够动态地声明它的部分类型会很好。

  • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-

  • 给定的示例模式包含一个字段,该字段是null和string的联合, 我想转换以下 json 对象, 转换成对应于上述模式的avro对象。我用Avro的JsonDecoder用下面描述的代码snppet试了一下, 它会异常失败,

  • 今天,我意识到让数组像字典一样运行更有意义,这样我就可以通过名称而不是数字索引访问特定元素。我希望能够执行而不是(即使我声明了一个将submitButton映射到请求的索引的枚举)。 这是可行的,但我现在允许一堆欺骗我的代码库,这是很糟糕的。我希望对象知道,只有类型的东西才能放入其中。 我可以用这些字段声明一个类,因为我希望它们的数量在将来可以动态添加,所以下面的操作是不可行的。

  • 问题内容: 我已经有一段时间没有接触过Mockito了,我也从未广泛使用它。但是今天,在一些新代码中,我想使用最佳实践,因此我使用以下Java版本退出了模仿内核2.0.54-beta: 我需要此接口的实例进行测试: https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/ma

  • 我有一段时间没有接触过Mockito,也从来没有大量使用过它。但是今天在一些新代码中,我希望使用最佳实践,所以我使用以下Java版本推出了mockito-core 2.0.54-beta: 要重现此问题,请克隆https://bitbucket.org/globalmentor/rincl.git并签出commit2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac。然