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

使用AVRO[duplicate]编码可选字符串

蓝泰平
2023-03-14

我使用的是Avro版本1.10.2

我有以下模式,optionalfield作为可选JSON字符串:

{
  "namespace": "foo.bar",
  "name": "FooBar",
  "type": "record",
  "fields": [
    {
      "name": "optionalField",
      "type": [
        "null",
        "string"
      ]
    }
  ]
}

我使用Avro Maven插件来执行代码生成。

但是,当我使用以下代码对此对象的实例进行编码时:

FooBar fooBar = FooBar.newBuilder()
                .setOptionalField("value")
                .build();

Schema schema = fooBar.getSchema();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Encoder jsonEncoder = EncoderFactory.get().jsonEncoder(schema, byteArrayOutputStream);
SpecificDatumWriter<Object> writer = new SpecificDatumWriter<>(schema);
writer.write(fooBar, jsonEncoder);
jsonEncoder.flush();

System.out.println(byteArrayOutputStream.toString());

输出为:

{"optionalField":{"string":"value"}}

而不是我所期望的:

{"optionalField":"value"}

据我所知,Avro规范中似乎没有任何内容暗示只有记录可以是可选的。此外,根据工会:

如上所述,联合是使用JSON数组表示的。例如,[“null”,“string”]声明一个模式,该模式可以是null或字符串。

我的理解是否正确,Avro真的允许可选字符串字段?这是窃听器吗?我错过了什么?

共有1个答案

酆高翰
2023-03-14

我的理解是否正确,Avro真的允许可选字符串字段?

是的,Avro支持nullstring的联合

我错过了什么?

Avro JSON编码器的工作方式与您预期的不同。正如https://avro.apache.org/docs/current/spec.html#json_encoding中提到的,联合是以类型信息作为字典而不是仅仅以值来编码的。Avro ticket tracker中有一个悬而未决的问题,它要求您查找的格式,但尚未解决:https://issues.apache.org/jira/browse/avro-1582

 类似资料:
  • 我使用的是Avro版本1.10.2 我有以下模式,作为可选JSON字符串: 我使用Avro Maven插件来执行代码生成。 但是,当我使用以下代码对此对象的实例进行编码时: 输出为: 而不是我所期望的: 据我所知,Avro规范中似乎没有任何内容暗示只有记录可以是可选的。此外,根据工会: 如上所述,联合是使用JSON数组表示的。例如,[“null”,“string”]声明一个模式,该模式可以是nul

  • 我想将一个字符串编码成并通过套接字传输它,然后解码回来。 下面是我的代码,结果是“77+9x6s=” 有什么想法如何实现这一点吗?

  • 问题内容: 我正在寻找一种在Java中编码字符串的方法,就像php的本机函数一样。 我试图使用JavaMails的MimeUtility库。但是我无法使该方法起作用,因为它采用OutputStream作为输入而不是字符串(我使用该函数转换了字符串)并输出了无法返回字符串的内容(我是Java noob :) 谁能给我提示如何编写将字符串转换为OutputStream并在编码后将结果输出为String

  • So do not worry about tomorrow, for tomorrow will bring worries of its own. Today's trouble is enough for today. (MATTHEW 6:34) 字符编码 其实,标题前面应该加两个字——“坑爹”。 在实践中,字符编码的确是一个“坑”。因为这个世界上,不都是英文。如果都是英文,就没有这个问题

  • 问题内容: ’=?KOI8-R?B?W1JFUS0wMDI1NDEtNDc5NzddIO / h7yAi89TSz8rGwdLGz9IiIDs =?= \ r \ n \ t =?KOI8-R?B?Ry43MjkgKDEwKQ ==?=’ 如何将其转换为可读的内容?谢谢 ! 问题答案: email.header.decode_header(‘=?KOI8-R?B?W1JFUS0wMDI1NDEtN

  • 在查看Ruby的base64.encode的源代码时,我无法确定在base64中编码数据之前,将字符串编码转换为什么字符(如果有的话)。在Base64中编码的Utf-8字符串将与在Base64中编码的Utf-16字符串有很大不同。Ruby对这次行动有什么promise吗?