Hi All,

I have a serialized avro binary data represented by byte[] where one of the
field is long with a 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!

Reply via email to