Repository: johnzon
Updated Branches:
  refs/heads/master 60f48cf65 -> ade1c2717


JOHNZON-135 also support deduplication in arrays


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

Branch: refs/heads/master
Commit: ade1c27179830d06488cd80da0fa5ec233025f53
Parents: 60f48cf
Author: Mark Struberg <[email protected]>
Authored: Mon Sep 25 23:19:45 2017 +0200
Committer: Mark Struberg <[email protected]>
Committed: Mon Sep 25 23:20:14 2017 +0200

----------------------------------------------------------------------
 .../johnzon/mapper/MappingGeneratorImpl.java    | 10 ++++-
 .../johnzon/mapper/MappingParserImpl.java       |  4 +-
 .../johnzon/mapper/CircularObjectsTest.java     | 42 ++++++++++++++++++++
 3 files changed, 53 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/ade1c271/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 20b50ce..a76b447 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
@@ -92,7 +92,7 @@ public class MappingGeneratorImpl implements MappingGenerator 
{
             }
 
             if (object instanceof Iterable) {
-                doWriteIterable((Iterable) object, ignoredProperties, 
config.isDeduplicateObjects() ? new JsonPointerTracker(null, "/") : null);
+                doWriteIterable((Iterable) object, ignoredProperties, 
jsonPointer);
                 return;
             }
 
@@ -424,7 +424,13 @@ public class MappingGeneratorImpl implements 
MappingGenerator {
             } else if (o == null) {
                 generator.writeNull();
             } else {
-                doWriteObject(o, generator, true, ignoredProperties, 
jsonPointer);
+                String valJsonPointer = jsonPointers.get(o);
+                if (valJsonPointer != null) {
+                    // write the JsonPointer instead
+                    generator.write(valJsonPointer);
+                } else {
+                    doWriteObject(o, generator, true, ignoredProperties, 
jsonPointer);
+                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/ade1c271/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 101b438..f35fe40 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -600,7 +600,9 @@ public class MappingParserImpl implements MappingParser {
         final Object array = Array.newInstance(componentType, 
jsonArray.size());
         int i = 0;
         for (final JsonValue value : jsonArray) {
-            Array.set(array, i++, toObject(null, value, componentType, 
itemConverter, jsonPointer));
+            Array.set(array, i, toObject(null, value, componentType, 
itemConverter,
+                    config.isDeduplicateObjects() ? new 
JsonPointerTracker(jsonPointer, i) : null));
+            i++;
         }
         return array;
     }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/ade1c271/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
----------------------------------------------------------------------
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
index 4af1d29..c473c6d 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/CircularObjectsTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.johnzon.mapper;
 
+import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -114,6 +115,47 @@ public class CircularObjectsTest {
         }
     }
 
+    @Test
+    public void testCyclesInArrays() {
+        Person karl = new Person("Karl");
+        Person andrea = new Person("Andrea");
+        Person lu = new Person("Lu");
+        Person sue = new Person("Sue");
+
+        karl.setMarriedTo(andrea);
+        karl.getKids().add(lu);
+        karl.getKids().add(sue);
+
+        andrea.setMarriedTo(karl);
+        andrea.getKids().add(lu);
+        andrea.getKids().add(sue);
+
+        lu.setFather(karl);
+        lu.setMother(andrea);
+
+        sue.setFather(karl);
+        sue.setMother(andrea);
+
+        Mapper mapper = new 
MapperBuilder().setAccessModeName("field").setDeduplicateObjects(true).build();
+
+        // test deep array
+        Person[] people = new Person[4];
+        people[0] = karl;
+        people[1] = andrea;
+        people[2] = lu;
+        people[3] = sue;
+
+        String peopleJson = mapper.writeArrayAsString(people);
+        Person[] people2 = mapper.readArray(new StringReader(peopleJson), 
Person.class);
+        assertNotNull(people2);
+        assertEquals(4, people2.length);
+        assertEquals("Karl",   people2[0].getName());
+        assertEquals("Andrea", people2[1].getName());
+        assertEquals("Lu",     people2[2].getName());
+        assertEquals("Sue",    people2[3].getName());
+
+    }
+
     public static class Person {
         private String name;
         private Person marriedTo;

Reply via email to