java - Json 字符串到 Java 对象 Avro

标签 java json avro

我正在尝试使用 Avro 架构将 Json 字符串转换为通用 Java 对象。

下面是我的代码。

String json = "{\"foo\": 30.1, \"bar\": 60.2}";
String schemaLines = "{\"type\":\"record\",\"name\":\"FooBar\",\"namespace\":\"com.foo.bar\",\"fields\":[{\"name\":\"foo\",\"type\":[\"null\",\"double\"],\"default\":null},{\"name\":\"bar\",\"type\":[\"null\",\"double\"],\"default\":null}]}";

InputStream input = new ByteArrayInputStream(json.getBytes());
DataInputStream din = new DataInputStream(input);

Schema schema = Schema.parse(schemaLines);

Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);

DatumReader<Object> reader = new GenericDatumReader<Object>(schema);
Object datum = reader.read(null, decoder);

我得到“org.apache.avro.AvroTypeException:预期的启动联合。得到 VALUE_NUMBER_FLOAT”异常。

如果我在架构中没有联合,则相同的代码可以工作。 有人可以解释一下并给我一个解决方案吗。

最佳答案

对于任何使用 Avro - 1.8.2 的人来说,JsonDecoder 现在不能在 org.apache.avro.io 包外直接实例化。您可以使用 DecoderFactory 作为它,如下面的代码所示:

String schemaStr = "<some json schema>";
String genericRecordStr = "<some json record>";
Schema.Parser schemaParser = new Schema.Parser();
Schema schema = schemaParser.parse(schemaStr);
DecoderFactory decoderFactory = new DecoderFactory();
Decoder decoder = decoderFactory.jsonDecoder(schema, genericRecordStr);
DatumReader<GenericData.Record> reader =
            new GenericDatumReader<>(schema);
GenericRecord genericRecord = reader.read(null, decoder);

关于java - Json 字符串到 Java 对象 Avro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559543/

相关文章:

serialization - Avro 替代 Writables

java - 使用 docker-compose 启动 solr cloud 时无法使用 java 代码索引数据

java - 基于 Zeromq 的 log4j 附加程序未关闭套接字

java - Spring Boot 中的 Maven 依赖问题

javascript - 无法让我的 post() 使用 jQuery Ajax 工作

c# - 如何在使用 Newtonsoft.Json 序列化 json 时忽略默认值

java - 使用 ITextRenderer 从具有非拉丁字符的 HTML 生成 PDF 不起作用

android - 如何通过 android Volley 或 JSON 从 mysql 检索特定行数据?

java - 使用 AvroMultipleOutputs 创建多个输出文件

hadoop - 如何使用 Spark 编写 avro 文件?