vincent royer created AVRO-3103:
-----------------------------------
Summary: Wrong JSON encoding with Schema AllowNull
Key: AVRO-3103
URL: https://issues.apache.org/jira/browse/AVRO-3103
Project: Apache Avro
Issue Type: Bug
Components: java
Affects Versions: 1.10.2
Environment: Java unit test
Reporter: vincent royer
The JSON encoding of an AVRO record should be the same when the schema
AllowNull or not. In following unit test, the JSON encoded record is incorrect
when the schema Allow null:
AvroJsonAllowNullTests.testAvroToJson:82 expected [\\{"name":"bob"}] but found
[\{"name":{"*string*":"bob"}}]
{code:java}
import org.apache.avro.generic.GenericDatumWriter;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.generic.GenericRecordBuilder;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.io.JsonEncoder;
import org.apache.avro.reflect.ReflectData;
import org.testng.annotations.Test;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import static org.testng.Assert.assertEquals;
class AvroJsonAllowNullTests {
public static class User {
String name;
public User(String name)
{ this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
/**
Writes provided {@link org.apache.avro.generic.GenericRecord}
into the provided
{@link OutputStream}
as JSON.
*/
public static void writeAsJson(org.apache.avro.generic.GenericRecord record,
OutputStream out) throws Exception
{ DatumWriter<GenericRecord> writer = new
GenericDatumWriter<GenericRecord>(record.getSchema()); JsonEncoder encoder =
EncoderFactory.get().jsonEncoder(record.getSchema(), out); writer.write(record,
encoder); encoder.flush(); }
@Test
public final void testAvroToJson() throws Exception
{ org.apache.avro.Schema schema = ReflectData.get().getSchema(User.class);
org.apache.avro.Schema schemaAllowNull =
ReflectData.AllowNull.get().getSchema(User.class); System.out.println("schema="
+ schema); System.out.println("schemaAllowNull=" + schemaAllowNull);
GenericRecord record = new GenericRecordBuilder(schema) .set("name","bob")
.build(); GenericRecord recordAllowNull = new
GenericRecordBuilder(schemaAllowNull) .set("name","bob") .build();
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream
baosAllowNull = new ByteArrayOutputStream(); writeAsJson(record, baos);
writeAsJson(recordAllowNull, baosAllowNull);
System.out.println("record="+baos.toString());
System.out.println("recordAllowNull="+baosAllowNull.toString());
assertEquals(baosAllowNull.toString(), baos.toString()); }
}
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)