[ 
https://issues.apache.org/jira/browse/AVRO-2216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Kulp resolved AVRO-2216.
-------------------------------
    Resolution: Fixed
      Assignee: Daniel Kulp

> GenericData toString generates invalid JSON when map keys are not Strings
> -------------------------------------------------------------------------
>
>                 Key: AVRO-2216
>                 URL: https://issues.apache.org/jira/browse/AVRO-2216
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.9.0
>            Reporter: Alberto Lago
>            Assignee: Daniel Kulp
>            Priority: Major
>             Fix For: 1.9.0
>
>
> 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