You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2015/01/28 13:41:44 UTC

incubator-johnzon git commit: JOHNZON-36 nested list support

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master 92098f456 -> 435e7f8c6


JOHNZON-36 nested list support


Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/435e7f8c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/435e7f8c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/435e7f8c

Branch: refs/heads/master
Commit: 435e7f8c6eabf02da7cd68da76ba2240fb4ce20b
Parents: 92098f4
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Wed Jan 28 13:40:31 2015 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Wed Jan 28 13:40:43 2015 +0100

----------------------------------------------------------------------
 .../java/org/apache/johnzon/mapper/Mapper.java  | 43 ++++++++++++++------
 .../org/apache/johnzon/mapper/MapperTest.java   | 21 +++++++++-
 2 files changed, 51 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/435e7f8c/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index bba8ab3..1a16a8e 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -225,21 +225,27 @@ public class Mapper {
     public <T> void writeArray(final Collection<T> object, final Writer stream) {
         JsonGenerator generator = generatorFactory.createGenerator(stream);
         try {
-            if (object == null) {
-                generator = generator.writeStartArray().writeEnd();
-            } else {
-                generator = generator.writeStartArray();
-                for (final T t : object) {
-                    generator = writeItem(generator, t);
-                }
-                generator = generator.writeEnd();
-            }
+            generator = doWriteArray(object, generator);
         } finally {
             doCloseOrFlush(generator);
         }
     }
 
-    private void doCloseOrFlush(JsonGenerator generator) {
+    private <T> JsonGenerator doWriteArray(final Collection<T> object, final JsonGenerator inGenerator) {
+        JsonGenerator generator = inGenerator;
+        if (object == null) {
+            generator = generator.writeStartArray().writeEnd();
+        } else {
+            generator = generator.writeStartArray();
+            for (final T t : object) {
+                generator = writeItem(generator, t);
+            }
+            generator = generator.writeEnd();
+        }
+        return generator;
+    }
+
+    private void doCloseOrFlush(final JsonGenerator generator) {
         if (close) {
             generator.close();
         } else {
@@ -428,9 +434,22 @@ public class Mapper {
     }
 
     private JsonGenerator writeItem(final JsonGenerator generator, final Object o) {
-        final JsonGenerator newGen = writePrimitives(generator, o);
+        JsonGenerator newGen = writePrimitives(generator, o);
         if (newGen == null) {
-            return doWriteObject(generator, o);
+            if (Collection.class.isInstance(o)) {
+                newGen = doWriteArray(Collection.class.cast(o), generator);
+            } else if (o != null && o.getClass().isArray()) {
+                final int length = Array.getLength(o);
+                if (length > 0 || !skipEmptyArray) {
+                    newGen = generator.writeStartArray();
+                    for (int i = 0; i < length; i++) {
+                        newGen = writeItem(newGen, Array.get(o, i));
+                    }
+                    newGen = newGen.writeEnd();
+                }
+            } else {
+                newGen = doWriteObject(generator, o);
+            }
         }
         return newGen;
     }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/435e7f8c/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
index 7f6e10c..55cc926 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
@@ -29,6 +29,7 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
@@ -78,7 +79,8 @@ public class MapperTest {
         assertEquals(1, object.size());
         final Collection<TheObject> object2 = new MapperBuilder().build()
                 .readJohnzonCollection(new ByteArrayInputStream("[{}]".getBytes()),
-                        new JohnzonCollectionType<List<TheObject>>() {});
+                        new JohnzonCollectionType<List<TheObject>>() {
+                        });
         assertNotNull(object2);
         assertEquals(1, object2.size());
     }
@@ -118,6 +120,23 @@ public class MapperTest {
     }
 
     @Test
+    public void writeArrayOfArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new MapperBuilder().build().writeArray(new String[][]{new String[]{"a", "b"}, new String[]{"c", "d"}}, baos);
+        assertEquals("[[\"a\",\"b\"],[\"c\",\"d\"]]", new String(baos.toByteArray()));
+    }
+
+    @Test
+    public void writeListOfList() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new MapperBuilder().build().writeArray(new ArrayList<List<String>>(){{
+            add(new ArrayList<String>(){{ add("a");add("b"); }});
+            add(new ArrayList<String>(){{ add("c");add("d"); }});
+        }}, baos);
+        assertEquals("[[\"a\",\"b\"],[\"c\",\"d\"]]", new String(baos.toByteArray()));
+    }
+
+    @Test
     public void writeObject() {
         final TheObject instance = new MapperBuilder().build().readObject(new ByteArrayInputStream(BIG_OBJECT_STR.getBytes()),
                 TheObject.class); // suppose reader writes but this is tested