Hi All,
I have a serialized avro binary data represented by byte[] where one one
the field is long with logical type of TimeStamp.
Timestamp tsp = new Timestamp(1530228588182l);
Schema schema = SchemaBuilder.builder()
.record("hello")
.fields()
.name("tsp").type(LogicalTypes.timestampMillis().addToSchema(Schema.create(Schema.Type.LONG))).noDefault()
.endRecord();
System.out.println(schema.toString());
GenericRecord genericRecord = new GenericData.Record(schema);
genericRecord.put("tsp",tsp.getTime());
I serialized the above generic record to byte[] and used below two methods
to deserialize but both of them produce invalid JSON.
public static GenericRecord deserialize(final Schema schema, byte[]
data) throws IOException {
final GenericData genericData = new GenericData();
genericData.addLogicalTypeConversion(new
TimeConversions.TimestampConversion());
genericData.addLogicalTypeConversion(new
TimeConversions.TimeConversion());
try (final InputStream is = new ByteArrayInputStream(data)) {
final Decoder decoder =
DecoderFactory.get().binaryDecoder(is, null);
final DatumReader<GenericRecord> reader = new
GenericDatumReader<>(schema, schema, genericData);
return reader.read(null, decoder);
}
}
This produces {"tsp": 2018-06-28T23:29:48.182Z} this is not a valid json
so I also tried the following
public static GenericRecord deserialize(final Schema schema, byte[]
data) throws IOException {
final GenericData genericData = new GenericData(){
@Override
public String toString(Object datum) {
StringBuilder buffer = new StringBuilder();
// Since these types are not quoted and produce a
malformed JSON string, quote it here.
if (datum instanceof java.sql.Timestamp || datum
instanceof java.sql.Time || datum instanceof java.sql.Date) {
return
buffer.append("\"").append(datum).append("\"").toString();
}
return super.toString(datum);
}
};
genericData.addLogicalTypeConversion(new
TimeConversions.TimestampConversion());
genericData.addLogicalTypeConversion(new
TimeConversions.TimeConversion());
try (final InputStream is = new ByteArrayInputStream(data)) {
final Decoder decoder =
DecoderFactory.get().binaryDecoder(is, null);
final DatumReader<GenericRecord> reader = new
GenericDatumReader<>(schema, schema, genericData);
return reader.read(null, decoder);
}
}
I still get {"tsp": 2018-06-28T23:29:48.182Z} this is not a valid json
Expected output: {"tsp": "2018-06-28T23:29:48.182Z"}
Any ideas?
Thanks!