Hello,

 

I'm trying to serialize json to avro and back also I'm using fields having
decimal logical type, so I'd like to have possibility to provide json with
normal numbers for serializer and receive equal json from deserializer. And
I was hoping that Conversions.DecimalConversion() will help me with that,
but I still receive bytecodes from deserializer and serializer doesn't
accept numbers. What am I doing wrong?

 

The code is:

public static byte[] jsonToAvro(String json, String schemaStr) throws
IOException {

                InputStream input = null;

                GenericDatumWriter<GenericRecord> writer = null;

                Encoder encoder = null;

                ByteArrayOutputStream output = null;

                try {

                               final GenericData genericData = new
GenericData();

                               genericData.addLogicalTypeConversion(new
Conversions.DecimalConversion());

 

                               Schema schema = new
Schema.Parser().parse(schemaStr);

                               DatumReader<GenericRecord> reader = new
GenericDatumReader<GenericRecord>(schema, schema, genericData);

                               input = new
ByteArrayInputStream(json.getBytes());

                               output = new ByteArrayOutputStream();

                               DataInputStream din = new
DataInputStream(input);

                               writer = new
GenericDatumWriter<GenericRecord>(schema, genericData);

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

                               encoder =
EncoderFactory.get().binaryEncoder(output, null);

                               GenericRecord datum;

                               while (true) {

                                               try {

                                                               datum =
reader.read(null, decoder);

                                               } catch (EOFException eofe) {

                                                               break;

                                               }

                                               writer.write(datum, encoder);

                               }

                               encoder.flush();

                               return output.toByteArray();

                } finally {

                               try {

                                               input.close();

                               } catch (Exception e) {

                               }

                }

}

 

public static String avroToJson(byte[] avro, String schemaStr) throws
IOException {

                boolean pretty = false;

                GenericDatumReader<GenericRecord> reader = null;

                JsonEncoder encoder = null;

                ByteArrayOutputStream output = null;

                try {

                               final GenericData genericData = new
GenericData();

                               genericData.addLogicalTypeConversion(new
Conversions.DecimalConversion());

 

                               Schema schema = new
Schema.Parser().parse(schemaStr);

                               reader = new
GenericDatumReader<GenericRecord>(schema, schema, genericData);

                               InputStream input = new
ByteArrayInputStream(avro);

                               output = new ByteArrayOutputStream();

                               DatumWriter<GenericRecord> writer = new
GenericDatumWriter<GenericRecord>(schema, genericData);

                               encoder =
EncoderFactory.get().jsonEncoder(schema, output, pretty);

                               Decoder decoder =
DecoderFactory.get().binaryDecoder(input, null);

                               GenericRecord datum;

                               while (true) {

                                               try {

                                                               datum =
reader.read(null, decoder);

                                               } catch (EOFException eofe) {

                                                               break;

                                               }

                                               writer.write(datum, encoder);

                               }

                               encoder.flush();

                               output.flush();

                               return new String(output.toByteArray());

                } finally {

                               try {

                                               if (output != null)
output.close();

                               } catch (Exception e) {

                               }

                }

}

 

Example data:

Schema

{

  "type" : "record",

  "name" : "example",

  "namespace" : "myavro",

  "fields" : [ {

    "name" : "cost",

    "type" : {

      "type" : "bytes",

      "logicalType" : "decimal",

      "precision" : 38,

      "scale" : 10

    }

  }]

}

 

Json:

{ "cost" : 36.47 }

Reply via email to