You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2016/08/26 08:11:58 UTC

johnzon git commit: JOHNZON-94 making JsonValue serializable

Repository: johnzon
Updated Branches:
  refs/heads/master f634af84f -> 60525af05


JOHNZON-94 making JsonValue serializable


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

Branch: refs/heads/master
Commit: 60525af05ea8154529fac1206b6231d9757d0333
Parents: f634af8
Author: Romain manni-Bucau <rm...@gmail.com>
Authored: Fri Aug 26 10:11:44 2016 +0200
Committer: Romain manni-Bucau <rm...@gmail.com>
Committed: Fri Aug 26 10:11:44 2016 +0200

----------------------------------------------------------------------
 .../johnzon/core/JsonArrayBuilderImpl.java      |  11 +-
 .../org/apache/johnzon/core/JsonArrayImpl.java  |  25 ++--
 .../org/apache/johnzon/core/JsonDoubleImpl.java |   6 +-
 .../org/apache/johnzon/core/JsonLongImpl.java   |   6 +-
 .../org/apache/johnzon/core/JsonNumberImpl.java |   8 +-
 .../johnzon/core/JsonObjectBuilderImpl.java     |   4 +-
 .../org/apache/johnzon/core/JsonObjectImpl.java |  25 ++--
 .../org/apache/johnzon/core/JsonReaderImpl.java |   6 +-
 .../org/apache/johnzon/core/JsonStringImpl.java |   5 +-
 .../johnzon/core/SerializablePrimitives.java    |  97 ++++++++++++++
 .../apache/johnzon/core/SerializationTest.java  | 130 +++++++++++++++++++
 .../johnzon/mapper/MappingParserImpl.java       |  20 +--
 12 files changed, 277 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
index 5dfd839..ea46072 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.java
@@ -18,6 +18,10 @@
  */
 package org.apache.johnzon.core;
 
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -25,11 +29,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-
 class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
     private List<JsonValue> tmpList;
 
