You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by st...@apache.org on 2017/09/25 21:21:34 UTC

johnzon git commit: JOHNZON-135 also support deduplication in arrays

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 <st...@apache.org>
Authored: Mon Sep 25 23:19:45 2017 +0200
Committer: Mark Struberg <st...@apache.org>
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;