Sure, note: I think mapperbuilder can have a comparator to order
fields, can solve it


Romain Manni-Bucau
@rmannibucau
http://www.tomitribe.com
http://rmannibucau.wordpress.com
https://github.com/rmannibucau


2014-11-06 10:40 GMT+00:00 Hendrik Dev <[email protected]>:
> is that what you mean?:
>
> https://github.com/salyh/incubator-johnzon/commits/attributeordering
> https://travis-ci.org/salyh/incubator-johnzon/builds/40163725
>
> if so i am happy to commit it into master
>
> On Wed, Nov 5, 2014 at 10:58 PM, Romain Manni-Bucau
> <[email protected]> wrote:
>> Hmm hashmap is better for runtime. Test should be fix rather than src/main.
>>
>> Please revert or proove me im wrong
>> Le 5 nov. 2014 20:10, "Hendrik Dev" <[email protected]> a écrit :
>>
>>> java 6,7,8 build is green ->
>>> https://travis-ci.org/salyh/incubator-johnzon/builds/40102683
>>>
>>> On Wed, Nov 5, 2014 at 8:53 PM, Hendrik Dev <[email protected]>
>>> wrote:
>>> > fixed the ordering here:
>>> >
>>> https://github.com/apache/incubator-johnzon/commit/c0ebe9d2acbd8515a6169e7c1c80ecbe3ae67988#diff-2f240336715f1d8e5f8d4223ee4a6e19R207
>>> >
>>> > (line 207 in Mappings.java -> change HashMap to LinkedHashMap, this
>>> > maker iterator() ordering reliable)
>>> >
>>> > will clean up the testcase ..
>>> >
>>> > On Tue, Nov 4, 2014 at 11:59 PM, Romain Manni-Bucau
>>> > <[email protected]> wrote:
>>> >> Maybe too late but is the commit in MapperTest intended? to avoid
>>> >> ordering issue it was using try/catch pattern, now it seems this is
>>> >> broken
>>> >>
>>> >>
>>> >> Romain Manni-Bucau
>>> >> @rmannibucau
>>> >> http://www.tomitribe.com
>>> >> http://rmannibucau.wordpress.com
>>> >> https://github.com/rmannibucau
>>> >>
>>> >>
>>> >>
>>> >> ---------- Forwarded message ----------
>>> >> From:  <[email protected]>
>>> >> Date: 2014-11-04 22:53 GMT+00:00
>>> >> Subject: [2/2] git commit: JOHNZON-21 (renamed setter/getter to
>>> >> method), implemented basic null and empty array handling (allow to
>>> >> have nulls in the serialization, allow to have/skip empty arrays in
>>> >> the serialization)
>>> >> To: [email protected]
>>> >>
>>> >>
>>> >> JOHNZON-21 (renamed setter/getter to method), implemented basic null
>>> >> and empty array handling (allow to have nulls in the serialization,
>>> >> allow to have/skip empty arrays in the serialization)
>>> >>
>>> >>
>>> >> Project: http://git-wip-us.apache.org/repos/asf/incubator-johnzon/repo
>>> >> Commit:
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/commit/c0ebe9d2
>>> >> Tree:
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/tree/c0ebe9d2
>>> >> Diff:
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/diff/c0ebe9d2
>>> >>
>>> >> Branch: refs/heads/master
>>> >> Commit: c0ebe9d2acbd8515a6169e7c1c80ecbe3ae67988
>>> >> Parents: 7176fde
>>> >> Author: Hendrik Saly <[email protected]>
>>> >> Authored: Tue Nov 4 23:53:29 2014 +0100
>>> >> Committer: Hendrik Saly <[email protected]>
>>> >> Committed: Tue Nov 4 23:53:29 2014 +0100
>>> >>
>>> >> ----------------------------------------------------------------------
>>> >>  .../java/org/apache/johnzon/mapper/Mapper.java  |  37 +++-
>>> >>  .../apache/johnzon/mapper/MapperBuilder.java    |  14 +-
>>> >>  .../johnzon/mapper/reflection/Mappings.java     |  18 +-
>>> >>  .../org/apache/johnzon/mapper/MapperTest.java   |   2 +-
>>> >>  .../org/apache/johnzon/mapper/NullTest.java     | 195
>>> +++++++++++++++++++
>>> >>  5 files changed, 248 insertions(+), 18 deletions(-)
>>> >> ----------------------------------------------------------------------
>>> >>
>>> >>
>>> >>
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c0ebe9d2/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 eadaac9..77dd96c 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
>>> >> @@ -74,16 +74,20 @@ public class Mapper {
>>> >>      protected final boolean close;
>>> >>      protected final ConcurrentMap<Type, Converter<?>> converters;
>>> >>      protected final int version;
>>> >> +    protected boolean skipNull;
>>> >> +    protected boolean skipEmptyArray;
>>> >>
>>> >>      public Mapper(final JsonReaderFactory readerFactory, final
>>> >> JsonGeneratorFactory generatorFactory,
>>> >>                    final boolean doClose, final Map<Class<?>,
>>> >> Converter<?>> converters,
>>> >> -                  final int version, final Comparator<String>
>>> attributeOrder) {
>>> >> +                  final int version, final Comparator<String>
>>> >> attributeOrder, boolean skipNull, boolean skipEmptyArray) {
>>> >>          this.readerFactory = readerFactory;
>>> >>          this.generatorFactory = generatorFactory;
>>> >>          this.close = doClose;
>>> >>          this.converters = new ConcurrentHashMap<Type,
>>> >> Converter<?>>(converters);
>>> >>          this.version = version;
>>> >>          this.mappings = new Mappings(attributeOrder);
>>> >> +        this.skipNull =  skipNull;
>>> >> +        this.skipEmptyArray = skipEmptyArray;
>>> >>      }
>>> >>
>>> >>      private static JsonGenerator writePrimitives(final JsonGenerator
>>> >> generator, final Object value) {
>>> >> @@ -301,11 +305,20 @@ public class Mapper {
>>> >>          JsonGenerator generator = gen;
>>> >>          for (final Map.Entry<String, Mappings.Getter> getterEntry :
>>> >> classMapping.getters.entrySet()) {
>>> >>              final Mappings.Getter getter = getterEntry.getValue();
>>> >> -            final Object value = getter.setter.invoke(object);
>>> >> -            if (value == null || (getter.version >= 0 && version >=
>>> >> getter.version)) {
>>> >> +            final Object value = getter.method.invoke(object);
>>> >> +            if (getter.version >= 0 && version >= getter.version) {
>>> >>                  continue;
>>> >>              }
>>> >>
>>> >> +            if (value == null) {
>>> >> +                if(skipNull) {
>>> >> +                    continue;
>>> >> +                } else {
>>> >> +                    gen.writeNull(getterEntry.getKey());
>>> >> +                    continue;
>>> >> +                }
>>> >> +            }
>>> >> +
>>> >>              generator = writeValue(generator, value.getClass(),
>>> >>                                      getter.primitive, getter.array,
>>> >>                                      getter.collection, getter.map,
>>> >> @@ -319,11 +332,17 @@ public class Mapper {
>>> >>          JsonGenerator generator = gen;
>>> >>          for (final Map.Entry<?, ?> entry : ((Map<?, ?>)
>>> object).entrySet()) {
>>> >>              final Object value = entry.getValue();
>>> >> +            final Object key = entry.getKey();
>>> >> +
>>> >>              if (value == null) {
>>> >> -                continue;
>>> >> +                if(skipNull) {
>>> >> +                    continue;
>>> >> +                } else {
>>> >> +                    gen.writeNull(key == null ? "null" :
>>> key.toString());
>>> >> +                    continue;
>>> >> +                }
>>> >>              }
>>> >>
>>> >> -            final Object key = entry.getKey();
>>> >>              final Class<?> valueClass = value.getClass();
>>> >>              final boolean primitive = Mappings.isPrimitive(valueClass);
>>> >>              final boolean clazz = mappings.getClassMapping(valueClass)
>>> != null;
>>> >> @@ -342,8 +361,12 @@ public class Mapper {
>>> >>                                       final boolean collection, final
>>> >> boolean map,
>>> >>                                       final String key, final Object
>>> >> value) throws InvocationTargetException, IllegalAccessException {
>>> >>          if (array) {
>>> >> -            JsonGenerator gen = generator.writeStartArray(key);
>>> >>              final int length = Array.getLength(value);
>>> >> +            if(length == 0 && skipEmptyArray) {
>>> >> +                return generator;
>>> >> +            }
>>> >> +
>>> >> +            JsonGenerator gen = generator.writeStartArray(key);
>>> >>              for (int i = 0; i < length; i++) {
>>> >>                  gen = writeItem(gen, Array.get(value, i));
>>> >>              }
>>> >> @@ -511,7 +534,7 @@ public class Mapper {
>>> >>          for (final Map.Entry<String, Mappings.Setter> setter :
>>> >> classMapping.setters.entrySet()) {
>>> >>              final JsonValue jsonValue = object.get(setter.getKey());
>>> >>              final Mappings.Setter value = setter.getValue();
>>> >> -            final Method setterMethod = value.setter;
>>> >> +            final Method setterMethod = value.method;
>>> >>              final Object convertedValue = value.converter == null?
>>> >>                      toObject(jsonValue, value.paramType) :
>>> >> jsonValue.getValueType() == ValueType.STRING ?
>>> >>
>>> >>
>>> value.converter.fromString(JsonString.class.cast(jsonValue).getString()):
>>> >>
>>> >>
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c0ebe9d2/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
>>> >> ----------------------------------------------------------------------
>>> >> diff --git
>>> a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
>>> >>
>>> b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
>>> >> index e31aab6..b20fdbd 100644
>>> >> ---
>>> a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
>>> >> +++
>>> b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
>>> >> @@ -78,6 +78,8 @@ public class MapperBuilder {
>>> >>      private boolean doCloseOnStreams = false;
>>> >>      private int version = -1;
>>> >>      private Comparator<String> attributeOrder = null;
>>> >> +    private boolean skipNull = true;
>>> >> +    private boolean skipEmptyArray = false;
>>> >>      private final Map<Class<?>, Converter<?>> converters = new
>>> >> HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS);
>>> >>
>>> >>      public Mapper build() {
>>> >> @@ -92,7 +94,7 @@ public class MapperBuilder {
>>> >>              }
>>> >>          }
>>> >>
>>> >> -        return new Mapper(readerFactory, generatorFactory,
>>> >> doCloseOnStreams, converters, version, attributeOrder);
>>> >> +        return new Mapper(readerFactory, generatorFactory,
>>> >> doCloseOnStreams, converters, version, attributeOrder, skipNull,
>>> >> skipEmptyArray);
>>> >>      }
>>> >>
>>> >>      public MapperBuilder setAttributeOrder(final Comparator<String>
>>> >> attributeOrder) {
>>> >> @@ -124,4 +126,14 @@ public class MapperBuilder {
>>> >>          this.version = version;
>>> >>          return this;
>>> >>      }
>>> >> +
>>> >> +    public MapperBuilder setSkipNull(final boolean skipNull) {
>>> >> +        this.skipNull = skipNull;
>>> >> +        return this;
>>> >> +    }
>>> >> +
>>> >> +    public MapperBuilder setSkipEmptyArray(final boolean
>>> skipEmptyArray) {
>>> >> +        this.skipEmptyArray = skipEmptyArray;
>>> >> +        return this;
>>> >> +    }
>>> >>  }
>>> >>
>>> >>
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c0ebe9d2/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
>>> >> ----------------------------------------------------------------------
>>> >> diff --git
>>> a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
>>> >>
>>> b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
>>> >> index 5baae6b..d0e2d07 100644
>>> >> ---
>>> a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
>>> >> +++
>>> b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
>>> >> @@ -33,7 +33,7 @@ import java.math.BigDecimal;
>>> >>  import java.math.BigInteger;
>>> >>  import java.util.Collection;
>>> >>  import java.util.Comparator;
>>> >> -import java.util.HashMap;
>>> >> +import java.util.LinkedHashMap;
>>> >>  import java.util.List;
>>> >>  import java.util.Map;
>>> >>  import java.util.Queue;
>>> >> @@ -70,7 +70,7 @@ public class Mappings {
>>> >>      }
>>> >>
>>> >>      public static class Getter {
>>> >> -        public final Method setter;
>>> >> +        public final Method method;
>>> >>          public final int version;
>>> >>          public final Converter<Object> converter;
>>> >>          public final boolean primitive;
>>> >> @@ -78,11 +78,11 @@ public class Mappings {
>>> >>          public final boolean map;
>>> >>          public final boolean collection;
>>> >>
>>> >> -        public Getter(final Method setter,
>>> >> +        public Getter(final Method method,
>>> >>                        final boolean primitive, final boolean array,
>>> >>                        final boolean collection, final boolean map,
>>> >>                        final Converter<Object> converter, final int
>>> version) {
>>> >> -            this.setter = setter;
>>> >> +            this.method = method;
>>> >>              this.converter = converter;
>>> >>              this.version = version;
>>> >>              this.array = array;
>>> >> @@ -93,14 +93,14 @@ public class Mappings {
>>> >>      }
>>> >>
>>> >>      public static class Setter {
>>> >> -        public final Method setter;
>>> >> +        public final Method method;
>>> >>          public final int version;
>>> >>          public final Type paramType;
>>> >>          public final Converter<?> converter;
>>> >>          public final boolean primitive;
>>> >>
>>> >> -        public Setter(final Method setter, final boolean primitive,
>>> >> final Type paramType, final Converter<?> converter, final int version)
>>> >> {
>>> >> -            this.setter = setter;
>>> >> +        public Setter(final Method method, final boolean primitive,
>>> >> final Type paramType, final Converter<?> converter, final int version)
>>> >> {
>>> >> +            this.method = method;
>>> >>              this.paramType = paramType;
>>> >>              this.converter = converter;
>>> >>              this.version = version;
>>> >> @@ -204,9 +204,9 @@ public class Mappings {
>>> >>      private ClassMapping createClassMapping(final Class<?> clazz) {
>>> >>          try {
>>> >>              final Map<String, Getter> getters = fieldOrdering != null ?
>>> >> -                new TreeMap<String, Getter>(fieldOrdering) : new
>>> >> HashMap<String, Getter>();
>>> >> +                new TreeMap<String, Getter>(fieldOrdering) : new
>>> >> LinkedHashMap<String, Getter>();
>>> >>              final Map<String, Setter> setters = fieldOrdering != null ?
>>> >> -                new TreeMap<String, Setter>(fieldOrdering) : new
>>> >> HashMap<String, Setter>();
>>> >> +                new TreeMap<String, Setter>(fieldOrdering) : new
>>> >> LinkedHashMap<String, Setter>();
>>> >>
>>> >>              final PropertyDescriptor[] propertyDescriptors =
>>> >> Introspector.getBeanInfo(clazz).getPropertyDescriptors();
>>> >>              for (final PropertyDescriptor descriptor :
>>> propertyDescriptors) {
>>> >>
>>> >>
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c0ebe9d2/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 59711d8..26ff435 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
>>> >> @@ -169,7 +169,7 @@ public class MapperTest {
>>> >>              final ByteArrayOutputStream baos = new
>>> ByteArrayOutputStream();
>>> >>              new MapperBuilder().build().writeArray(new Pair[] { new
>>> >> Pair(1, "a"), new Pair(2, "b") }, baos);
>>> >>              try {
>>> >> -
>>> >> assertEquals("[{\"s\":\"a\",\"i\":1},{\"s\":\"b\",\"i\":2}]", new
>>> >> String(baos.toByteArray()));
>>> >> +
>>> >> assertEquals("[{\"i\":1,\"s\":\"a\"},{\"i\":2,\"s\":\"b\"}]", new
>>> >> String(baos.toByteArray()));
>>> >>              } catch (final AssertionFailedError afe) { // a bit lazy
>>> >> but to avoid field ordering on java > 6
>>> >>
>>> >> assertEquals("[{\"i\":1,\"s\":\"a\"},{\"i\":2,\"s\":\"b\"}]", new
>>> >> String(baos.toByteArray()));
>>> >>              }
>>> >>
>>> >>
>>> http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c0ebe9d2/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
>>> >> new file mode 100644
>>> >> index 0000000..54354a2
>>> >> --- /dev/null
>>> >> +++
>>> b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/NullTest.java
>>> >> @@ -0,0 +1,195 @@
>>> >> +/*
>>> >> + * Licensed to the Apache Software Foundation (ASF) under one
>>> >> + * or more contributor license agreements. See the NOTICE file
>>> >> + * distributed with this work for additional information
>>> >> + * regarding copyright ownership. The ASF licenses this file
>>> >> + * to you under the Apache License, Version 2.0 (the
>>> >> + * "License"); you may not use this file except in compliance
>>> >> + * with the License. You may obtain a copy of the License at
>>> >> + *
>>> >> + * http://www.apache.org/licenses/LICENSE-2.0
>>> >> + *
>>> >> + * Unless required by applicable law or agreed to in writing,
>>> >> + * software distributed under the License is distributed on an
>>> >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> >> + * KIND, either express or implied. See the License for the
>>> >> + * specific language governing permissions and limitations
>>> >> + * under the License.
>>> >> + */
>>> >> +package org.apache.johnzon.mapper;
>>> >> +
>>> >> +import static org.junit.Assert.assertEquals;
>>> >> +
>>> >> +import java.io.StringWriter;
>>> >> +import java.util.Comparator;
>>> >> +import java.util.LinkedHashMap;
>>> >> +import java.util.Map;
>>> >> +
>>> >> +import org.junit.Test;
>>> >> +
>>> >> +public class NullTest {
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectDefault() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +        new MapperBuilder().build().writeObject(new NullObject(),
>>> writer);
>>> >> +        assertEquals("{\"emptyArray\":[]}", writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectDefaultMap() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +
>>> >> +        final String expectedJson =
>>> >> "{\"map\":{\"key1\":\"val1\",\"null\":\"val3\"}}";
>>> >> +
>>> >> +        final Comparator<String> attributeOrder = new
>>> Comparator<String>() {
>>> >> +            @Override
>>> >> +            public int compare(String o1, String o2) {
>>> >> +
>>> >> +                if(o1 == null) {
>>> >> +                    o1 = "null";
>>> >> +                }
>>> >> +
>>> >> +                if(o2 == null) {
>>> >> +                    o2 = "null";
>>> >> +                }
>>> >> +
>>> >> +                return expectedJson.indexOf(o1) -
>>> expectedJson.indexOf(o2);
>>> >> +            }
>>> >> +        };
>>> >> +
>>> >> +        new
>>> MapperBuilder().setAttributeOrder(attributeOrder).build().writeObject(new
>>> >> NullObjectWithMap(), writer);
>>> >> +        assertEquals(expectedJson, writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectDefaultMapAllowNull() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +
>>> >> +        final String expectedJson =
>>> >> "{\"map\":{\"key1\":\"val1\",\"key2\":null,\"null\":\"val3\"}}";
>>> >> +
>>> >> +        final Comparator<String> attributeOrder = new
>>> Comparator<String>() {
>>> >> +            @Override
>>> >> +            public int compare(String o1, String o2) {
>>> >> +
>>> >> +                if(o1 == null) {
>>> >> +                    o1 = "null";
>>> >> +                }
>>> >> +
>>> >> +                if(o2 == null) {
>>> >> +                    o2 = "null";
>>> >> +                }
>>> >> +
>>> >> +                return expectedJson.indexOf(o1) -
>>> expectedJson.indexOf(o2);
>>> >> +            }
>>> >> +        };
>>> >> +
>>> >> +        new
>>> MapperBuilder().setSkipNull(false).setAttributeOrder(attributeOrder).build().writeObject(new
>>> >> NullObjectWithMap(), writer);
>>> >> +        assertEquals(expectedJson, writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectAllowNull() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +
>>> >> +        final String expectedJson =
>>> >>
>>> "{\"stringIsnull\":null,\"integerIsnull\":null,\"nullArray\":null,\"emptyArray\":[]}";
>>> >> +
>>> >> +        final Comparator<String> attributeOrder = new
>>> Comparator<String>() {
>>> >> +            @Override
>>> >> +            public int compare(final String o1, final String o2) {
>>> >> +                return expectedJson.indexOf(o1) -
>>> expectedJson.indexOf(o2);
>>> >> +            }
>>> >> +        };
>>> >> +
>>> >> +        new
>>> MapperBuilder().setSkipNull(false).setAttributeOrder(attributeOrder).build().writeObject(new
>>> >> NullObject(), writer);
>>> >> +        assertEquals(expectedJson, writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectAllowNullSkipEmptyArray() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +
>>> >> +        final String expectedJson =
>>> >> "{\"stringIsnull\":null,\"integerIsnull\":null,\"nullArray\":null}";
>>> >> +
>>> >> +        final Comparator<String> attributeOrder = new
>>> Comparator<String>() {
>>> >> +            @Override
>>> >> +            public int compare(final String o1, final String o2) {
>>> >> +                return expectedJson.indexOf(o1) -
>>> expectedJson.indexOf(o2);
>>> >> +            }
>>> >> +        };
>>> >> +
>>> >> +        new
>>> MapperBuilder().setSkipNull(false).setSkipEmptyArray(true).setAttributeOrder(attributeOrder).build()
>>> >> +                .writeObject(new NullObject(), writer);
>>> >> +        assertEquals(expectedJson, writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    @Test
>>> >> +    public void writeNullObjectSkipAll() {
>>> >> +        final StringWriter writer = new StringWriter();
>>> >> +        new
>>> MapperBuilder().setSkipNull(true).setSkipEmptyArray(true).build().writeObject(new
>>> >> NullObject(), writer);
>>> >> +        assertEquals("{}", writer.toString());
>>> >> +    }
>>> >> +
>>> >> +    public static class NullObjectWithMap {
>>> >> +
>>> >> +        private Map map = new LinkedHashMap();
>>> >> +
>>> >> +        NullObjectWithMap() {
>>> >> +            super();
>>> >> +            map.put("key1", "val1");
>>> >> +            map.put("key2", null);
>>> >> +            map.put(null, "val3");
>>> >> +        }
>>> >> +
>>> >> +        public Map getMap() {
>>> >> +            return map;
>>> >> +        }
>>> >> +
>>> >> +        public void setMap(final Map map) {
>>> >> +            this.map = map;
>>> >> +        }
>>> >> +
>>> >> +    }
>>> >> +
>>> >> +    public static class NullObject {
>>> >> +
>>> >> +        private String stringIsnull;
>>> >> +        private Integer integerIsnull;
>>> >> +        private String[] nullArray;
>>> >> +        private String[] emptyArray = new String[0];
>>> >> +
>>> >> +        public String[] getNullArray() {
>>> >> +            return nullArray;
>>> >> +        }
>>> >> +
>>> >> +        public void setNullArray(final String[] nullArray) {
>>> >> +            this.nullArray = nullArray;
>>> >> +        }
>>> >> +
>>> >> +        public String[] getEmptyArray() {
>>> >> +            return emptyArray;
>>> >> +        }
>>> >> +
>>> >> +        public void setEmptyArray(final String[] emptyArray) {
>>> >> +            this.emptyArray = emptyArray;
>>> >> +        }
>>> >> +
>>> >> +        public String getStringIsnull() {
>>> >> +            return stringIsnull;
>>> >> +        }
>>> >> +
>>> >> +        public void setStringIsnull(final String stringIsnull) {
>>> >> +            this.stringIsnull = stringIsnull;
>>> >> +        }
>>> >> +
>>> >> +        public Integer getIntegerIsnull() {
>>> >> +            return integerIsnull;
>>> >> +        }
>>> >> +
>>> >> +        public void setIntegerIsnull(final Integer integerIsnull) {
>>> >> +            this.integerIsnull = integerIsnull;
>>> >> +        }
>>> >> +
>>> >> +    }
>>> >> +
>>> >> +}
>>> >
>>> >
>>> >
>>> > --
>>> > Hendrik Saly (salyh, hendrikdev22)
>>> > @hendrikdev22
>>> > PGP: 0x22D7F6EC
>>>
>>>
>>>
>>> --
>>> Hendrik Saly (salyh, hendrikdev22)
>>> @hendrikdev22
>>> PGP: 0x22D7F6EC
>>>
>
>
>
> --
> Hendrik Saly (salyh, hendrikdev22)
> @hendrikdev22
> PGP: 0x22D7F6EC

Reply via email to