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;
