This is an automated email from the ASF dual-hosted git repository.

dkulp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/master by this push:
     new bbea1ce  AVRO-2276: Escape Map keys in GenericData.toString to 
generate valid JSON
bbea1ce is described below

commit bbea1cec3ed6ffae631b4c0d975639a098687ab4
Author: Ismaël Mejía <[email protected]>
AuthorDate: Tue Nov 27 14:01:13 2018 -0800

    AVRO-2276: Escape Map keys in GenericData.toString to generate valid JSON
---
 .../java/org/apache/avro/generic/GenericData.java     |  2 +-
 .../java/org/apache/avro/generic/TestGenericData.java | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git 
a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java 
b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
index 714f4e8..6dffa15 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/generic/GenericData.java
@@ -541,7 +541,7 @@ public class GenericData {
       Map<Object,Object> map = (Map<Object,Object>)datum;
       for (Map.Entry<Object,Object> entry : map.entrySet()) {
         buffer.append("\"");
-        buffer.append(String.valueOf(entry.getKey()));
+        writeEscapedString(String.valueOf(entry.getKey()), buffer);
         buffer.append("\": ");
         toString(entry.getValue(), buffer, seenObjects);
         if (++count < map.size())
diff --git 
a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java 
b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
index 0a98c7a..fe8f618 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/generic/TestGenericData.java
@@ -323,26 +323,26 @@ public class TestGenericData {
     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);
+    Field boolMapField = new Field("boolMap", Schema.createMap(boolMapSchema), 
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);
+    Field fileMapField = new Field("fileMap", Schema.createMap(fileMapSchema), 
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<>();
+    HashMap<Integer, String> intPair = new HashMap<>();
     intPair.put(1, "one");
     intPair.put(2, "two");
 
-    HashMap<java.math.BigDecimal, String> decPair =  new HashMap<>();
+    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<>();
+    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<>();
+    HashMap<java.io.File, String> filePair = new HashMap<>();
     java.io.File f = new java.io.File( 
getClass().getResource("/SchemaBuilder.avsc").toURI() );
     filePair.put(f, "File");
 
@@ -368,6 +368,13 @@ public class TestGenericData {
     assertEquals("{\"bytes\": \"a\\nb\"}", data.toString(bytes));
   }
 
+  @Test public void testToStringEscapesControlCharsInMap() {
+    GenericData data = GenericData.get();
+    Map<String, String> m = new HashMap<>();
+    m.put("a\n\\b", "a\n\\b");
+    assertEquals("{\"a\\n\\\\b\": \"a\\n\\\\b\"}", data.toString(m));
+  }
+
   @Test public void testToStringFixed() throws Exception {
     GenericData data = GenericData.get();
     assertEquals("[97, 10, 98]", data.toString(new GenericData.Fixed(

Reply via email to