You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by dk...@apache.org on 2018/11/08 16:55:40 UTC

[avro] branch master updated: Fix map with no string keys toString method

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 561a811  Fix map with no string keys toString method
561a811 is described below

commit 561a811f671a16139403741f707da6bfdf23997c
Author: trompa <tr...@gmail.com>
AuthorDate: Wed Aug 22 15:33:48 2018 +0200

    Fix map with no string keys toString method
---
 .../java/org/apache/avro/generic/GenericData.java  |  5 ++-
 .../org/apache/avro/generic/TestGenericData.java   | 46 ++++++++++++++++++++++
 2 files changed, 49 insertions(+), 2 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 ba538d2..714f4e8 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
@@ -540,8 +540,9 @@ public class GenericData {
       @SuppressWarnings(value="unchecked")
       Map<Object,Object> map = (Map<Object,Object>)datum;
       for (Map.Entry<Object,Object> entry : map.entrySet()) {
-        toString(entry.getKey(), buffer, seenObjects);
-        buffer.append(": ");
+        buffer.append("\"");
+        buffer.append(String.valueOf(entry.getKey()));
+        buffer.append("\": ");
         toString(entry.getValue(), buffer, seenObjects);
         if (++count < map.size())
           buffer.append(", ");
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 ac896a0..a644916 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
@@ -316,6 +316,52 @@ public class TestGenericData {
     mapper.readTree(parser);
   }
 
+  @Test
+  public void testMapWithNonStringKeyToStringIsJson() throws Exception {
+    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("/SchemaBuilder.avsc").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();
+    System.out.println(json);
+    JsonFactory factory = new JsonFactory();
+    JsonParser parser = factory.createJsonParser(json);
+    ObjectMapper mapper = new ObjectMapper();
+
+    // will throw exception if string is not parsable json
+    mapper.readTree(parser);
+  }
+
   @Test public void testToStringEscapesControlCharsInBytes() throws Exception {
     GenericData data = GenericData.get();
     ByteBuffer bytes = ByteBuffer.wrap(new byte[] {'a', '\n', 'b'});