@@ -77,7 +76,7 @@ class JsonArrayBuilderImpl implements JsonArrayBuilder, Serializable {
 
     @Override
     public JsonArrayBuilder add(final boolean value) {
-        addValue(value ? JsonValue.TRUE : JsonValue.FALSE);
+        addValue(value ? SerializablePrimitives.TRUE : SerializablePrimitives.FALSE);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
index fee44ce..6906645 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
@@ -18,16 +18,15 @@
  */
 package org.apache.johnzon.core;
 
-import java.io.Serializable;
-import java.util.AbstractList;
-import java.util.Iterator;
-import java.util.List;
-
 import javax.json.JsonArray;
 import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonString;
 import javax.json.JsonValue;
+import java.io.Serializable;
+import java.util.AbstractList;
+import java.util.Iterator;
+import java.util.List;
 
 class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serializable {
     private Integer hashCode = null;
@@ -119,9 +118,9 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
     public boolean getBoolean(final int index) {
         final JsonValue val = value(index, JsonValue.class);
 
-        if (val == JsonValue.TRUE) {
+        if (SerializablePrimitives.TRUE.equals(val)) {
             return true;
-        } else if (val == JsonValue.FALSE) {
+        } else if (SerializablePrimitives.FALSE.equals(val)) {
             return false;
         } else {
             throw new ClassCastException();
@@ -144,20 +143,12 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial
         }
 
         final JsonValue val = get(index);
-
-        if (val == JsonValue.TRUE) {
-            return true;
-        } else if (val == JsonValue.FALSE) {
-            return false;
-        } else {
-            return defaultValue;
-        }
-
+        return SerializablePrimitives.TRUE.equals(val) || !SerializablePrimitives.FALSE.equals(val) && defaultValue;
     }
 
     @Override
     public boolean isNull(final int index) {
-        return value(index, JsonValue.class) == JsonValue.NULL;
+        return JsonValue.NULL.equals(value(index, JsonValue.class));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
index bb51b36..cff63c0 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
@@ -18,12 +18,12 @@
  */
 package org.apache.johnzon.core;
 
+import javax.json.JsonNumber;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-import javax.json.JsonNumber;
-
-final class JsonDoubleImpl implements JsonNumber {
+final class JsonDoubleImpl implements JsonNumber, Serializable {
     private final double value;
 
     JsonDoubleImpl(final double value) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java
index 1a85b0b..4068d9b 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java
@@ -18,12 +18,12 @@
  */
 package org.apache.johnzon.core;
 
+import javax.json.JsonNumber;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-import javax.json.JsonNumber;
-
-public final class JsonLongImpl implements JsonNumber {
+public final class JsonLongImpl implements JsonNumber, Serializable {
     private final long value;
 
     JsonLongImpl(final long value) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
index 8b560ed..9ad7752 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
@@ -18,14 +18,14 @@
  */
 package org.apache.johnzon.core;
 
+import javax.json.JsonNumber;
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-import javax.json.JsonNumber;
-
-final class JsonNumberImpl implements JsonNumber {
+final class JsonNumberImpl implements JsonNumber, Serializable {
     private final BigDecimal value;
-    private Integer hashCode = null;
+    private transient Integer hashCode = null;
 
     JsonNumberImpl(final BigDecimal decimal) {
         if(decimal == null) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
index ea15a17..2a260f3 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -77,13 +77,13 @@ class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
 
     @Override
     public JsonObjectBuilder add(final String name, final boolean value) {
-        putValue(name, value ? JsonValue.TRUE : JsonValue.FALSE);
+        putValue(name, value ? SerializablePrimitives.TRUE : SerializablePrimitives.FALSE);
         return this;
     }
 
     @Override
     public JsonObjectBuilder addNull(final String name) {
-        putValue(name, JsonValue.NULL);
+        putValue(name, SerializablePrimitives.NULL);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
index d7912cb..ef8b84d 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
@@ -18,21 +18,20 @@
  */
 package org.apache.johnzon.core;
 
-import java.io.Serializable;
-import java.util.AbstractMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
 import javax.json.JsonArray;
 import javax.json.JsonNumber;
 import javax.json.JsonObject;
 import javax.json.JsonString;
 import javax.json.JsonValue;
+import java.io.Serializable;
+import java.util.AbstractMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
 
 
 final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject, Serializable {
-    private Integer hashCode = null;
+    private transient Integer hashCode = null;
     private final Map<String, JsonValue> unmodifieableBackingMap;
 
     private <T> T value(final String name, final Class<T> clazz) {
@@ -109,20 +108,14 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso
 
     @Override
     public boolean getBoolean(final String name) {
-        return value(name, JsonValue.class) == JsonValue.TRUE;
+        return SerializablePrimitives.TRUE.equals(value(name, JsonValue.class));
     }
 
     @Override
     public boolean getBoolean(final String name, final boolean defaultValue) {
         final Object v = unmodifieableBackingMap.get(name);
         if (v != null) {
-            if (v == JsonValue.TRUE) {
-                return true;
-            } else if (v == JsonValue.FALSE) {
-                return false;
-            } else {
-                return defaultValue;
-            }
+            return SerializablePrimitives.TRUE.equals(v) || !SerializablePrimitives.FALSE.equals(v) && defaultValue;
         } else {
             return defaultValue;
         }
@@ -130,7 +123,7 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso
 
     @Override
     public boolean isNull(final String name) {
-        return value(name, JsonValue.class) == JsonValue.NULL;
+        return JsonValue.NULL.equals(value(name, JsonValue.class));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
index b0107ee..2632c9a 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -79,19 +79,19 @@ public class JsonReaderImpl implements JsonReader {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
                 }
                 close();
-                return JsonValue.FALSE;
+                return SerializablePrimitives.FALSE;
             case VALUE_TRUE:
                 if (parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
                 }
                 close();
-                return JsonValue.TRUE;
+                return SerializablePrimitives.TRUE;
             case VALUE_NULL:
                 if (parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());
                 }
                 close();
-                return JsonValue.NULL;
+                return SerializablePrimitives.NULL;
             case VALUE_NUMBER:
                 if (parser.hasNext()) {
                     throw new JsonParsingException("Expected end of file", parser.getLocation());

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
index a7e8f29..5ec8a36 100644
--- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
@@ -19,11 +19,12 @@
 package org.apache.johnzon.core;
 
 import javax.json.JsonString;
+import java.io.Serializable;
 
-final class JsonStringImpl implements JsonString {
+final class JsonStringImpl implements JsonString, Serializable {
     private final String value;
     private String escape;
-    private Integer hashCode = null;
+    private transient Integer hashCode = null;
 
 
     JsonStringImpl(final String value) {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java b/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
new file mode 100644
index 0000000..c046f85
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/SerializablePrimitives.java
@@ -0,0 +1,97 @@
+/*
+ * 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.core;
+
+import javax.json.JsonValue;
+import java.io.InvalidObjectException;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+
+public final class SerializablePrimitives {
+    private SerializablePrimitives() {
+        // no-op
+    }
+
+    public static final JsonValue NULL = new SerializableJsonValue(JsonValue.NULL);
+    public static final JsonValue TRUE = new SerializableJsonValue(JsonValue.TRUE);
+    public static final JsonValue FALSE = new SerializableJsonValue(JsonValue.FALSE);
+
+    private static final class SerializableJsonValue implements JsonValue, Serializable {
+        private final JsonValue delegate;
+
+        SerializableJsonValue(final JsonValue value) {
+            delegate = value;
+        }
+
+        @Override
+        public ValueType getValueType() {
+            return delegate.getValueType();
+        }
+
+        @Override
+        public String toString() {
+            return delegate.toString();
+        }
+
+        @Override
+        public boolean equals(final Object o) {
+            if (this == o || o == delegate) {
+                return true;
+            }
+            if (o == null) {
+                return false;
+            }
+            if (SerializableJsonValue.class.isInstance(o)) {
+                return SerializableJsonValue.class.cast(o).delegate.equals(delegate);
+            }
+            return JsonValue.class.isInstance(o) && o.equals(delegate);
+
+        }
+
+        @Override
+        public int hashCode() {
+            return delegate.hashCode();
+        }
+
+        private Object writeReplace() throws ObjectStreamException {
+            return new SerializationReplacement(delegate.toString());
+        }
+    }
+
+    private static final class SerializationReplacement implements Serializable {
+        private final String value;
+
+        private SerializationReplacement(final String value) {
+            this.value = value;
+        }
+
+        private Object readResolve() throws ObjectStreamException {
+            if ("null".equals(value)) {
+                return NULL;
+            }
+            if ("true".equals(value)) {
+                return TRUE;
+            }
+            if ("false".equals(value)) {
+                return FALSE;
+            }
+            throw new InvalidObjectException("Unknown " + value);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
new file mode 100644
index 0000000..b80aae7
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/SerializationTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.core;
+
+import org.junit.Test;
+
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+
+public class SerializationTest {
+    @Test
+    public void jsonString() throws IOException, ClassNotFoundException {
+        final JsonString source = new JsonStringImpl("test");
+        final JsonString string = serialDeser(source);
+        assertNotSame(source, string);
+        assertEquals("test", string.getString());
+        assertEquals("\"test\"", string.toString());
+    }
+
+    @Test
+    public void jsonNumber() throws IOException, ClassNotFoundException {
+        final JsonNumber source = new JsonNumberImpl(new BigDecimal("1.0"));
+        final JsonNumber deserialized = serialDeser(source);
+        assertNotSame(source, deserialized);
+        assertEquals(1.0, deserialized.doubleValue(), 0.);
+        assertEquals("1.0", deserialized.toString());
+    }
+
+    @Test
+    public void jsonLong() throws IOException, ClassNotFoundException {
+        final JsonNumber source = new JsonLongImpl(1);
+        final JsonNumber string = serialDeser(source);
+        assertNotSame(source, string);
+        assertEquals(1, string.longValue());
+        assertEquals("1", string.toString());
+    }
+
+    @Test
+    public void jsonDouble() throws IOException, ClassNotFoundException {
+        final JsonNumber source = new JsonDoubleImpl(1.5);
+        final JsonNumber string = serialDeser(source);
+        assertNotSame(source, string);
+        assertEquals(1.5, string.doubleValue(), 0.);
+        assertEquals("1.5", string.toString());
+    }
+
+    @Test
+    public void jsonObject() throws IOException, ClassNotFoundException {
+        final Map<String, JsonValue> map = new LinkedHashMap<String, JsonValue>();
+        map.put("test", new JsonStringImpl("val"));
+        final JsonObject source = new JsonObjectImpl(Collections.unmodifiableMap(map));
+        final JsonObject serialization = serialDeser(source);
+        assertNotSame(source, serialization);
+        assertTrue(serialization.containsKey("test"));
+        assertEquals("val", serialization.getString("test"));
+        assertEquals(1, serialization.size());
+    }
+
+    @Test
+    public void jsonArray() throws IOException, ClassNotFoundException {
+        final List<JsonValue> list = new ArrayList<JsonValue>();
+        list.add(new JsonStringImpl("test"));
+        final JsonArray source = new JsonArrayImpl(Collections.unmodifiableList(list));
+        final JsonArray serialization = serialDeser(source);
+        assertNotSame(source, serialization);
+        assertEquals(1, serialization.size());
+        assertEquals("test", JsonString.class.cast(serialization.iterator().next()).getString());
+    }
+
+    @Test
+    public void jsonPrimitives() throws IOException, ClassNotFoundException { // NOTE: spec jar primitives are not serializable
+        for (final JsonValue v : asList(SerializablePrimitives.FALSE, SerializablePrimitives.TRUE, SerializablePrimitives.NULL)) {
+            assertEquals(v, serialDeser(v));
+        }
+    }
+
+    @Test
+    public void primitiveInObject() throws IOException, ClassNotFoundException {
+        assertTrue(serialDeser(JsonProviderImpl.provider().createObjectBuilder()
+                .add("bool", true)
+                .build()
+                .getBoolean("bool")));
+    }
+
+    private static <T> T serialDeser(final T instance) throws IOException, ClassNotFoundException {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(instance);
+        oos.close();
+        final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
+        try {
+            return (T) in.readObject();
+        } finally {
+            in.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/johnzon/blob/60525af0/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 a96a64e..e731b8f 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
@@ -173,13 +173,13 @@ public class MappingParserImpl implements MappingParser {
                 return (T) new ArrayList(asList(Object[].class.cast(buildArrayWithComponentType(jsonArray, Object.class, null))));
             }
         }
-        if (JsonValue.NULL == jsonValue) {
+        if (JsonValue.NULL.equals(jsonValue)) {
             return null;
         }
-        if (JsonValue.TRUE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
+        if (jsonValue.equals(JsonValue.TRUE) && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
             return (T) Boolean.TRUE;
         }
-        if (JsonValue.FALSE == jsonValue && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
+        if (jsonValue.equals(JsonValue.FALSE) && (Boolean.class == targetType || boolean.class == targetType || Object.class == targetType)) {
             return (T) Boolean.FALSE;
         }
         throw new IllegalArgumentException("Unsupported " + jsonValue + " for type " + targetType);
@@ -301,7 +301,7 @@ public class MappingParserImpl implements MappingParser {
             }
 
             final AccessMode.Writer setterMethod = value.writer;
-            if (jsonValue == JsonValue.NULL) { // forced
+            if (JsonValue.NULL.equals(jsonValue)) { // forced
                 setterMethod.write(t, null);
             } else {
                 Object existingInstance = null;
@@ -422,15 +422,15 @@ public class MappingParserImpl implements MappingParser {
 
     private Object toObject(final Object baseInstance, final JsonValue jsonValue,
                             final Type type, final Adapter itemConverter) {
-        if (jsonValue == null || JsonValue.NULL == jsonValue) {
+        if (jsonValue == null || JsonValue.NULL.equals(jsonValue)) {
             return null;
         }
 
         if (type == Boolean.class || type == boolean.class) {
-            if (jsonValue == JsonValue.TRUE) {
+            if (jsonValue.equals(JsonValue.TRUE)) {
                 return true;
             }
-            if (jsonValue == JsonValue.FALSE) {
+            if (jsonValue.equals(JsonValue.FALSE)) {
                 return false;
             }
             throw new MapperException("Unable to parse " + jsonValue + " to boolean");
@@ -441,10 +441,10 @@ public class MappingParserImpl implements MappingParser {
         }
 
         if (Object.class == type) { // handling specific types here to keep exception in standard handling
-            if (jsonValue == JsonValue.TRUE) {
+            if (jsonValue.equals(JsonValue.TRUE)) {
                 return true;
             }
-            if (jsonValue == JsonValue.FALSE) {
+            if (jsonValue.equals(JsonValue.FALSE)) {
                 return false;
             }
             if (JsonNumber.class.isInstance(jsonValue)) {
@@ -584,7 +584,7 @@ public class MappingParserImpl implements MappingParser {
         }
 
         for (final JsonValue value : jsonArray) {
-            collection.add(value == JsonValue.NULL ? null : toObject(null, value, mapping.arg, itemConverter));
+            collection.add(JsonValue.NULL.equals(value) ? null : toObject(null, value, mapping.arg, itemConverter));
         }
 
         if (EnumSet.class == mapping.raw) {