你可以在Avro JSON模式文件中添加注释吗?

17

我正在编写我的第一个Avro模式,它使用JSON作为模式语言。我知道你不能在普通的JSON中加入注释,但是我想知道Avro工具是否允许注释。例如,它是否会在解析JSON之前删除它们(就像预处理器一样)。

编辑:我正在使用C ++ Avro工具链。

4个回答

17

是的,但它有限制。在架构中,Avro数据类型'record','enum'和'fixed'允许包含一个包含任意文档字符串的'doc'字段。例如:

{"type": "record", "name": "test.Weather",
 "doc": "A weather reading.",
 "fields": [
     {"name": "station", "type": "string", "order": "ignore"},
     {"name": "time", "type": "long"},
     {"name": "temp", "type": "int"}
 ]
}

根据官方的Avro规范:

doc: 一个JSON字符串,可选地提供此模式的用户文档。

https://avro.apache.org/docs/current/spec.html#schema_record

例如:https://github.com/apache/avro/blob/33d495840c896b693b7f37b5ec786ac1acacd3b4/share/test/schemas/weather.avsc#L2


7

是的,您可以在Avro JSON模式中使用C注释:/* something */ 或 // something
Avro工具在解析过程中忽略这些表达式。
编辑:仅适用于Java API。


1
这对我不起作用。如果我将注释的任一样式(/**/或//)放入JSON文件中,我会收到错误消息:“无法解析或编译模式:json 2f中的意外字符”。我尝试在文件中的多个位置放置两种样式的注释。 - jfritz42
我建议您曾经编译过没有注释的模式并且它可以正常工作。请检查以下事项:确保使用最新版本的avro-tools,确保您的模式可以编译(使用avro工具或Json验证器)。值得一提的是,所有我的avro模式都可以正常使用注释。 - Gaetan E.
我正在使用最新版本的1.7.4。我认为问题可能是我们现在正在使用C++版本,而您正在使用Java版本。很抱歉在我的问题中没有提到这个细节。 - jfritz42
1
确实...我刚试了一下C++版本,它不起作用。感谢您指出这个avro问题。 - Gaetan E.

5
根据当前(1.9.2)Avro规范,允许将未定义的额外属性作为元数据添加:

Avro schema specification screenshot

这样可以让你添加类似这样的注释:
{
  "type": "record", 
  "name": "test",
  "comment": "This is a comment",
  "//": "This is also a comment",
  "TODO": "As per this comment we should remember to fix this schema" ,
  "fields" : [
    {
      "name": "a", "type": "long"
    },
    {
      "name": "b", "type": "string"
    }
  ]
}

2

不,目前C++和C#版本(截至1.7.5)都不能实现。如果你看一下代码,他们只是将JSON直接塞入JSON解析器,没有进行任何注释预处理 - 这种编程风格十分奇怪。文档和语言支持似乎也比较松散...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接