Alberto Lago created AVRO-2216:
----------------------------------

             Summary: GenericData toString generates invalid JSON when map keys 
are not Strings
                 Key: AVRO-2216
                 URL: https://issues.apache.org/jira/browse/AVRO-2216
             Project: Avro
          Issue Type: Bug
          Components: java
    Affects Versions: 1.9.0
            Reporter: Alberto Lago


toString() method for records with maps that have non String Keys generates 
wrong Json:

This code:
{code:java}
Schema intMapSchema = new Schema.Parser().parse("{\"type\": \"map\", 
\"values\": \"string\", \"java-key-class\" : \"java.lang.Integer\"}");
Field intMapField = new Field("intMap", Schema.createMap(intMapSchema), null, 
null);
Schema decMapSchema = new Schema.Parser().parse("{\"type\": \"map\", 
\"values\": \"string\", \"java-key-class\" : \"java.math.BigDecimal\"}");
Field decMapField = new Field("decMap", Schema.createMap(decMapSchema), null, 
null);
Schema boolMapSchema = new Schema.Parser().parse("{\"type\": \"map\", 
\"values\": \"string\", \"java-key-class\" : \"java.lang.Boolean\"}");
Field boolMapField = new Field("boolMap", Schema.createMap(decMapSchema), null, 
null);
Schema fileMapSchema = new Schema.Parser().parse("{\"type\": \"map\", 
\"values\": \"string\", \"java-key-class\" : \"java.io.File\"}");
Field fileMapField = new Field("fileMap", Schema.createMap(decMapSchema), null, 
null);
Schema schema = Schema.createRecord("my_record", "doc", "mytest", false);
schema.setFields(Arrays.asList(intMapField,decMapField,boolMapField,fileMapField));

HashMap<Integer, String> intPair =  new HashMap<>();
intPair.put(1, "one");
intPair.put(2, "two");

HashMap<java.math.BigDecimal, String> decPair =  new HashMap<>();
decPair.put(java.math.BigDecimal.valueOf(1), "one");
decPair.put(java.math.BigDecimal.valueOf(2), "two");

HashMap<Boolean, String> boolPair =  new HashMap<>();
boolPair.put(true, "isTrue");
boolPair.put(false, "isFalse");
boolPair.put(null, null);

HashMap<java.io.File, String> filePair =  new HashMap<>();
java.io.File f = new java.io.File( 
getClass().getResource("/mapTestFile.txt").toURI() );
filePair.put(f, "File");

GenericRecord r = new GenericData.Record(schema);
r.put(intMapField.name(), intPair);
r.put(decMapField.name(), decPair);
r.put(boolMapField.name(), boolPair);
r.put(fileMapField.name(), filePair);

String json = r.toString();
{code}
Would generate the following json:
{code:java}
{"intMap": {1: "one", 2: "two"}, "decMap": {2: "two", 1: "one"}, "boolMap": 
{null: null, false: "isFalse", true: "isTrue"}, "fileMap": 
{/workspace/avro/lang/java/avro/target/test-classes/mapTestFile.txt: 
"File"}}{code}
It's missing double quotes for all keys.

Note that I used classes that are considered as Stringable by ReflectData (plus 
Integer.class ) and thus, would be able to be serializable.

[This change 
|https://github.com/apache/avro/compare/master...trompa:master?diff=split&name=master#diff-5a41450f3008ee0da59dec14ada2356aL543]to
 force the use of Strings always for Map Keys should be enough to fix this 
error.

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to