[
https://issues.apache.org/jira/browse/AVRO-2194?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16524977#comment-16524977
]
Andy Coates commented on AVRO-2194:
-----------------------------------
If you want to deserialize to a GenericRecord using logical types you need to
specify this in your code:
{code:java}
private static GenericRecord readJsonGeneric(
final String fileName,
final Schema schema) throws IOException {
final GenericData genericData = new GenericData();
genericData.addLogicalTypeConversion(new
TimeConversions.TimestampConversion());
try (final InputStream is = new FileInputStream(fileName)) {
final Decoder decoder =
DecoderFactory.get().jsonDecoder(schema, is);
final DatumReader<GenericRecord> reader =
new GenericDatumReader<>(schema, schema, genericData);
return reader.read(null, decoder);
}
}
{code}
With this change your code outputs:
{noformat}
------------ Generic record --------------
{"timestampLong": 1530102121825, "timestampDateTime": 2018-06-27T12:22:01.828Z}
class org.joda.time.DateTime
------------ Specific record --------------
{"timestampLong": 1530102121825, "timestampDateTime": 2018-06-27T12:22:01.828Z}
class org.joda.time.DateTime
{noformat}
> GenericRecord and specific class return different java type for the same
> field with logicalType
> -----------------------------------------------------------------------------------------------
>
> Key: AVRO-2194
> URL: https://issues.apache.org/jira/browse/AVRO-2194
> Project: Avro
> Issue Type: Bug
> Components: java, logical types
> Affects Versions: 1.8.2
> Reporter: Eva Krejcirova
> Priority: Major
> Attachments: avrotest.zip
>
>
> I have an Avro schema which contains field with logical type
> timestamp-millis. When I deserialize an object with this schema from json to
> GenericRecord, I get Long as type of this field. When I deserialize it to
> specific class, I get DateTime. This prevents me to write a generic code
> which would handle both cases (I would expect this to be possible since the
> generated class implements GenericRecord interface).
> E.g.
> {code:java}
> final GenericRecord timestampGenericRecord =
> readJsonGeneric("timestamptest.json", schema);
> final TimestampTest timestampTestIn = readJson("timestamptest.json",
> timestampTestOut.getClass(), schema);
> System.out.println("------------ Generic record --------------");
> printTimestamp(timestampGenericRecord);
> System.out.println("------------ Specific record --------------");
> printTimestamp(timestampTestIn);
> ----
> private static void printTimestamp(GenericRecord record) {
> System.out.println(record);
> System.out.println(record.get("timestampDateTime").getClass());
> }{code}
> prints out:
> {code:java}
> ------------ Generic record --------------
> {"timestampLong": 1530023620474, "timestampDateTime": 1530023620478}
> class java.lang.Long
> ------------ Specific record --------------
> {"timestampLong": 1530023620474, "timestampDateTime":
> 2018-06-26T14:33:40.478Z}
> class org.joda.time.DateTime
> {code}
> I am attaching sample code which demonstrates the problem.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)