Repository: johnzon
Updated Branches:
  refs/heads/master 09dd93ef1 -> dc2cd8f7a


JOHNZON-151: Fix serialization of nulls inside a collection inside a parent 
object
* Fixes NullPointerException on attempting to access getClass of null object.
* Fixes silently ignoring nulls within a list/array when they are contained by 
a higher object.


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

Branch: refs/heads/master
Commit: 5bd56828d782738c33826ab117189c097c54277f
Parents: 09dd93e
Author: Steven Walters <[email protected]>
Authored: Sat Dec 30 22:57:18 2017 +0900
Committer: Steven Walters <[email protected]>
Committed: Sat Dec 30 22:57:18 2017 +0900

----------------------------------------------------------------------
 .../johnzon/mapper/MappingGeneratorImpl.java    | 10 +--
 .../org/apache/johnzon/mapper/NullTest.java     | 71 ++++++++++++++++++++
 2 files changed, 76 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/5bd56828/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index 1ed6a3d..b952a57 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -363,7 +363,7 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                     writePrimitives(valJsonPointer);
                 } else {
                     ObjectConverter.Writer objectConverterToUse = 
objectConverter;
-                    if (objectConverterToUse == null) {
+                    if (o != null && objectConverterToUse == null) {
                         objectConverterToUse = 
config.findObjectConverterWriter(o.getClass());
                     }
 
@@ -420,10 +420,12 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
     }
 
     private void writeItem(final Object o, final Collection<String> 
ignoredProperties, JsonPointerTracker jsonPointer) {
-        if (!writePrimitives(o)) {
+        if (o == null) {
+            generator.writeNull();
+        } else if (!writePrimitives(o)) {
             if (Collection.class.isInstance(o)) {
                 doWriteIterable(Collection.class.cast(o), ignoredProperties, 
jsonPointer);
-            } else if (o != null && o.getClass().isArray()) {
+            } else if (o.getClass().isArray()) {
                 final int length = Array.getLength(o);
                 if (length > 0 || !config.isSkipEmptyArray()) {
                     generator.writeStartArray();
@@ -437,8 +439,6 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
                     }
                     generator.writeEnd();
                 }
-            } else if (o == null) {
-                generator.writeNull();
             } else {
                 String valJsonPointer = jsonPointers.get(o);
                 if (valJsonPointer != null) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/5bd56828/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
index 54354a2..95293af 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
@@ -21,8 +21,11 @@ package org.apache.johnzon.mapper;
 import static org.junit.Assert.assertEquals;
 
 import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.Test;
@@ -37,6 +40,54 @@ public class NullTest {
     }
 
     @Test
+    public void writeListWithNull() {
+        StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeIterable(Arrays.asList("one", "two", 
null, "four"), writer);
+        assertEquals("[\"one\",\"two\",null,\"four\"]", writer.toString());
+    }
+
+    @Test
+    public void writeListWithNullWithinMap() {
+        StringWriter writer = new StringWriter();
+        new 
MapperBuilder().build().writeObject(Collections.singletonMap("list",
+                Arrays.asList(5l, null, 300l, 90000000000l)), writer);
+        assertEquals("{\"list\":[5,null,300,90000000000]}", writer.toString());
+    }
+
+    @Test
+    public void writeListWithNullWithinType() {
+        StringWriter writer = new StringWriter();
+        NullContainer container = new NullContainer();
+        container.setList(Arrays.asList(1.4142, 1.7320508757, null, 3.14159));
+        new MapperBuilder().build().writeObject(container, writer);
+        assertEquals("{\"list\":[1.4142,1.7320508757,null,3.14159]}", 
writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNull() {
+        StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeArray(new String[]{ "one", "two", 
"three", null }, writer);
+        assertEquals("[\"one\",\"two\",\"three\",null]", writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNullWithinMap() {
+        StringWriter writer = new StringWriter();
+        new 
MapperBuilder().build().writeObject(Collections.singletonMap("array",
+                new Long[]{ null, 100l, 300l, 90000000000l }), writer);
+        assertEquals("{\"array\":[null,100,300,90000000000]}", 
writer.toString());
+    }
+
+    @Test
+    public void writeArrayWithNullWithinType() {
+        StringWriter writer = new StringWriter();
+        NullContainer container = new NullContainer();
+        container.setArray(new Double[]{ 1.4142, 1.7320508757, 2.2360679775, 
null });
+        new MapperBuilder().build().writeObject(container, writer);
+        assertEquals("{\"array\":[1.4142,1.7320508757,2.2360679775,null]}", 
writer.toString());
+    }
+
+    @Test
     public void writeNullObjectDefaultMap() {
         final StringWriter writer = new StringWriter();
 
@@ -192,4 +243,24 @@ public class NullTest {
 
     }
 
+    public static class NullContainer {
+        private List<Double> list;
+        private Double[] array;
+
+        public Double[] getArray() {
+            return array;
+        }
+
+        public void setArray(Double[] array) {
+            this.array = array;
+        }
+
+        public List<Double> getList() {
+            return list;
+        }
+
+        public void setList(final List<Double> list) {
+            this.list = list;
+        }
+    }
 }

Reply via email to