You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by sa...@apache.org on 2014/09/01 18:50:25 UTC

[01/20] renamed fleece to johnzon

Repository: incubator-fleece
Updated Branches:
  refs/heads/renaming [created] 6e86a53e8


http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/FloatConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/FloatConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/FloatConverter.java
new file mode 100644
index 0000000..feba890
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/FloatConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class FloatConverter implements Converter<Float> {
+    @Override
+    public String toString(final Float instance) {
+        return Float.toString(instance);
+    }
+
+    @Override
+    public Float fromString(final String text) {
+        return Float.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/IntegerConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/IntegerConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/IntegerConverter.java
new file mode 100644
index 0000000..faaea1c
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/IntegerConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class IntegerConverter implements Converter<Integer> {
+    @Override
+    public String toString(final Integer instance) {
+        return Integer.toString(instance);
+    }
+
+    @Override
+    public Integer fromString(final String text) {
+        return Integer.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LongConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LongConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LongConverter.java
new file mode 100644
index 0000000..6a8037b
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/LongConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class LongConverter implements Converter<Long> {
+    @Override
+    public String toString(final Long instance) {
+        return Long.toString(instance);
+    }
+
+    @Override
+    public Long fromString(final String text) {
+        return Long.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ShortConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ShortConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ShortConverter.java
new file mode 100644
index 0000000..93bac0f
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ShortConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class ShortConverter implements Converter<Short> {
+    @Override
+    public String toString(final Short instance) {
+        return Short.toString(instance);
+    }
+
+    @Override
+    public Short fromString(final String text) {
+        return Short.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/StringConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/StringConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/StringConverter.java
new file mode 100644
index 0000000..2e78bcf
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/StringConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class StringConverter implements Converter<String> {
+    @Override
+    public String toString(final String instance) {
+        return instance;
+    }
+
+    @Override
+    public String fromString(final String text) {
+        return text;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..5baae6b
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/reflection/Mappings.java
@@ -0,0 +1,266 @@
+/*
+ * 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.reflection;
+
+import org.apache.johnzon.mapper.Converter;
+import org.apache.johnzon.mapper.JohnzonConverter;
+import org.apache.johnzon.mapper.JohnzonIgnore;
+import org.apache.johnzon.mapper.MapperException;
+
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public class Mappings {
+    public static class ClassMapping {
+        public final Class<?> clazz;
+        public final Map<String, Getter> getters;
+        public final Map<String, Setter> setters;
+
+        protected ClassMapping(final Class<?> clazz,
+                               final Map<String, Getter> getters, final Map<String, Setter> setters) {
+            this.clazz = clazz;
+            this.getters = getters;
+            this.setters = setters;
+        }
+    }
+
+    public static class CollectionMapping {
+        public final Class<?> raw;
+        public final Type arg;
+        public final boolean primitive;
+
+        public CollectionMapping(final boolean primitive, final Class<?> collectionType, final Type fieldArgType) {
+            this.raw = collectionType;
+            this.arg = fieldArgType;
+            this.primitive = primitive;
+        }
+    }
+
+    public static class Getter {
+        public final Method setter;
+        public final int version;
+        public final Converter<Object> converter;
+        public final boolean primitive;
+        public final boolean array;
+        public final boolean map;
+        public final boolean collection;
+
+        public Getter(final Method setter,
+                      final boolean primitive, final boolean array,
+                      final boolean collection, final boolean map,
+                      final Converter<Object> converter, final int version) {
+            this.setter = setter;
+            this.converter = converter;
+            this.version = version;
+            this.array = array;
+            this.map = map && converter == null;
+            this.collection = collection;
+            this.primitive = primitive;
+        }
+    }
+
+    public static class Setter {
+        public final Method setter;
+        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;
+            this.paramType = paramType;
+            this.converter = converter;
+            this.version = version;
+            this.primitive = primitive;
+        }
+    }
+
+    protected final ConcurrentMap<Type, ClassMapping> classes = new ConcurrentHashMap<Type, ClassMapping>();
+    protected final ConcurrentMap<Type, CollectionMapping> collections = new ConcurrentHashMap<Type, CollectionMapping>();
+    protected final Comparator<String> fieldOrdering;
+
+    public Mappings(final Comparator<String> attributeOrder) {
+        this.fieldOrdering = attributeOrder;
+    }
+
+    public <T> CollectionMapping findCollectionMapping(final ParameterizedType genericType, final Class<T> raw) {
+        CollectionMapping collectionMapping = collections.get(genericType);
+        if (collectionMapping == null) {
+            collectionMapping = createCollectionMapping(genericType, raw);
+            if (collectionMapping == null) {
+                return null;
+            }
+            final CollectionMapping existing = collections.putIfAbsent(genericType, collectionMapping);
+            if (existing != null) {
+                collectionMapping = existing;
+            }
+        }
+        return collectionMapping;
+    }
+
+    private <T> CollectionMapping createCollectionMapping(final ParameterizedType aType, final Class<T> raw) {
+        final Type[] fieldArgTypes = aType.getActualTypeArguments();
+        if (fieldArgTypes.length == 1) {
+            final Class<?> collectionType;
+            if (List.class.isAssignableFrom(raw)) {
+                collectionType = List.class;
+            }else if (SortedSet.class.isAssignableFrom(raw)) {
+                collectionType = SortedSet.class;
+            } else if (Set.class.isAssignableFrom(raw)) {
+                collectionType = Set.class;
+            } else if (Queue.class.isAssignableFrom(raw)) {
+                collectionType = Queue.class;
+            } else if (Collection.class.isAssignableFrom(raw)) {
+                collectionType = Collection.class;
+            } else {
+                return null;
+            }
+
+            final CollectionMapping mapping = new CollectionMapping(isPrimitive(fieldArgTypes[0]), collectionType, fieldArgTypes[0]);
+            collections.putIfAbsent(aType, mapping);
+            return mapping;
+        }
+        return null;
+    }
+
+    // has JSon API a method for this type
+    public static boolean isPrimitive(final Type type) {
+        if (type == String.class) {
+            return true;
+        } else if (type == char.class || type == Character.class) {
+            return true;
+        } else if (type == long.class || type == Long.class) {
+            return true;
+        } else if (type == int.class || type == Integer.class
+                || type == byte.class || type == Byte.class
+                || type == short.class || type == Short.class) {
+            return true;
+        } else if (type == double.class || type == Double.class
+                || type == float.class || type == Float.class) {
+            return true;
+        } else if (type == boolean.class || type == Boolean.class) {
+            return true;
+        } else if (type == BigDecimal.class) {
+            return true;
+        } else if (type == BigInteger.class) {
+            return true;
+        }
+        return false;
+    }
+
+    public ClassMapping getClassMapping(final Type clazz) {
+        return classes.get(clazz);
+    }
+
+    public ClassMapping findOrCreateClassMapping(final Type clazz) {
+        ClassMapping classMapping = classes.get(clazz);
+        if (classMapping == null) {
+            if (!Class.class.isInstance(clazz) || Map.class.isAssignableFrom(Class.class.cast(clazz))) {
+                return null;
+            }
+
+            classMapping = createClassMapping(Class.class.cast(clazz));
+            final ClassMapping existing = classes.putIfAbsent(clazz, classMapping);
+            if (existing != null) {
+                classMapping = existing;
+            }
+        }
+        return classMapping;
+    }
+
+    private ClassMapping createClassMapping(final Class<?> clazz) {
+        try {
+            final Map<String, Getter> getters = fieldOrdering != null ?
+                new TreeMap<String, Getter>(fieldOrdering) : new HashMap<String, Getter>();
+            final Map<String, Setter> setters = fieldOrdering != null ?
+                new TreeMap<String, Setter>(fieldOrdering) : new HashMap<String, Setter>();
+
+            final PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
+            for (final PropertyDescriptor descriptor : propertyDescriptors) {
+                final Method writeMethod = descriptor.getWriteMethod();
+                final JohnzonIgnore writeIgnore = writeMethod != null ? writeMethod.getAnnotation(JohnzonIgnore.class) : null;
+                if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class
+                        && (writeIgnore == null || writeIgnore.minVersion() >= 0)) {
+                    if (descriptor.getName().equals("metaClass")) {
+                        continue;
+                    }
+                    final Type param = writeMethod.getGenericParameterTypes()[0];
+                    setters.put(descriptor.getName(), new Setter(
+                            writeMethod,
+                            isPrimitive(param),
+                            param,
+                            findConverter(writeMethod),
+                            writeIgnore != null ? writeIgnore.minVersion() : -1));
+                }
+
+                final Method readMethod = descriptor.getReadMethod();
+                final JohnzonIgnore readIgnore = readMethod != null ? readMethod.getAnnotation(JohnzonIgnore.class) : null;
+                if (readMethod != null && readMethod.getDeclaringClass() != Object.class
+                        && (readIgnore == null || readIgnore.minVersion() >= 0)) {
+                    if (descriptor.getName().equals("metaClass")) {
+                        continue;
+                    }
+
+                    final Class<?> returnType = readMethod.getReturnType();
+                    getters.put(descriptor.getName(), new Getter(
+                            readMethod,
+                            isPrimitive(returnType),
+                            returnType.isArray(),
+                            Collection.class.isAssignableFrom(returnType),
+                            Map.class.isAssignableFrom(returnType),
+                            findConverter(readMethod),
+                            readIgnore != null ? readIgnore.minVersion() : -1));
+                }
+            }
+
+            return new ClassMapping(clazz, getters, setters);
+        } catch (final IntrospectionException e) {
+            throw new MapperException(e);
+        }
+    }
+
+    private static Converter findConverter(final Method method) {
+        Converter converter = null;
+        if (method.getAnnotation(JohnzonConverter.class) != null) {
+            try {
+                converter = method.getAnnotation(JohnzonConverter.class).value().newInstance();
+            } catch (final Exception e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+        return converter;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
new file mode 100644
index 0000000..4423559
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/LiteralTest.java
@@ -0,0 +1,253 @@
+/*
+ * 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 org.junit.Test;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Comparator;
+
+import static org.junit.Assert.assertEquals;
+
+public class LiteralTest {
+    @Test
+    public void writeReadNumbers() {
+        NumberClass nc = new NumberClass();
+        final StringWriter sw = new StringWriter();
+        nc.setBg(new BigDecimal("123.123"));
+        nc.setBi(new BigInteger("123"));
+        nc.setDoubleNumber(123.123);
+        nc.setBool(true);
+        nc.setByteNumber((byte) 1);
+        nc.setFloatNumber(123);
+        nc.setShortNumber((short) 1);
+        nc.setLongNumber(123L);
+        nc.setIntNumber(123);
+
+        final String expectedJson = "{\"shortNumber\":1,\"byteNumber\":1,\"intNumber\":123,\"floatNumber\":123.0,\"bg\":123.123,\"bool\":true,\"bi\":123,\"longNumber\":123,\"doubleNumber\":123.123}";
+        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().setAttributeOrder(attributeOrder).build().writeObject(nc, sw);
+        assertEquals(expectedJson, sw.toString());
+        final NumberClass read = new MapperBuilder().setAttributeOrder(attributeOrder).build()
+                    .readObject(new StringReader(sw.toString()), NumberClass.class);
+        assertEquals(nc, read);
+
+    }
+
+    @Test(expected = NumberFormatException.class)
+    public void writeReadNumbersInf() {
+        NumberClass nc = new NumberClass();
+        final StringWriter sw = new StringWriter();
+        nc.setBg(new BigDecimal("123.123"));
+        nc.setBi(new BigInteger("123"));
+        nc.setDoubleNumber(Double.POSITIVE_INFINITY);
+        nc.setBool(true);
+        nc.setByteNumber((byte) 1);
+        nc.setFloatNumber(123);
+        nc.setShortNumber((short) 1);
+        nc.setLongNumber(123L);
+        nc.setIntNumber(123);
+
+        new MapperBuilder().build().writeObject(nc, sw);
+
+    }
+
+    @Test(expected = NumberFormatException.class)
+    public void writeReadNumbersNaN() {
+        NumberClass nc = new NumberClass();
+        final StringWriter sw = new StringWriter();
+        nc.setBg(new BigDecimal("123.123"));
+        nc.setBi(new BigInteger("123"));
+        nc.setDoubleNumber(Double.NaN);
+        nc.setBool(true);
+        nc.setByteNumber((byte) 1);
+        nc.setFloatNumber(123);
+        nc.setShortNumber((short) 1);
+        nc.setLongNumber(123L);
+        nc.setIntNumber(123);
+
+        new MapperBuilder().build().writeObject(nc, sw);
+
+    }
+
+    public static class NumberClass {
+        private BigDecimal bg;
+        private BigInteger bi;
+        private int intNumber;
+        private long longNumber;
+        private byte byteNumber;
+        private short shortNumber;
+        private double doubleNumber;
+        private float floatNumber;
+        private boolean bool;
+
+        public BigDecimal getBg() {
+            return bg;
+        }
+
+        public void setBg(BigDecimal bg) {
+            this.bg = bg;
+        }
+
+        public BigInteger getBi() {
+            return bi;
+        }
+
+        public void setBi(BigInteger bi) {
+            this.bi = bi;
+        }
+
+        public int getIntNumber() {
+            return intNumber;
+        }
+
+        public void setIntNumber(int intNumber) {
+            this.intNumber = intNumber;
+        }
+
+        public long getLongNumber() {
+            return longNumber;
+        }
+
+        public void setLongNumber(long longNumber) {
+            this.longNumber = longNumber;
+        }
+
+        public byte getByteNumber() {
+            return byteNumber;
+        }
+
+        public void setByteNumber(byte byteNumber) {
+            this.byteNumber = byteNumber;
+        }
+
+        public short getShortNumber() {
+            return shortNumber;
+        }
+
+        public void setShortNumber(short shortNumber) {
+            this.shortNumber = shortNumber;
+        }
+
+        public double getDoubleNumber() {
+            return doubleNumber;
+        }
+
+        public void setDoubleNumber(double doubleNumber) {
+            this.doubleNumber = doubleNumber;
+        }
+
+        public float getFloatNumber() {
+            return floatNumber;
+        }
+
+        public void setFloatNumber(float floatNumber) {
+            this.floatNumber = floatNumber;
+        }
+
+        public boolean isBool() {
+            return bool;
+        }
+
+        public void setBool(boolean bool) {
+            this.bool = bool;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((bg == null) ? 0 : bg.hashCode());
+            result = prime * result + ((bi == null) ? 0 : bi.hashCode());
+            result = prime * result + (bool ? 1231 : 1237);
+            result = prime * result + byteNumber;
+            long temp;
+            temp = Double.doubleToLongBits(doubleNumber);
+            result = prime * result + (int) (temp ^ (temp >>> 32));
+            result = prime * result + Float.floatToIntBits(floatNumber);
+            result = prime * result + intNumber;
+            result = prime * result + (int) (longNumber ^ (longNumber >>> 32));
+            result = prime * result + shortNumber;
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            NumberClass other = (NumberClass) obj;
+            if (bg == null) {
+                if (other.bg != null) {
+                    return false;
+                }
+            } else if (!bg.equals(other.bg)) {
+                return false;
+            }
+            if (bi == null) {
+                if (other.bi != null) {
+                    return false;
+                }
+            } else if (!bi.equals(other.bi)) {
+                return false;
+            }
+            if (bool != other.bool) {
+                return false;
+            }
+            if (byteNumber != other.byteNumber) {
+                return false;
+            }
+            if (Double.doubleToLongBits(doubleNumber) != Double.doubleToLongBits(other.doubleNumber)) {
+                return false;
+            }
+            if (Float.floatToIntBits(floatNumber) != Float.floatToIntBits(other.floatNumber)) {
+                return false;
+            }
+            if (intNumber != other.intNumber) {
+                return false;
+            }
+            if (longNumber != other.longNumber) {
+                return false;
+            }
+            if (shortNumber != other.shortNumber) {
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "NumberClass [bg=" + bg + ", bi=" + bi + ", intNumber=" + intNumber + ", longNumber=" + longNumber + ", byteNumber=" + byteNumber + ", shortNumber=" + shortNumber + ", doubleNumber=" + doubleNumber + ", floatNumber=" + floatNumber + ", bool=" + bool + "]";
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperEnhancedTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperEnhancedTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperEnhancedTest.java
new file mode 100644
index 0000000..12401f0
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperEnhancedTest.java
@@ -0,0 +1,304 @@
+/*
+ * 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 org.junit.Assert;
+import org.junit.Test;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.ArrayBlockingQueue;
+
+import static org.junit.Assert.assertEquals;
+
+public class MapperEnhancedTest {
+
+    @Test
+    public void writeNull() {
+        final StringWriter sw = new StringWriter();
+        new MapperBuilder().build().writeObject(null, sw);
+        assertEquals("{}", sw.toString());
+    }
+    
+    @Test
+    public void writeReadChar() {
+        CharClass charClass = new CharClass();
+        charClass.setCharValue('G');
+        charClass.setCharArr(new char[]{'G','O'});
+        final StringWriter sw = new StringWriter();
+        
+        new MapperBuilder().build().writeObject(charClass, sw);
+        assertEquals("{\"charArr\":[\"G\",\"O\"],\"charValue\":\"G\"}", sw.toString());
+        CharClass  read = new MapperBuilder().build().readObject(new StringReader(sw.toString()), CharClass.class);
+        Assert.assertNotNull(read);
+        Assert.assertEquals('G', read.getCharValue());
+        Assert.assertTrue(Arrays.equals(new char[]{'G','O'}, read.getCharArr()));
+    }
+    
+    @Test
+    public void writeReadSortedMap() {
+        SomaClass soseClass = new SomaClass();
+        soseClass.getSoma().put("key1", "val1");
+        soseClass.getSoma().put("key2", "val2");
+        final StringWriter sw = new StringWriter();
+        
+        new MapperBuilder().build().writeObject(soseClass, sw);
+        assertEquals("{\"soma\":{\"key1\":\"val1\",\"key2\":\"val2\"}}", sw.toString());
+        new MapperBuilder().build().readObject(new StringReader(sw.toString()), SomaClass.class);
+        
+    }
+    
+    @Test
+    public void writeReadSortedSet() {
+        SoseClass soseClass = new SoseClass();
+        soseClass.getSose().add("string1");
+        soseClass.getSose().add("string2");
+        final StringWriter sw = new StringWriter();
+        
+        new MapperBuilder().build().writeObject(soseClass, sw);
+       
+        assertEquals("{\"sose\":[\"string1\",\"string2\"]}", sw.toString());
+        new MapperBuilder().build().readObject(new StringReader(sw.toString()), SoseClass.class);
+       
+    }
+    
+    @Test
+    public void writeReadQueue() {
+        QueueClass queueClass = new QueueClass();
+        queueClass.getQueue().add("string1");
+        queueClass.getQueue().add("string2");
+        final StringWriter sw = new StringWriter();
+        
+        new MapperBuilder().build().writeObject(queueClass, sw);
+       
+        assertEquals("{\"queue\":[\"string1\",\"string2\"]}", sw.toString());
+        new MapperBuilder().build().readObject(new StringReader(sw.toString()), QueueClass.class);
+       
+    }
+
+    @Test
+    public void writeTestclass() {
+        final StringWriter sw = new StringWriter();
+        final TestClass tc2 = buildTestClassInstance();
+
+        final String json = "{" +
+            "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
+            "\"dates\":[]," +
+
+            "\"inner\":{" +
+                "\"bd\":-456.4567890987654321," +
+                "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
+                "\"dates\":[]," +
+                "\"sose\":[\"string1\",\"string2\"]," +
+                "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
+            "}," +
+            "\"sose\":[]," +
+            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}";
+        new MapperBuilder().setAttributeOrder(new Comparator<String>() {
+            @Override
+            public int compare(String o1, String o2) {
+                return json.indexOf(o1) - json.indexOf(o2);
+            }
+        }).build().writeObject(tc2, sw);
+        assertEquals(json, sw.toString());
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void needConvertersForComplexTypes() {
+        final String str = "{" +
+            "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
+            "\"dates\":[]," +
+            "\"sose\":[]," +
+            "\"inner\":{" +
+            "\"bd\":-456.4567890987654321," +
+            "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
+            "\"dates\":[]," +
+            "\"sose\":[\"string1\",\"string2\"]," +
+            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
+            "}," +
+            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}";
+
+        new MapperBuilder().build().readObject(new StringReader(str), TestClass.class);
+    }
+
+    private TestClass buildTestClassInstance() {
+        final TestClass tc1 = new TestClass(null);
+        final Map<String, Integer> m = new TreeMap<String, Integer>();
+        m.put("key1", -100);
+        m.put("key2", +100);
+        final Map<String, Integer> m2 = new TreeMap<String, Integer>();
+        m.put("key11", -1002);
+        m.put("key22", +1002);
+        final List<Map<String, Integer>> l = new ArrayList<Map<String, Integer>>();
+        l.add(m);
+        l.add(m2);
+        tc1.sose.add("string1");
+        tc1.sose.add("string2");
+        tc1.map.put(l, 100L);
+
+        final TestClass tc2 = new TestClass(tc1);
+        final Map<String, Integer> m3 = new TreeMap<String, Integer>();
+        m3.put("key1", -100);
+        m3.put("key2", +100);
+        final Map<String, Integer> m4 = new TreeMap<String, Integer>();
+        m4.put("key11", -1002);
+        m4.put("key22", +1002);
+        final List<Map<String, Integer>> l1 = new ArrayList<Map<String, Integer>>();
+        l1.add(m);
+        l1.add(m2);
+        tc2.map.put(l1, 200L);
+        return tc2;
+    }
+
+    public static class QueueClass {
+        private Queue<String> queue = new ArrayBlockingQueue<String>(5);
+
+        public Queue<String> getQueue() {
+            return queue;
+        }
+
+        public void setQueue(Queue<String> queue) {
+            this.queue = queue;
+        }
+    }
+    
+    public static class SoseClass {
+        private SortedSet<String> sose = new TreeSet<String>();
+
+        public SortedSet<String> getSose() {
+            return sose;
+        }
+
+        public void setSose(SortedSet<String> sose) {
+            this.sose = sose;
+        }
+    }
+    
+    public static class SomaClass {
+        private SortedMap<String, String> soma = new TreeMap<String, String>();
+
+        public SortedMap<String, String> getSoma() {
+            return soma;
+        }
+
+        public void setSoma(SortedMap<String, String> soma) {
+            this.soma = soma;
+        }        
+    }
+    
+    public static class CharClass {
+        private char charValue;
+        private char charArr[];
+        
+        public char[] getCharArr() {
+            return charArr;
+        }
+
+        public void setCharArr(char[] charArr) {
+            this.charArr = charArr;
+        }
+
+        public char getCharValue() {
+            return charValue;
+        }
+
+        public void setCharValue(char charValue) {
+            this.charValue = charValue;
+        }           
+    }
+    
+    public static class TestClass {
+        private List<Map<String, Date>> dates = new ArrayList<Map<String, Date>>();
+        private Map<List<Map<String, Integer>>, Long> map = new HashMap<List<Map<String, Integer>>, Long>();
+        private TestClass inner;
+        private String string = "some \t \u0001 unicode: ÖÄÜ \u0070\u0070\u0070ন\udbff\udfff";
+        private BigDecimal bd = new BigDecimal("-456.4567890987654321");
+        private SortedSet<String> sose = new TreeSet<String>();
+
+        public SortedSet<String> getSose() {
+            return sose;
+        }
+
+        public void setSose(SortedSet<String> sose) {
+            this.sose = sose;
+        }
+
+        public TestClass(final TestClass inner) {
+            super();
+            this.inner = inner;
+        }
+
+        public TestClass() {
+            super();
+        }
+
+        public List<Map<String, Date>> getDates() {
+            return dates;
+        }
+
+        public void setDates(final List<Map<String, Date>> dates) {
+            this.dates = dates;
+        }
+
+        public Map<List<Map<String, Integer>>, Long> getMap() {
+            return map;
+        }
+
+        public void setMap(final Map<List<Map<String, Integer>>, Long> map) {
+            this.map = map;
+        }
+
+        public TestClass getInner() {
+            return inner;
+        }
+
+        public void setInner(final TestClass inner) {
+            this.inner = inner;
+        }
+
+        public String getString() {
+            return string;
+        }
+
+        public void setString(final String string) {
+            this.string = string;
+        }
+
+        public BigDecimal getBd() {
+            return bd;
+        }
+
+        public void setBd(final BigDecimal bd) {
+            this.bd = bd;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..fa58a1f
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
@@ -0,0 +1,505 @@
+/*
+ * 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 junit.framework.AssertionFailedError;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class MapperTest {
+    private static final String BIG_OBJECT_STR = "{" +
+            "\"name\":\"the string\"," +
+            "\"integer\":56," +
+            "\"longnumber\":118," +
+            "\"bool\":true," +
+            "\"nested\":{" +
+            "\"name\":\"another value\"," +
+            "\"integer\":97," +
+            "\"longnumber\":34" +
+            "}," +
+            "\"array\":[" +
+            "{" +
+            "\"name\":\"a1\"," +
+            "\"integer\":1," +
+            "\"longnumber\":2" +
+            "}," +
+            "{" +
+            "\"name\":\"a2\"," +
+            "\"integer\":3," +
+            "\"longnumber\":4" +
+            "}" +
+            "]," +
+            "\"list\":[" +
+            "{" +
+            "\"name\":\"a3\"," +
+            "\"integer\":5," +
+            "\"longnumber\":6" +
+            "}," +
+            "{" +
+            "\"name\":\"a4\"," +
+            "\"integer\":7," +
+            "\"longnumber\":8" +
+            "}" +
+            "]," +
+            "\"primitives\":[1,2,3,4,5]," +
+            "\"collectionWrapper\":[1,2,3,4,5]," +
+            "\"map\":{\"uno\":true,\"duos\":false}" +
+            "}";
+
+    @Test
+    public void writeEmptyObject() {
+        final StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeObject(null, writer);
+        assertEquals("{}", writer.toString());
+    }
+
+    @Test
+    public void readEmptyObject() {
+        final TheObject object = new MapperBuilder().build().readObject(new ByteArrayInputStream("{}".getBytes()), TheObject.class);
+        assertNotNull(object);
+        assertNull(object.name);
+    }
+
+    @Test
+    public void readEmptyArray() {
+        final TheObject[] object = new MapperBuilder().build().readArray(new ByteArrayInputStream("[]".getBytes()), TheObject.class);
+        assertNotNull(object);
+        assertEquals(0, object.length);
+    }
+
+    @Test
+    public void writeMap() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        new MapperBuilder().build().writeObject(new LinkedHashMap<String, Integer>() {{
+            put("a", 1);
+            put("b", 2);
+        }}, baos);
+        assertEquals("{\"a\":1,\"b\":2}", new String(baos.toByteArray()));
+    }
+
+    @Test
+    public void writeObject() {
+        final TheObject instance = new MapperBuilder().build()
+                .readObject(new ByteArrayInputStream(BIG_OBJECT_STR.getBytes()), TheObject.class); // suppose reader writes but this is tested
+        final StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeObject(instance, writer);
+        final String serialized = writer.toString();
+        assertTrue(serialized.contains("\"primitives\":[1,2,3,4,5]"));
+        assertTrue(serialized.contains("\"collectionWrapper\":[1,2,3,4,5]"));
+        assertTrue(serialized.contains("\"bool\":true"));
+        
+        //Assert fail with oracle java 1.7.0_45, works well with apple java 1.6.0_65 
+        //assertTrue(serialized.contains("\"map\":{\"uno\":true,\"duos\":false}"));
+        assertTrue(serialized.contains("\"map\":{"));
+        assertTrue(serialized.contains("\"uno\":true"));
+        assertTrue(serialized.contains("\"duos\":false"));
+        
+        TheObject instance2 = new MapperBuilder().build()
+                .readObject(new ByteArrayInputStream(serialized.getBytes()), TheObject.class); // suppose reader writes but this is tested
+      
+        assertEquals(instance, instance2);
+    }
+    
+    static class Bool{
+        boolean bool;
+
+        public boolean isBool() {
+            return bool;
+        }
+
+        public void setBool(boolean bool) {
+            this.bool = bool;
+        }
+        
+        
+    }
+    
+    static class Bool2{
+        Map<String, Boolean> map;
+
+        public Map<String, Boolean> getMap() {
+            return map;
+        }
+
+        public void setMap(Map<String, Boolean> map) {
+            this.map = map;
+        }
+
+        
+        
+        
+    }
+    
+    @Test
+    public void literal() {
+        
+        
+        
+        final Bool instance = new MapperBuilder().build()
+                .readObject(new ByteArrayInputStream("{\"bool\":true}".getBytes()), Bool.class);
+        
+        assertTrue(instance.bool);
+        
+        final StringWriter writer = new StringWriter();
+        new MapperBuilder().build().writeObject(instance, writer);
+        final String serialized = writer.toString();
+        assertEquals("{\"bool\":true}", serialized);
+        
+    }
+    
+    @Test(expected= MapperException.class)
+    public void literalFail() {
+         
+        final Bool instance = new MapperBuilder().build()
+                .readObject(new ByteArrayInputStream("{\"bool\":\"true\"}".getBytes()), Bool.class);
+        
+        assertTrue(instance.bool);
+        
+    }
+    
+    @Test(expected= MapperException.class)
+    public void literalFail2() {
+         
+        final Bool2 instance = new MapperBuilder().build()
+                .readObject(new ByteArrayInputStream("{\"map\":{\"key\":\"true\"}}".getBytes()), Bool2.class);
+       
+        
+        
+    }
+
+    @Test
+    public void writeArray() {
+        { // integer
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            new MapperBuilder().build().writeArray(new Integer[]{1, 2}, baos);
+            assertEquals("[1,2]", new String(baos.toByteArray()));
+        }
+        { // object
+            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()));
+            } 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()));
+            }
+        }
+    }
+
+    @Test
+    public void readObject() {
+        final TheObject object = new MapperBuilder().build().readObject(new ByteArrayInputStream(BIG_OBJECT_STR.getBytes()), TheObject.class);
+
+        assertNotNull(object);
+        assertEquals("the string", object.name);
+        assertEquals(56, object.integer);
+        assertEquals(118, object.longnumber);
+        assertTrue(object.bool);
+        assertEquals("another value", object.nested.name);
+        assertEquals(97, object.nested.integer);
+        assertEquals(34, object.nested.longnumber);
+        assertFalse(object.nested.bool);
+        assertNotNull(object.array);
+        assertEquals(2, object.array.length);
+        assertEquals("a1", object.array[0].name);
+        assertEquals(1, object.array[0].integer);
+        assertEquals(2, object.array[0].longnumber);
+        assertEquals("a2", object.array[1].name);
+        assertEquals(3, object.array[1].integer);
+        assertEquals(4, object.array[1].longnumber);
+        assertEquals("a3", object.list.get(0).name);
+        assertEquals(5, object.list.get(0).integer);
+        assertEquals(6, object.list.get(0).longnumber);
+        assertEquals("a4", object.list.get(1).name);
+        assertEquals(7, object.list.get(1).integer);
+        assertEquals(8, object.list.get(1).longnumber);
+        assertEquals(5, object.primitives.length);
+        for (int i = 0; i < object.primitives.length; i++) {
+            assertEquals(i + 1, object.primitives[i]);
+        }
+        assertNotNull(object.collectionWrapper);
+        assertEquals(5, object.collectionWrapper.size());
+        for (int i = 0; i < object.collectionWrapper.size(); i++) {
+            assertEquals(i + 1, object.collectionWrapper.get(i).intValue());
+        }
+        assertNotNull(object.map);
+        assertEquals(2, object.map.size());
+        assertTrue(object.map.containsKey("uno"));
+        assertTrue(object.map.containsKey("duos"));
+        assertTrue(object.map.get("uno"));
+        assertFalse(object.map.get("duos"));
+    }
+
+    @Test
+    public void readArray() {
+        final TheObject[] object = new MapperBuilder().build().readArray(new ByteArrayInputStream(("[" +
+                "{" +
+                "\"name\":\"a3\"," +
+                "\"integer\":5," +
+                "\"longnumber\":6" +
+                "}," +
+                "{" +
+                "\"name\":\"a4\"," +
+                "\"integer\":7," +
+                "\"longnumber\":8" +
+                "}" +
+                "]").getBytes()), TheObject.class);
+        assertNotNull(object);
+        assertEquals(2, object.length);
+        assertEquals("a3", object[0].name);
+        assertEquals(5, object[0].integer);
+        assertEquals(6, object[0].longnumber);
+        assertEquals("a4", object[1].name);
+        assertEquals(7, object[1].integer);
+        assertEquals(8, object[1].longnumber);
+    }
+
+    @Test
+    public void converters() {
+        final String json = "{\"s\":\"noznhoj\"}";
+        final Converted v = new MapperBuilder().build().readObject(new ByteArrayInputStream(json.getBytes()), Converted.class);
+        assertEquals("johnzon", v.getS());
+        final StringWriter stream = new StringWriter();
+        new MapperBuilder().build().writeObject(v, stream);
+        assertEquals(json, stream.toString());
+    }
+
+    public static class TheObject {
+        private String name;
+        private int integer;
+        private long longnumber;
+        private boolean bool;
+        private TheObject nested;
+        private TheObject[] array;
+        private List<TheObject> list;
+        private int[] primitives;
+        private List<Integer> collectionWrapper;
+        private Map<String, Boolean> map;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(final String name) {
+            this.name = name;
+        }
+
+        public int getInteger() {
+            return integer;
+        }
+
+        public void setInteger(final int integer) {
+            this.integer = integer;
+        }
+
+        public long getLongnumber() {
+            return longnumber;
+        }
+
+        public void setLongnumber(final long longnumber) {
+            this.longnumber = longnumber;
+        }
+
+        public boolean isBool() {
+            return bool;
+        }
+
+        public void setBool(final boolean bool) {
+            this.bool = bool;
+        }
+
+        public TheObject getNested() {
+            return nested;
+        }
+
+        public void setNested(final TheObject nested) {
+            this.nested = nested;
+        }
+
+        public TheObject[] getArray() {
+            return array;
+        }
+
+        public void setArray(final TheObject[] array) {
+            this.array = array;
+        }
+
+        public List<TheObject> getList() {
+            return list;
+        }
+
+        public void setList(final List<TheObject> list) {
+            this.list = list;
+        }
+
+        public int[] getPrimitives() {
+            return primitives;
+        }
+
+        public void setPrimitives(final int[] primitives) {
+            this.primitives = primitives;
+        }
+
+        public List<Integer> getCollectionWrapper() {
+            return collectionWrapper;
+        }
+
+        public void setCollectionWrapper(final List<Integer> collectionWrapper) {
+            this.collectionWrapper = collectionWrapper;
+        }
+
+        public Map<String, Boolean> getMap() {
+            return map;
+        }
+
+        public void setMap(final Map<String, Boolean> map) {
+            this.map = map;
+        }
+
+        @Override
+        public String toString() {
+            return "TheObject [name=" + name + ", integer=" + integer + ", longnumber=" + longnumber + ", bool=" + bool + ", nested="
+                    + nested + ", array=" + Arrays.toString(array) + ", list=" + list + ", primitives=" + Arrays.toString(primitives)
+                    + ", collectionWrapper=" + collectionWrapper + ", map=" + map + "]";
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + Arrays.hashCode(array);
+            result = prime * result + (bool ? 1231 : 1237);
+            result = prime * result + ((collectionWrapper == null) ? 0 : collectionWrapper.hashCode());
+            result = prime * result + integer;
+            result = prime * result + ((list == null) ? 0 : list.hashCode());
+            result = prime * result + (int) (longnumber ^ (longnumber >>> 32));
+            result = prime * result + ((map == null) ? 0 : map.hashCode());
+            result = prime * result + ((name == null) ? 0 : name.hashCode());
+            result = prime * result + ((nested == null) ? 0 : nested.hashCode());
+            result = prime * result + Arrays.hashCode(primitives);
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            TheObject other = (TheObject) obj;
+            if (!Arrays.equals(array, other.array))
+                return false;
+            if (bool != other.bool)
+                return false;
+            if (collectionWrapper == null) {
+                if (other.collectionWrapper != null)
+                    return false;
+            } else if (!collectionWrapper.equals(other.collectionWrapper))
+                return false;
+            if (integer != other.integer)
+                return false;
+            if (list == null) {
+                if (other.list != null)
+                    return false;
+            } else if (!list.equals(other.list))
+                return false;
+            if (longnumber != other.longnumber)
+                return false;
+            if (map == null) {
+                if (other.map != null)
+                    return false;
+            } else if (!map.equals(other.map))
+                return false;
+            if (name == null) {
+                if (other.name != null)
+                    return false;
+            } else if (!name.equals(other.name))
+                return false;
+            if (nested == null) {
+                if (other.nested != null)
+                    return false;
+            } else if (!nested.equals(other.nested))
+                return false;
+            if (!Arrays.equals(primitives, other.primitives))
+                return false;
+            return true;
+        }
+        
+        
+    }
+
+    public static class Pair {
+        private final int i;
+        private final String s;
+
+        public Pair(final int i, final String s) {
+            this.i = i;
+            this.s = s;
+        }
+
+        public int getI() {
+            return i;
+        }
+
+        public String getS() {
+            return s;
+        }
+    }
+
+    public static class Converted {
+        private String s;
+
+        @JohnzonConverter(ReverseConverter.class)
+        public String getS() {
+            return s;
+        }
+
+        @JohnzonConverter(ReverseConverter.class)
+        public void setS(String v) {
+            s = v;
+        }
+    }
+
+    public static class ReverseConverter implements Converter<String> {
+        @Override
+        public String toString(final String instance) {
+            return new StringBuilder(instance).reverse().toString();
+        }
+
+        @Override
+        public String fromString(final String text) {
+            return toString(text);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperVersionTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperVersionTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperVersionTest.java
new file mode 100644
index 0000000..aab6355
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperVersionTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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 org.junit.Test;
+
+import java.io.StringWriter;
+
+import static org.junit.Assert.assertEquals;
+
+public class MapperVersionTest {
+    @Test
+    public void version() {
+        { // no version
+            final Mapper mapper = new MapperBuilder().build();
+            final Versioned versioned = new Versioned();
+            versioned.name = "foo";
+            final StringWriter writer = new StringWriter();
+            mapper.writeObject(versioned, writer);
+            assertEquals("{\"name\":\"foo\"}", writer.toString());
+        }
+        { // version ko
+            for (int i = 0; i < 2; i++) {
+                final Mapper mapper = new MapperBuilder().setVersion(i).build();
+                final Versioned versioned = new Versioned();
+                versioned.name = "foo";
+                final StringWriter writer = new StringWriter();
+                mapper.writeObject(versioned, writer);
+                assertEquals("{\"name\":\"foo\"}", writer.toString());
+            }
+        }
+        { // version ok
+            for (int i = 2; i < 4; i++) {
+                final Mapper mapper = new MapperBuilder().setVersion(i).build();
+                final Versioned versioned = new Versioned();
+                versioned.name = "foo";
+                final StringWriter writer = new StringWriter();
+                mapper.writeObject(versioned, writer);
+                assertEquals("{}", writer.toString());
+            }
+        }
+    }
+
+    public static class Versioned {
+        private String name;
+
+        @JohnzonIgnore(minVersion =  2)
+        public String getName() {
+            return name;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/converter/EnumConverterTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/converter/EnumConverterTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/converter/EnumConverterTest.java
new file mode 100644
index 0000000..64a4633
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/converter/EnumConverterTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.converter;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class EnumConverterTest {
+    @Test
+    public void fromEnumToString() {
+        assertEquals("B", new EnumConverter<AnEnum>(AnEnum.class).toString(AnEnum.B));
+    }
+
+    @Test
+    public void fromStringToEnum() {
+        assertEquals(AnEnum.B, new EnumConverter<AnEnum>(AnEnum.class).fromString("B"));
+    }
+
+    public enum AnEnum {
+        A, B
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 61e531b..b19b0e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,19 +31,19 @@
     <version>14</version>
   </parent>
 
-  <groupId>org.apache.fleece</groupId>
-  <artifactId>fleece</artifactId>
+  <groupId>org.apache.johnzon</groupId>
+  <artifactId>johnzon</artifactId>
   <packaging>pom</packaging>
   <version>1.0-SNAPSHOT</version>
-  <name>Fleece</name>
-  <description>Apache Fleece is an implementation of JSR-353 (JavaTM API for JSON Processing).</description>
+  <name>Johnzon</name>
+  <description>Apache Johnzon is an implementation of JSR-353 (JavaTM API for JSON Processing).</description>
   <inceptionYear>2014</inceptionYear>
-  <url>http://incubator.apache.org/projects/fleece.html</url>
+  <url>http://incubator.apache.org/projects/johnzon.html</url>
 
   <modules>
-    <module>fleece-core</module>
-    <module>fleece-mapper</module>
-    <module>fleece-jaxrs</module>
+    <module>johnzon-core</module>
+    <module>johnzon-mapper</module>
+    <module>johnzon-jaxrs</module>
   </modules>
 
   <dependencies>
@@ -245,7 +245,7 @@
 
   <issueManagement>
     <system>jira</system>
-    <url>https://issues.apache.org/jira/browse/FLEECE</url>
+    <url>https://issues.apache.org/jira/browse/JOHNZON</url>
   </issueManagement>
 
   <distributionManagement>
@@ -257,8 +257,8 @@
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <fleece.site.url>https://svn.apache.org/repos/asf/incubator/fleece/site/publish/</fleece.site.url>
-    <pubsub.url>scm:svn:${fleece.site.url}</pubsub.url>
+    <johnzon.site.url>https://svn.apache.org/repos/asf/incubator/johnzon/site/publish/</johnzon.site.url>
+    <pubsub.url>scm:svn:${johnzon.site.url}</pubsub.url>
     <staging.directory>${project.build.directory}/site</staging.directory>
   </properties>
 
@@ -323,18 +323,18 @@
 
   <mailingLists>
     <mailingList>
-      <name>Fleece Commits List</name>
-      <subscribe>commits-subscribe@fleece.incubator.apache.org</subscribe>
-      <unsubscribe>commits-unsubscribe@fleece.incubator.apache.org</unsubscribe>
-      <post>commits@fleece.incubator.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/incubator-fleece-commits/</archive>
+      <name>Johnzon Commits List</name>
+      <subscribe>commits-subscribe@johnzon.incubator.apache.org</subscribe>
+      <unsubscribe>commits-unsubscribe@johnzon.incubator.apache.org</unsubscribe>
+      <post>commits@johnzon.incubator.apache.org</post>
+      <archive>http://mail-archives.apache.org/mod_mbox/incubator-johnzon-commits/</archive>
     </mailingList>
     <mailingList>
-      <name>Fleece Developer List</name>
-      <subscribe>dev-subscribe@fleece.incubator.apache.org</subscribe>
-      <unsubscribe>dev-unsubscribe@fleece.incubator.apache.org</unsubscribe>
-      <post>dev@fleece.incubator.apache.org</post>
-      <archive>http://mail-archives.apache.org/mod_mbox/incubator-fleece-dev/</archive>
+      <name>Johnzon Developer List</name>
+      <subscribe>dev-subscribe@johnzon.incubator.apache.org</subscribe>
+      <unsubscribe>dev-unsubscribe@johnzon.incubator.apache.org</unsubscribe>
+      <post>dev@johnzon.incubator.apache.org</post>
+      <archive>http://mail-archives.apache.org/mod_mbox/incubator-johnzon-dev/</archive>
     </mailingList>
   </mailingLists>
 

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/src/site/markdown/index.md
----------------------------------------------------------------------
diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md
index cb8090e..978a077 100644
--- a/src/site/markdown/index.md
+++ b/src/site/markdown/index.md
@@ -16,22 +16,22 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
-# Apache fleece
+# Apache johnzon
 
-Apache Fleece is a project providing an implementation of JsonProcessing (aka jsr-353) and a set of useful extension
+Apache Johnzon is a project providing an implementation of JsonProcessing (aka jsr-353) and a set of useful extension
 for this specification like an Object mapper and some JAX-RS providers.
 
 ## Get started
 
-Fleece comes with three main modules.
+Johnzon comes with three main modules.
 
 ### Core
 
 <pre class="prettyprint linenums"><![CDATA[
 <dependency>
-  <groupId>org.apache.fleece</groupId>
-  <artifactId>fleece-core</artifactId>
-  <version>${fleece.version}</version>
+  <groupId>org.apache.johnzon</groupId>
+  <artifactId>johnzon-core</artifactId>
+  <version>${johnzon.version}</version>
 </dependency>
 ]]></pre>
 
@@ -50,9 +50,9 @@ This is the implementation of the specification. You'll surely want to add the A
 
 <pre class="prettyprint linenums"><![CDATA[
 <dependency>
-  <groupId>org.apache.fleece</groupId>
-  <artifactId>fleece-mapper</artifactId>
-  <version>${fleece.version}</version>
+  <groupId>org.apache.johnzon</groupId>
+  <artifactId>johnzon-mapper</artifactId>
+  <version>${johnzon.version}</version>
 </dependency>
 ]]></pre>
 
@@ -72,14 +72,14 @@ final MySuperObject otherObject = mapper.readObject(inputStream, MySuperObject.c
 
 <pre class="prettyprint linenums"><![CDATA[
 <dependency>
-  <groupId>org.apache.fleece</groupId>
-  <artifactId>fleece-jaxrs</artifactId>
-  <version>${fleece.version}</version>
+  <groupId>org.apache.johnzon</groupId>
+  <artifactId>johnzon-jaxrs</artifactId>
+  <version>${johnzon.version}</version>
 </dependency>
 ]]></pre>
 
 JAX-RS module provides two providers (and underlying MessageBodyReaders and MessageBodyWriters):
 
-* org.apache.fleece.jaxrs.FleeceProvider.FleeceProvider: use Fleece Mapper to map Object to Json and the opposite
-* org.apache.fleece.jaxrs.JsrProvider: allows you to use JsrArray, JsrObject (more generally JsonStructure)
+* org.apache.johnzon.jaxrs.JohnzonProvider.JohnzonProvider: use Johnzon Mapper to map Object to Json and the opposite
+* org.apache.johnzon.jaxrs.JsrProvider: allows you to use JsrArray, JsrObject (more generally JsonStructure)
 

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/src/site/site.xml
----------------------------------------------------------------------
diff --git a/src/site/site.xml b/src/site/site.xml
index 75cfd61..9adf8e6 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -15,14 +15,14 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<project name="Apache Fleece"
+<project name="Apache Johnzon"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://maven.apache.org/DECORATION/1.0.1"
          xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.1
                              http://maven.apache.org/xsd/decoration-1.0.1.xsd">
   <bannerLeft>
-    <name>Apache Fleece</name>
-    <alt>Apache Fleece logo</alt>
+    <name>Apache Johnzon</name>
+    <alt>Apache Johnzon logo</alt>
     <href>/index.html</href>
   </bannerLeft>
   <bannerRight>
@@ -36,7 +36,7 @@
       <sideBarEnabled>true</sideBarEnabled>
       <sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
       <ohloh>
-        <projectId>apache-fleece</projectId>
+        <projectId>apache-johnzon</projectId>
         <widget>stats</widget>
       </ohloh>
     </fluidoSkin>
@@ -80,7 +80,7 @@
     </menu>
 
     <footer>
-      <div class="row span16"><div>Apache Fleece, Apache, the Apache feather logo, and the Apache Fleece project logos are trademarks of The Apache Software Foundation.
+      <div class="row span16"><div>Apache Johnzon, Apache, the Apache feather logo, and the Apache Johnzon project logos are trademarks of The Apache Software Foundation.
         All other marks mentioned may be trademarks or registered trademarks of their respective owners.</div>
         <a href="${project.url}/privacy-policy.html">Privacy Policy</a>
       </div>


[09/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..86d7708
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderImpl.java
@@ -0,0 +1,208 @@
+/*
+ * 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.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonReader;
+import javax.json.JsonStructure;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParsingException;
+
+class JsonReaderImpl implements JsonReader {
+    private final JsonParser parser;
+    private boolean closed = false;
+
+    JsonReaderImpl(final JsonParser parser) {
+        this.parser = parser;
+    }
+
+    @Override
+    public JsonStructure read() {
+
+        checkClosed();
+
+        if (!parser.hasNext()) {
+            throw new IllegalStateException("Nothing to read");
+        }
+        switch (parser.next()) {
+            case START_OBJECT:
+                final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl();
+                parseObject(objectBuilder);
+                if (parser.hasNext()) {
+                    throw new JsonParsingException("Expected end of file", parser.getLocation());
+                }
+                close();
+                return objectBuilder.build();
+            case START_ARRAY:
+                final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl();
+                parseArray(arrayBuilder);
+                if (parser.hasNext()) {
+                    throw new JsonParsingException("Expected end of file", parser.getLocation());
+                }
+                close();
+                return arrayBuilder.build();
+            default:
+                close();
+                throw new JsonParsingException("Unknown structure: " + parser.next(), parser.getLocation());
+        }
+
+    }
+
+    @Override
+    public JsonObject readObject() {
+        return JsonObject.class.cast(read());
+    }
+
+    @Override
+    public JsonArray readArray() {
+        return JsonArray.class.cast(read());
+    }
+
+    @Override
+    public void close() {
+
+        if (!closed) {
+            closed = true;
+            parser.close();
+        }
+
+    }
+
+    private void parseObject(final JsonObjectBuilder builder) {
+        String key = null;
+        while (parser.hasNext()) {
+            final JsonParser.Event next = parser.next();
+            switch (next) {
+                case KEY_NAME:
+                    key = parser.getString();
+                    break;
+
+                case VALUE_STRING:
+                    builder.add(key, new JsonStringImpl(parser.getString()));
+                    break;
+
+                case START_OBJECT:
+                    JsonObjectBuilder subObject = null;
+                    parseObject(subObject = new JsonObjectBuilderImpl());
+                    builder.add(key, subObject);
+                    break;
+
+                case START_ARRAY:
+                    JsonArrayBuilder subArray = null;
+                    parseArray(subArray = new JsonArrayBuilderImpl());
+                    builder.add(key, subArray);
+                    break;
+
+                case VALUE_NUMBER:
+                    if (parser.isIntegralNumber()) {
+                        builder.add(key, new JsonLongImpl(parser.getLong()));
+                    } else {
+                        builder.add(key, new JsonNumberImpl(parser.getBigDecimal()));
+                    }
+                    break;
+
+                case VALUE_NULL:
+                    builder.addNull(key);
+                    break;
+
+                case VALUE_TRUE:
+                    builder.add(key, true);
+                    break;
+
+                case VALUE_FALSE:
+                    builder.add(key, false);
+                    break;
+
+                case END_OBJECT:
+                    return;
+
+                case END_ARRAY:
+                    throw new JsonParsingException("']', shouldn't occur", parser.getLocation());
+
+                default:
+                    throw new JsonParsingException(next.name() + ", shouldn't occur", parser.getLocation());
+            }
+        }
+    }
+
+    private void parseArray(final JsonArrayBuilder builder) {
+        while (parser.hasNext()) {
+            final JsonParser.Event next = parser.next();
+            switch (next) {
+                case VALUE_STRING:
+                    builder.add(new JsonStringImpl(parser.getString()));
+                    break;
+
+                case VALUE_NUMBER:
+                    if (parser.isIntegralNumber()) {
+                        builder.add(new JsonLongImpl(parser.getLong()));
+                    } else {
+                        builder.add(new JsonNumberImpl(parser.getBigDecimal()));
+                    }
+                    break;
+
+                case START_OBJECT:
+                    JsonObjectBuilder subObject = null;
+                    parseObject(subObject = new JsonObjectBuilderImpl());
+                    builder.add(subObject);
+                    break;
+
+                case START_ARRAY:
+                    JsonArrayBuilder subArray = null;
+                    parseArray(subArray = new JsonArrayBuilderImpl());
+                    builder.add(subArray);
+                    break;
+
+                case END_ARRAY:
+                    return;
+
+                case VALUE_NULL:
+                    builder.addNull();
+                    break;
+
+                case VALUE_TRUE:
+                    builder.add(true);
+                    break;
+
+                case VALUE_FALSE:
+                    builder.add(false);
+                    break;
+
+                case KEY_NAME:
+                    throw new JsonParsingException("array doesn't have keys", parser.getLocation());
+
+                case END_OBJECT:
+                    throw new JsonParsingException("'}', shouldn't occur", parser.getLocation());
+
+                default:
+                    throw new JsonParsingException(next.name() + ", shouldn't occur", parser.getLocation());
+            }
+        }
+    }
+
+    private void checkClosed() {
+        if (closed) {
+            throw new IllegalStateException("read(), readObject(), readArray() or close() method was already called");
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
new file mode 100644
index 0000000..931f55f
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java
@@ -0,0 +1,964 @@
+/*
+ * 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 java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.util.NoSuchElementException;
+
+import javax.json.JsonException;
+import javax.json.stream.JsonLocation;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParsingException;
+
+//This class represents either the Json tokenizer and the Json parser.
+public class JsonStreamParserImpl implements JsonChars, JsonParser{
+
+    //the main buffer where the stream will be buffered
+    private final char[] buffer;
+
+    //current parser position within the buffer
+    //Initial MIN_VALUE will trigger buffer refill, normally bufferPos is >= -1
+    //-1 would cause a re-read of the first character in the buffer (which is at zero index)
+    private int bufferPos = Integer.MIN_VALUE;
+
+    //available character in the buffer
+    //normally this is buffer.length, except for the last buffer page it might be <= buffer.length
+    private int availableCharsInBuffer;
+
+    //start and end position of values in the buffer
+    //may cross boundaries, then value is in fallBackCopyBuffer
+    private int startOfValueInBuffer = -1;
+    private int endOfValueInBuffer = -1;
+
+    private final Reader in;
+
+    //do we read from a character stream or a byte stream
+    //not used at the moment but maybe relevant in future to calculate the JsonLocation offset
+    @SuppressWarnings("unused")
+    private final boolean readBytes;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
+    private final BufferStrategy.BufferProvider<char[]> valueProvider;
+
+    //max length for strings and numbers (max count of characters)
+    private final int maxValueLength;
+
+    //we use a byte here, because comparing bytes
+    //is more efficient than comparing enums
+    //Additionally we handle internally two more event: COMMA_EVENT and KEY_SEPARATOR_EVENT
+    private byte previousEvent;
+
+    //this buffer is used to store current String or Number value in case that
+    //within the value a buffer boundary is crossed or the string contains escaped characters
+    private final char[] fallBackCopyBuffer;
+    private int fallBackCopyBufferLength;
+
+    // location (line, column, offset)
+    // We try to calculate this efficiently so we do not just increment the values per char read
+    // Instead we calculate the column and offset relative to the pastBufferReadCount and/or lastLineBreakPosition.
+    private long currentLine = 1;
+    private long lastLineBreakPosition;
+    private long pastBufferReadCount;
+
+    //cache (if current value is a number) integral state and the number itself if its only one digit    
+    private boolean isCurrentNumberIntegral = true;
+    private Integer currentIntegralNumber; //for number from 0 - 9
+
+    //maybe we want also cache BigDecimals
+    //private BigDecimal currentBigDecimalNumber = null;
+
+    //We need a stack if we want detect bad formatted Json do determine if we are within an array or not
+    //example
+    //     Streamparser sees: ],1  <-- we look from here
+    //the 1 is only allowed if we are within an array
+    //This can only be determined by build up a stack which tracks the trail of Json objects and arrays
+    //This stack here is only needed for validating the above mentioned case, if we want to be lenient we can skip suing the stack.
+    //Stack can cause out of memory issues when the nesting depth of a Json stream is too deep.
+    private StructureElement currentStructureElement = null;
+
+    //minimal stack implementation
+    private static final class StructureElement {
+        final StructureElement previous;
+        final boolean isArray;
+
+        StructureElement(final StructureElement previous, final boolean isArray) {
+            super();
+            this.previous = previous;
+            this.isArray = isArray;
+        }
+    }
+
+    //detect charset according to RFC 4627
+    public JsonStreamParserImpl(final InputStream inputStream, final int maxStringLength,
+            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
+
+        this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer);
+    }
+
+    //use charset provided
+    public JsonStreamParserImpl(final InputStream inputStream, final Charset encoding, final int maxStringLength,
+            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
+
+        this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer);
+    }
+
+    public JsonStreamParserImpl(final Reader reader, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final BufferStrategy.BufferProvider<char[]> valueBuffer) {
+
+        this(null, reader, null, maxStringLength, bufferProvider, valueBuffer);
+    }
+
+    private JsonStreamParserImpl(final InputStream inputStream, final Reader reader, final Charset encoding, final int maxStringLength,
+            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
+
+        this.maxValueLength = maxStringLength <= 0 ? 8192 : maxStringLength;
+        this.fallBackCopyBuffer = valueBuffer.newBuffer();
+        this.buffer = bufferProvider.newBuffer();
+        this.bufferProvider = bufferProvider;
+        this.valueProvider = valueBuffer;
+
+        if (fallBackCopyBuffer.length < maxStringLength) {
+            throw cust("Size of value buffer cannot be smaller than maximum string length");
+        }
+
+        if (reader != null) {
+            this.in = reader;
+            readBytes = false;
+        } else if (encoding == null) {
+            this.in = new RFC4627AwareInputStreamReader(inputStream);
+            readBytes = true;
+
+        } else {
+            this.in = new InputStreamReader(inputStream, encoding.newDecoder());
+            readBytes = true;
+        }
+
+    }
+
+    //append a single char to the value buffer
+    private void appendToCopyBuffer(final char c) {
+        fallBackCopyBuffer[fallBackCopyBufferLength] = c;
+        fallBackCopyBufferLength++;
+    }
+
+    //copy content between "start" and "end" from buffer to value buffer 
+    private void copyCurrentValue() {
+
+        if ((endOfValueInBuffer - startOfValueInBuffer) > 0) {
+
+            if ((endOfValueInBuffer - startOfValueInBuffer) > maxValueLength) {
+                throw tmc();
+            }
+
+            System.arraycopy(buffer, startOfValueInBuffer, fallBackCopyBuffer, fallBackCopyBufferLength,
+                    (endOfValueInBuffer - startOfValueInBuffer));
+            fallBackCopyBufferLength += (endOfValueInBuffer - startOfValueInBuffer);
+
+        }
+
+        startOfValueInBuffer = endOfValueInBuffer = -1;
+    }
+
+    @Override
+    public final boolean hasNext() {
+
+        if (currentStructureElement != null || (previousEvent != END_ARRAY && previousEvent != END_OBJECT) || previousEvent == 0) {
+            return true;
+        }
+
+        //detect garbage at the end of the file after last object or array is closed
+        if (bufferPos < availableCharsInBuffer - 2) {
+
+            final char c = readNextNonWhitespaceChar();
+
+            if (c == EOF) {
+                return false;
+            }
+
+            if (bufferPos < availableCharsInBuffer) {
+                throw uexc("EOF expected");
+            }
+
+        }
+
+        return false;
+
+    }
+
+    private static boolean isAsciiDigit(final char value) {
+        return value <= NINE && value >= ZERO;
+    }
+
+    //check if value is a valid hex digit and return the numeric value
+    private int parseHexDigit(final char value) {
+
+        if (isAsciiDigit(value)) {
+            return value - 48;
+        } else if (value <= 'f' && value >= 'a') {
+            return (value) - 87;
+        } else if ((value <= 'F' && value >= 'A')) {
+            return (value) - 55;
+        } else {
+            throw uexc("Invalid hex character");
+        }
+    }
+
+    private JsonLocation createLocation() {
+
+        //we start with column = 1, so column is always >= 1
+        //APi is not clear in this, but starting column with 1 is convenient
+        long column = 1;
+        long charOffset = 0;
+
+        if (bufferPos >= -1) {
+
+            charOffset = pastBufferReadCount + bufferPos + 1;
+            column = lastLineBreakPosition == 0 ? charOffset + 1 : charOffset - lastLineBreakPosition;
+        }
+
+        //For now its unclear how to calculate offset for (byte) inputsream.
+        //API says count bytes but thats dependent on encoding and not efficient
+        //skip this for now, count always bytes and defer this until the JSR TCK arrives.
+
+        return new JsonLocationImpl(currentLine, column, charOffset);
+    }
+
+    //read the next char from the stream and set/increment the bufferPos
+    //will also refill buffer if neccessary
+    //if we are currently processing a value (string or number) and buffer 
+    //refill is neccessary copy the already readed value part into the value buffer
+    private char readNextChar() {
+
+        if ((buffer.length - bufferPos) <= 1) {
+            //fillbuffer
+
+            //copy content from old buffer to valuebuffer
+            //correct start end mark
+            if (startOfValueInBuffer > -1 && endOfValueInBuffer == -1) {
+                endOfValueInBuffer = availableCharsInBuffer;
+                copyCurrentValue();
+
+                startOfValueInBuffer = 0;
+            }
+
+            if (bufferPos >= -1) {
+                pastBufferReadCount += availableCharsInBuffer;
+            }
+
+            try {
+                availableCharsInBuffer = in.read(buffer, 0, buffer.length);
+                if (availableCharsInBuffer <= 0) {
+                    return EOF;
+                }
+
+            } catch (final IOException e) {
+                close();
+                throw uexio(e);
+            }
+
+            bufferPos = 0;
+            //end fillbuffer
+        } else {
+            bufferPos++;
+        }
+
+        return buffer[bufferPos];
+    }
+
+    //skip whitespaces
+    //tracks location informations (line, column)
+    //returns the first non whitespace character
+    private char readNextNonWhitespaceChar() {
+
+        int dosCount = 0;
+        char c = readNextChar();
+
+        while (c == SPACE || c == TAB || c == CR || c == EOL) {
+
+            if (c == EOL) {
+                currentLine++;
+                lastLineBreakPosition = pastBufferReadCount + bufferPos;
+            }
+
+            //prevent DOS (denial of service) attack
+            if (dosCount >= maxValueLength) {
+                throw tmc();
+            }
+            dosCount++;
+
+            //read next character
+            c = readNextChar();
+
+        }
+
+        return c;
+    }
+
+    @Override
+    public final Event next() {
+        //main entry, make decision how to handle the current character in the stream
+
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+
+        if (previousEvent != 0 && currentStructureElement == null) {
+            throw uexc("Unexpected end of structure");
+        }
+
+        final char c = readNextNonWhitespaceChar();
+
+        if (c == COMMA_CHAR) {
+
+            //last event must one of the following-> " ] } LITERAL
+            if (previousEvent == START_ARRAY || previousEvent == START_OBJECT || previousEvent == COMMA_EVENT || previousEvent == KEY_NAME) {
+                throw uexc("Expected \" ] } LITERAL");
+            }
+
+            previousEvent = COMMA_EVENT;
+            return next();
+
+        }
+
+        if (c == KEY_SEPARATOR) {
+
+            if (previousEvent != KEY_NAME) {
+                throw uexc("A : can only follow a key name");
+            }
+
+            previousEvent = KEY_SEPARATOR_EVENT;
+            return next();
+
+        }
+
+        if (!isCurrentNumberIntegral) {
+            isCurrentNumberIntegral = true;
+        }
+        //        if (currentBigDecimalNumber != null) {
+        //            currentBigDecimalNumber = null;
+        //        }
+        if (currentIntegralNumber != null) {
+            currentIntegralNumber = null;
+        }
+
+        if (fallBackCopyBufferLength != 0) {
+            fallBackCopyBufferLength = 0;
+        }
+
+        startOfValueInBuffer = endOfValueInBuffer = -1;
+
+        switch (c) {
+
+            case START_OBJECT_CHAR:
+
+                return handleStartObject();
+
+            case END_OBJECT_CHAR:
+
+                return handleEndObject();
+
+            case START_ARRAY_CHAR:
+
+                return handleStartArray();
+
+            case END_ARRAY_CHAR:
+
+                return handleEndArray();
+
+            case QUOTE_CHAR:
+
+                return handleQuote();
+
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':
+            case MINUS:
+            case FALSE_F: // false
+            case TRUE_T: // true
+            case NULL_N: // null
+
+                return handleLiteral(c);
+            default:
+                throw uexc("Excpected structural character or digit or 't' or 'n' or 'f' or '-'");
+
+        }
+
+    }
+
+    private Event handleStartObject() {
+
+        //last event must one of the following-> : , [
+        if (previousEvent != 0 && previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
+            throw uexc("Excpected : , [");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, false);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
+            currentStructureElement = localStructureElement;
+        }
+
+        return EVT_MAP[previousEvent = START_OBJECT];
+
+    }
+
+    private Event handleEndObject() {
+
+        //last event must one of the following-> " ] { } LITERAL
+        if (previousEvent == START_ARRAY || previousEvent == COMMA_EVENT || previousEvent == KEY_NAME
+                || previousEvent == KEY_SEPARATOR_EVENT || currentStructureElement == null) {
+            throw uexc("Expected \" ] { } LITERAL");
+        }
+
+        if (currentStructureElement.isArray) {
+            throw uexc("Expected : ]");
+        }
+
+        //pop from stack
+        currentStructureElement = currentStructureElement.previous;
+
+        return EVT_MAP[previousEvent = END_OBJECT];
+    }
+
+    private Event handleStartArray() {
+
+        //last event must one of the following-> : , [
+        if (previousEvent != 0 && previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
+            throw uexc("Expected : , [");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, true);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
+            currentStructureElement = localStructureElement;
+        }
+
+        return EVT_MAP[previousEvent = START_ARRAY];
+    }
+
+    private Event handleEndArray() {
+
+        //last event must one of the following-> [ ] } " LITERAL
+        if (previousEvent == START_OBJECT || previousEvent == COMMA_EVENT || previousEvent == KEY_SEPARATOR_EVENT
+                || currentStructureElement == null) {
+            throw uexc("Expected [ ] } \" LITERAL");
+        }
+
+        if (!currentStructureElement.isArray) {
+            throw uexc("Expected : }");
+        }
+
+        //pop from stack
+        currentStructureElement = currentStructureElement.previous;
+
+        return EVT_MAP[previousEvent = END_ARRAY];
+    }
+
+    //read a string, gets called recursively
+    //Handles escape/d characters
+    //if string contains escape chars and/or cross buffer boundary then copy in the value buffer
+    //if not then denote string start and end in startOfValueInBuffer and endOfValueInBuffer and read directly from buffer
+    private void readString() {
+
+        char n = readNextChar();
+        //when first called n its first char after the starting quote
+        //after that its the next character after the while loop below
+
+        if (n == QUOTE_CHAR) {
+            endOfValueInBuffer = startOfValueInBuffer = bufferPos; //->"" case
+            return;
+        } else if (n == EOL) {
+            throw uexc("Unexpected linebreak");
+
+        } else if (n >= '\u0000' && n <= '\u001F') {
+            throw uexc("Unescaped control character");
+
+        } else if (n == ESCAPE_CHAR) {
+
+            n = readNextChar();
+
+            //  \ u XXXX -> unicode char
+            if (n == 'u') {
+                n = parseUnicodeHexChars();
+                appendToCopyBuffer(n);
+
+                // \\ -> \
+            } else if (n == ESCAPE_CHAR) {
+                appendToCopyBuffer(n);
+
+                //another escape chars, for example \t
+            } else {
+                appendToCopyBuffer(Strings.asEscapedChar(n));
+
+            }
+
+        } else {
+
+            startOfValueInBuffer = bufferPos;
+            endOfValueInBuffer = -1;
+
+            while ((n = readNextChar()) > '\u001F' && n != ESCAPE_CHAR && n != EOL && n != QUOTE_CHAR) {
+                //read fast
+            }
+
+            endOfValueInBuffer = bufferPos;
+
+            if (n == QUOTE_CHAR) {
+
+                if (fallBackCopyBufferLength > 0) {
+                    copyCurrentValue();
+                } else {
+                    if ((endOfValueInBuffer - startOfValueInBuffer) > maxValueLength) {
+                        throw tmc();
+                    }
+
+                }
+
+                return;
+            } else if (n == EOL) {
+                throw uexc("Unexpected linebreak");
+
+            } else if (n >= '\u0000' && n <= '\u001F') {
+                throw uexc("Unescaped control character");
+            }
+
+            copyCurrentValue();
+
+            //current n is one of < '\u001F' -OR- ESCAPE_CHAR -OR- EOL -OR- QUOTE
+
+            bufferPos--; //unread one char
+
+        }
+
+        //recurse until string is terminated by a non escaped quote
+        readString();
+
+    }
+
+    //maybe we want to check invalid utf encoding
+    //not clear yet if the InputStreamReader is doing that
+
+    /*
+    private char checkSurrogates(char n, char highSurrogate) {
+        //check for invalid surrogates
+        //high followed by low       
+        if (Character.isHighSurrogate(n)) {
+
+            if (highSurrogate != 0) {
+                throw uexc("Unexpected high surrogate");
+            }
+            return n;
+        } else if (Character.isLowSurrogate(n)) {
+
+            if (highSurrogate == 0) {
+                throw uexc("Unexpected low surrogate");
+            } else if (!Character.isSurrogatePair(highSurrogate, n)) {
+                throw uexc("Invalid surrogate pair");
+            }
+            return 0;
+        } else if (highSurrogate != 0 && !Character.isLowSurrogate(n)) {
+            throw uexc("Expected low surrogate");
+        }
+        
+        return highSurrogate;
+    }*/
+
+    //read the next four chars, check them and treat them as an single unicode char
+    private char parseUnicodeHexChars() {
+        // \u08Ac etc       
+        return (char) (((parseHexDigit(readNextChar())) * 4096) + ((parseHexDigit(readNextChar())) * 256)
+                + ((parseHexDigit(readNextChar())) * 16) + ((parseHexDigit(readNextChar()))));
+
+    }
+
+    private Event handleQuote() {
+
+        //always the beginning quote of a key or value  
+
+        //last event must one of the following-> : { [ ,
+        if (previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_OBJECT && previousEvent != START_ARRAY
+                && previousEvent != COMMA_EVENT) {
+            throw uexc("Expected : { [ ,");
+        }
+        //starting quote already consumed
+        readString();
+        //end quote already consumed
+
+        //make the decision if its an key or value
+        if (previousEvent == KEY_SEPARATOR_EVENT) {
+            //must be value
+
+            if (currentStructureElement != null && currentStructureElement.isArray) {
+                //not in array, only allowed within array
+                throw uexc("Key value pair not allowed in an array");
+            }
+
+            return EVT_MAP[previousEvent = VALUE_STRING];
+
+        } else { //Event is  START_OBJECT  OR START_ARRAY OR COMMA_EVENT
+            //must be a key if we are in an object, if not its a value 
+
+            if (currentStructureElement != null && currentStructureElement.isArray) {
+                return EVT_MAP[previousEvent = VALUE_STRING];
+            }
+
+            return EVT_MAP[previousEvent = KEY_NAME];
+        }
+
+    }
+
+    //read a number
+    //if a number cross buffer boundary then copy in the value buffer
+    //if not then denote string start and end in startOfValueInBuffer and endOfValueInBuffer and read directly from buffer
+    private void readNumber(final char c) {
+
+        //start can change on any read() if we cross buffer boundary
+        startOfValueInBuffer = bufferPos;
+        endOfValueInBuffer = -1;
+
+        char y = EOF;
+
+        //sum up the digit values 
+        int cumulatedDigitValue = 0;
+        while (isAsciiDigit(y = readNextChar())) {
+
+            if (c == ZERO) {
+                throw uexc("Leading zeros not allowed");
+            }
+
+            if (c == MINUS && cumulatedDigitValue == 48) {
+                throw uexc("Leading zeros after minus not allowed");
+            }
+
+            cumulatedDigitValue += y;
+
+        }
+
+        if (c == MINUS && cumulatedDigitValue == 0) {
+
+            throw uexc("Unexpected premature end of number");
+        }
+
+        if (y == DOT) {
+            isCurrentNumberIntegral = false;
+            cumulatedDigitValue = 0;
+            while (isAsciiDigit(y = readNextChar())) {
+                cumulatedDigitValue++;
+            }
+
+            if (cumulatedDigitValue == 0) {
+
+                throw uexc("Unexpected premature end of number");
+            }
+
+        }
+
+        if (y == EXP_LOWERCASE || y == EXP_UPPERCASE) {
+            isCurrentNumberIntegral = false;
+
+            y = readNextChar(); //+ or - or digit
+
+            if (!isAsciiDigit(y) && y != MINUS && y != PLUS) {
+                throw uexc("Expected DIGIT or + or -");
+            }
+
+            if (y == MINUS || y == PLUS) {
+                y = readNextChar();
+                if (!isAsciiDigit(y)) {
+                    throw uexc("Unexpected premature end of number");
+                }
+
+            }
+
+            while (isAsciiDigit(y = readNextChar())) {
+                //no-op
+            }
+
+        }
+
+        endOfValueInBuffer = bufferPos;
+
+        if (y == COMMA_CHAR || y == END_ARRAY_CHAR || y == END_OBJECT_CHAR || y == EOL || y == SPACE || y == TAB || y == CR) {
+
+            bufferPos--;//unread one char
+
+            //['-', DIGIT]
+            if (isCurrentNumberIntegral && c == MINUS && cumulatedDigitValue >= 48 && cumulatedDigitValue <= 57) {
+
+                currentIntegralNumber = -(cumulatedDigitValue - 48); //optimize -0 till -9
+                return;
+            }
+
+            //[DIGIT]
+            if (isCurrentNumberIntegral && c != MINUS && cumulatedDigitValue == 0) {
+
+                currentIntegralNumber = (c - 48); //optimize 0 till 9
+                return;
+            }
+
+            if (fallBackCopyBufferLength > 0) {
+
+                //we crossed a buffer boundary, use value buffer
+                copyCurrentValue();
+
+            } else {
+                if ((endOfValueInBuffer - startOfValueInBuffer) >= maxValueLength) {
+                    throw tmc();
+                }
+            }
+
+            return;
+
+        }
+
+        throw uexc("Unexpected premature end of number");
+
+    }
+
+    //handles false, true, null and numbers
+    private Event handleLiteral(final char c) {
+
+        //last event must one of the following-> : , [
+        if (previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
+            throw uexc("Excpected : , [");
+        }
+
+        if (previousEvent == COMMA_EVENT && !currentStructureElement.isArray) {
+            //only allowed within array
+            throw uexc("Not in an array context");
+        }
+
+        // probe literals
+        switch (c) {
+            case TRUE_T:
+
+                if (readNextChar() != TRUE_R || readNextChar() != TRUE_U || readNextChar() != TRUE_E) {
+                    throw uexc("Expected LITERAL: true");
+                }
+                return EVT_MAP[previousEvent = VALUE_TRUE];
+            case FALSE_F:
+
+                if (readNextChar() != FALSE_A || readNextChar() != FALSE_L || readNextChar() != FALSE_S || readNextChar() != FALSE_E) {
+                    throw uexc("Expected LITERAL: false");
+                }
+
+                return EVT_MAP[previousEvent = VALUE_FALSE];
+
+            case NULL_N:
+
+                if (readNextChar() != NULL_U || readNextChar() != NULL_L || readNextChar() != NULL_L) {
+                    throw uexc("Expected LITERAL: null");
+                }
+                return EVT_MAP[previousEvent = VALUE_NULL];
+
+            default:
+                readNumber(c);
+                return EVT_MAP[previousEvent = VALUE_NUMBER];
+        }
+
+    }
+
+    @Override
+    public String getString() {
+        if (previousEvent == KEY_NAME || previousEvent == VALUE_STRING || previousEvent == VALUE_NUMBER) {
+
+            //if there a content in the value buffer read from them, if not use main buffer
+            return fallBackCopyBufferLength > 0 ? new String(fallBackCopyBuffer, 0, fallBackCopyBufferLength) : new String(buffer,
+                    startOfValueInBuffer, endOfValueInBuffer - startOfValueInBuffer);
+        } else {
+            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getString()");
+        }
+    }
+
+    @Override
+    public boolean isIntegralNumber() {
+
+        if (previousEvent != VALUE_NUMBER) {
+            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support isIntegralNumber()");
+        } else {
+            return isCurrentNumberIntegral;
+        }
+    }
+
+    @Override
+    public int getInt() {
+        if (previousEvent != VALUE_NUMBER) {
+            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getInt()");
+        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
+            return currentIntegralNumber;
+        } else if (isCurrentNumberIntegral) {
+            //if there a content in the value buffer read from them, if not use main buffer
+            final Integer retVal = fallBackCopyBufferLength > 0 ? parseIntegerFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
+                    : parseIntegerFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
+            if (retVal == null) {
+                return getBigDecimal().intValue();
+            } else {
+                return retVal.intValue();
+            }
+        } else {
+            return getBigDecimal().intValue();
+        }
+    }
+
+    @Override
+    public long getLong() {
+        if (previousEvent != VALUE_NUMBER) {
+            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getLong()");
+        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
+            return currentIntegralNumber;
+        } else if (isCurrentNumberIntegral) {
+            //if there a content in the value buffer read from them, if not use main buffer
+            final Long retVal = fallBackCopyBufferLength > 0 ? parseLongFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
+                    : parseLongFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
+            if (retVal == null) {
+                return getBigDecimal().longValue();
+            } else {
+                return retVal.longValue();
+            }
+        } else {
+            return getBigDecimal().longValue();
+        }
+
+    }
+
+    @Override
+    public BigDecimal getBigDecimal() {
+        if (previousEvent != VALUE_NUMBER) {
+            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getBigDecimal()");
+            //        } else if (currentBigDecimalNumber != null) {
+            //            return currentBigDecimalNumber;
+        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
+            return new BigDecimal(currentIntegralNumber);
+        } else if (isCurrentNumberIntegral) {
+            //if there a content in the value buffer read from them, if not use main buffer
+            final Long retVal = fallBackCopyBufferLength > 0 ? parseLongFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
+                    : parseLongFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
+            if (retVal == null) {
+                return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
+                        fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer,
+                        (endOfValueInBuffer - startOfValueInBuffer)));
+            } else {
+                return (/*currentBigDecimalNumber = */new BigDecimal(retVal.longValue()));
+            }
+        } else {
+            //if there a content in the value buffer read from them, if not use main buffer
+            return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
+                    fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer, (endOfValueInBuffer - startOfValueInBuffer)));
+        }
+
+    }
+
+    @Override
+    public JsonLocation getLocation() {
+        return createLocation();
+    }
+
+    @Override
+    public void close() {
+        bufferProvider.release(buffer);
+        valueProvider.release(fallBackCopyBuffer);
+
+        try {
+            in.close();
+        } catch (final IOException e) {
+            throw new JsonException("Unexpected IO exception " + e.getMessage(), e);
+        }
+    }
+
+    //parse a char[] to long while checking overflow
+    //if overflowed return null
+    //no additional checks since we are sure here that there are no non digits in the array
+    private static Long parseLongFromChars(final char[] chars, final int start, final int end) {
+
+        long retVal = 0;
+        final boolean negative = chars[start] == MINUS;
+        for (int i = negative ? start + 1 : start; i < end; i++) {
+            final long tmp = retVal * 10 + (chars[i] - ZERO);
+            if (tmp < retVal) { //check overflow
+                return null;
+            } else {
+                retVal = tmp;
+            }
+        }
+
+        return negative ? -retVal : retVal;
+    }
+
+    //parse a char[] to int while checking overflow
+    //if overflowed return null
+    //no additional checks since we are sure here that there are no non digits in the array
+    private static Integer parseIntegerFromChars(final char[] chars, final int start, final int end) {
+
+        int retVal = 0;
+        final boolean negative = chars[start] == MINUS;
+        for (int i = negative ? start + 1 : start; i < end; i++) {
+            final int tmp = retVal * 10 + (chars[i] - ZERO);
+            if (tmp < retVal) { //check overflow
+                return null;
+            } else {
+                retVal = tmp;
+            }
+        }
+
+        return negative ? -retVal : retVal;
+    }
+
+    private JsonParsingException uexc(final char c, final String message) {
+        final JsonLocation location = createLocation();
+        return new JsonParsingException("Unexpected character '" + c + "' (Codepoint: " + String.valueOf(c).codePointAt(0) + ") on "
+                + location + ". Reason is [[" + message + "]]", location);
+    }
+
+    private JsonParsingException uexc(final String message) {
+        final char c = bufferPos < 0 ? 0 : buffer[bufferPos];
+        return uexc(c, message);
+    }
+
+    private JsonParsingException tmc() {
+        final JsonLocation location = createLocation();
+        return new JsonParsingException("Too many characters. Maximum string/number length of " + maxValueLength + " exceeded on "
+                + location, location);
+    }
+
+    private JsonParsingException uexio(final IOException e) {
+        final JsonLocation location = createLocation();
+        return new JsonParsingException("Unexpected IO exception on " + location, e, location);
+    }
+
+    private JsonParsingException cust(final String message) {
+        final JsonLocation location = createLocation();
+        return new JsonParsingException("General exception on " + location + ". Reason is [[" + message + "]]", location);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..a7e8f29
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStringImpl.java
@@ -0,0 +1,76 @@
+/*
+ * 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.JsonString;
+
+final class JsonStringImpl implements JsonString {
+    private final String value;
+    private String escape;
+    private Integer hashCode = null;
+
+
+    JsonStringImpl(final String value) {
+        if(value == null) {
+            throw new NullPointerException("value must not be null");
+        }
+
+        this.value = value;
+    }
+
+    @Override
+    public String getString() {
+        return value;
+    }
+
+    @Override
+    public CharSequence getChars() {
+        return value;
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.STRING;
+    }
+
+    @Override
+    public String toString() {
+        String s = escape;
+        if (s == null) {
+            s =  JsonChars.QUOTE_CHAR+Strings.escape(value)+JsonChars.QUOTE_CHAR;
+            escape=s;
+        }
+        return s;
+    }
+
+    @Override
+    public int hashCode() {
+        Integer h = hashCode;
+        if (h == null) {
+            h = value.hashCode();
+            hashCode=h;
+        }
+        return h;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonString.class.isInstance(obj) && JsonString.class.cast(obj).getString().equals(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterFactoryImpl.java
new file mode 100644
index 0000000..e7d30b8
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterFactoryImpl.java
@@ -0,0 +1,77 @@
+/*
+ * 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 java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.JsonWriter;
+import javax.json.JsonWriterFactory;
+import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+
+class JsonWriterFactoryImpl implements JsonWriterFactory, Serializable {
+    private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
+    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
+        
+        JsonGenerator.PRETTY_PRINTING
+
+    };
+    private final JsonGeneratorFactory factory;
+
+    JsonWriterFactoryImpl(final Map<String, ?> config) {
+        if (config != null) {
+
+            for (final String configKey : SUPPORTED_CONFIG_KEYS) {
+                if (config.containsKey(configKey)) {
+                    internalConfig.put(configKey, config.get(configKey));
+                }
+            }
+        }
+
+        this.factory = new JsonGeneratorFactoryImpl(internalConfig);
+    }
+
+    @Override
+    public JsonWriter createWriter(final Writer writer) {
+        return new JsonWriterImpl(factory.createGenerator(writer));
+    }
+
+    @Override
+    public JsonWriter createWriter(final OutputStream out) {
+        return createWriter(new OutputStreamWriter(out, UTF8_CHARSET));
+    }
+
+    @Override
+    public JsonWriter createWriter(final OutputStream out, final Charset charset) {
+        return createWriter(new OutputStreamWriter(out, charset));
+    }
+
+    @Override
+    public Map<String, ?> getConfigInUse() {
+        return Collections.unmodifiableMap(internalConfig);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
new file mode 100644
index 0000000..e012ae1
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonWriterImpl.java
@@ -0,0 +1,73 @@
+/*
+ * 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 java.io.Serializable;
+
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonStructure;
+import javax.json.JsonWriter;
+import javax.json.stream.JsonGenerator;
+
+class JsonWriterImpl implements JsonWriter, Serializable{
+    private final JsonGenerator generator;
+    private boolean closed = false;
+
+    JsonWriterImpl(final JsonGenerator generator) {
+        this.generator = generator;
+    }
+
+    @Override
+    public void writeArray(final JsonArray array) {
+        checkClosed();
+        generator.write(array);
+        close();
+    }
+
+    @Override
+    public void writeObject(final JsonObject object) {
+        checkClosed();
+        generator.write(object);
+        close();
+    }
+
+    @Override
+    public void write(final JsonStructure value) {
+        checkClosed();
+        generator.write(value);
+        close();
+    }
+
+    @Override
+    public void close() {
+        
+        if(!closed) {
+            closed = true;
+            generator.close();
+        }
+    }
+    
+    private void checkClosed() {
+        if(closed) {
+            throw new IllegalStateException("writeArray(), writeObject(), write() or close() method was already called");
+        }
+           
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java b/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
new file mode 100644
index 0000000..ceff1a9
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.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 java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PushbackInputStream;
+import java.nio.charset.Charset;
+
+import javax.json.JsonException;
+
+final class RFC4627AwareInputStreamReader extends InputStreamReader {
+
+    RFC4627AwareInputStreamReader(final InputStream in) {
+        this(new PushbackInputStream(in,4));
+    }
+    
+    private RFC4627AwareInputStreamReader(final PushbackInputStream in) {
+        super(in, getCharset(in).newDecoder());
+       
+    }
+
+
+    /*
+        * RFC 4627
+
+          JSON text SHALL be encoded in Unicode.  The default encoding is
+          UTF-8.
+       
+          Since the first two characters of a JSON text will always be ASCII
+          characters [RFC0020], it is possible to determine whether an octet
+          stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
+          at the pattern of nulls in the first four octets.
+
+          00 00 00 xx  UTF-32BE
+          00 xx 00 xx  UTF-16BE
+          xx 00 00 00  UTF-32LE
+          xx 00 xx 00  UTF-16LE
+          xx xx xx xx  UTF-8
+
+        */
+
+    private static Charset getCharset(final PushbackInputStream inputStream) {
+        Charset charset = Charset.forName("UTF-8");
+        final byte[] utfBytes = new byte[4];
+        int bomLength=0;
+        try {
+            final int read = inputStream.read(utfBytes);
+            if (read < 2) {
+                throw new JsonException("Invalid Json. Valid Json has at least 2 bytes");
+            } else {
+
+                int first = (utfBytes[0] & 0xFF);
+                int second = (utfBytes[1] & 0xFF);
+                
+                if (first == 0x00) {
+                    charset = (second == 0x00) ? Charset.forName("UTF-32BE") : Charset.forName("UTF-16BE");
+                } else if (read > 2 && second == 0x00) {
+                    int third = (utfBytes[2] & 0xFF);
+                    charset = (third  == 0x00) ? Charset.forName("UTF-32LE") : Charset.forName("UTF-16LE");
+                } else {
+                  
+                    /*check BOM
+
+                    Encoding       hex byte order mark
+                    UTF-8          EF BB BF
+                    UTF-16 (BE)    FE FF
+                    UTF-16 (LE)    FF FE
+                    UTF-32 (BE)    00 00 FE FF
+                    UTF-32 (LE)    FF FE 00 00
+                    */
+                                        
+                    
+                    
+                    
+                    if(first == 0xFE && second == 0xFF) {
+                        charset = Charset.forName("UTF-16BE");
+                        bomLength=2;
+                    } else if(read > 3 && first == 0x00 && second == 0x00 && (utfBytes[2]&0xff) == 0xFE && (utfBytes[3]&0xff) == 0xFF){
+                        charset = Charset.forName("UTF-32BE");
+                        bomLength=4;
+                    } else if(first == 0xFF && second == 0xFE) {
+                        
+                        if(read > 3 && (utfBytes[2]&0xff) == 0x00 && (utfBytes[3]&0xff) == 0x00) {
+                            charset = Charset.forName("UTF-32LE");
+                            bomLength=4;
+                        }else {
+                            charset = Charset.forName("UTF-16LE");
+                            bomLength=2;
+                        }
+                        
+                    } 
+                    
+                    //assume UTF8
+                    
+                }
+
+            }
+            
+            if(bomLength < 4) {
+                inputStream.unread(utfBytes,bomLength==2?2:0,read-bomLength);
+            }
+            
+            
+
+        } catch (final IOException e) {
+            throw new JsonException("Unable to detect charset due to "+e.getMessage(), e);
+        }
+
+        return charset;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
new file mode 100644
index 0000000..4ed4d9e
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/Strings.java
@@ -0,0 +1,127 @@
+/*
+ * 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 java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.json.stream.JsonParsingException;
+
+class Strings implements JsonChars {
+    private static final BufferStrategy.BufferProvider<StringBuilder> BUILDER_CACHE =
+        BufferStrategy.valueOf(System.getProperty("johnzon.string-builder.strategy", "QUEUE"))
+            .newStringBuilderProvider(Integer.getInteger("org.apache.johnzon.default-string-builder", 1024));
+
+    private static final String UNICODE_PREFIX = "\\u";
+    private static final String UNICODE_PREFIX_HELPER = "000";
+    private static final ConcurrentMap<Character, String> UNICODE_CACHE = new ConcurrentHashMap<Character, String>();
+
+    static char asEscapedChar(final char current) {
+        switch (current) {
+            case 'r':
+                return '\r';
+            case 't':
+                return '\t';
+            case 'b':
+                return '\b';
+            case 'f':
+                return '\f';
+            case 'n':
+                return '\n';
+            case '"':
+                return '\"';
+            case '\\':
+                return '\\';  
+            case '/':
+                return '/';  
+            default:
+                if(Character.isHighSurrogate(current) || Character.isLowSurrogate(current)) {
+                    return current;
+                }
+                throw new JsonParsingException("Invalid escape sequence '"+current +"' (Codepoint: "+String.valueOf(current).
+                        codePointAt(0),JsonLocationImpl.UNKNOW_LOCATION);
+        }
+
+    }
+
+    static String escape(final String value) {
+        
+        if(value == null || value.length()==0) {
+            return value;
+        }
+        
+        final StringBuilder builder = BUILDER_CACHE.newBuffer();
+        try {
+            for (int i = 0; i < value.length(); i++) {
+                final char c = value.charAt(i);
+                switch (c) {
+                    case QUOTE_CHAR:
+                    case ESCAPE_CHAR:
+                        builder.append(ESCAPE_CHAR).append(c);
+                        break;
+                    default:
+                        if (c < SPACE) { // we could do a single switch but actually we should rarely enter this if so no need to pay it
+                            switch (c) {
+                                case EOL:
+                                    builder.append("\\n");
+                                    break;
+                                case '\r':
+                                    builder.append("\\r");
+                                    break;
+                                case '\t':
+                                    builder.append("\\t");
+                                    break;
+                                case '\b':
+                                    builder.append("\\b");
+                                    break;
+                                case '\f':
+                                    builder.append("\\f");
+                                    break;
+                                default:
+                                    builder.append(toUnicode(c));
+                            }
+                        } else if ((c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) {
+                            builder.append(toUnicode(c));
+                        } else {
+                            builder.append(c);
+                        }
+                }
+            }
+            return builder.toString();
+        } finally {
+            BUILDER_CACHE.release(builder);
+        }
+    }
+
+    private static String toUnicode(final char c) {
+        final String found = UNICODE_CACHE.get(c);
+        if (found != null) {
+            return found;
+        }
+
+        final String hex = UNICODE_PREFIX_HELPER + Integer.toHexString(c);
+        final String s = UNICODE_PREFIX + hex.substring(hex.length() - 4);
+        UNICODE_CACHE.putIfAbsent(c, s);
+        return s;
+    }
+
+    private Strings() {
+        // no-op
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/ThreadLocalBufferCache.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/ThreadLocalBufferCache.java b/johnzon-core/src/main/java/org/apache/johnzon/core/ThreadLocalBufferCache.java
new file mode 100644
index 0000000..f973fcd
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/ThreadLocalBufferCache.java
@@ -0,0 +1,53 @@
+/*
+ * 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 java.io.Serializable;
+
+public abstract class ThreadLocalBufferCache<T> implements Serializable {
+    // alloc are expensive so using a very trivial buffer, we remove from TL to say we use it and reset it when we are done (close)
+    private final ThreadLocal<T> buffers;
+    private final int defaultSize;
+
+    public ThreadLocalBufferCache(final int defaultSize) {
+        this.buffers = new ThreadLocal<T>() {
+            @Override
+            protected T initialValue() {
+                return ThreadLocalBufferCache.this.newValue(defaultSize);
+            }
+        };
+        this.defaultSize = defaultSize;
+    }
+
+    protected abstract T newValue(final int defaultSize);
+
+    public T getCache() {
+        final T cachedLoadedChars = buffers.get();
+        if (cachedLoadedChars == null) {
+            return newValue(defaultSize);
+        }
+        buffers.set(null); // remove just kills the buffers
+        return cachedLoadedChars;
+    }
+
+
+    public void release(final T buffer) {
+        buffers.set(buffer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider b/johnzon-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
new file mode 100644
index 0000000..22e9dd7
--- /dev/null
+++ b/johnzon-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
@@ -0,0 +1 @@
+org.apache.johnzon.core.JsonProviderImpl

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayBuilderImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayBuilderImplTest.java
new file mode 100644
index 0000000..df7a1af
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayBuilderImplTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import javax.json.Json;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
+
+import org.junit.Test;
+
+public class JsonArrayBuilderImplTest {
+    @Test
+    public void array() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add("a").add("b");
+        assertEquals("[\"a\",\"b\"]", builder.build().toString());
+    }
+    
+    @Test
+    public void escapedStringArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add("a\"").add("\u0000");
+        assertEquals("[\"a\\\"\",\"\\u0000\"]", builder.build().toString());
+    }
+    
+    @Test
+    public void emptyArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        assertEquals("[]", builder.build().toString());
+    }
+    
+    @Test
+    public void emptyArrayInEmtyArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(Json.createArrayBuilder());
+        assertEquals("[[]]", builder.build().toString());
+    }
+    
+    @Test
+    public void arrayInArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(3).add(4);
+        final JsonArrayBuilder builder2 = Json.createArrayBuilder();
+        builder2.add(1).add(2).add(builder);
+        assertEquals("[1,2,[3,4]]", builder2.build().toString());
+    }
+    
+    @Test
+    public void arrayObjectInArray() {
+        final JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
+        objectBuilder.add("key", "val");
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(3).add(4).add(objectBuilder);
+        final JsonArrayBuilder builder2 = Json.createArrayBuilder();
+        builder2.add(1).add(2).add(builder);
+        assertEquals("[1,2,[3,4,{\"key\":\"val\"}]]", builder2.build().toString());
+    }
+    
+    @Test
+    public void nullArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.addNull().addNull();
+        assertEquals("[null,null]", builder.build().toString());
+    }
+    
+    @Test
+    public void nullArrayNonChaining() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.addNull();
+        builder.addNull();
+        assertEquals("[null,null]", builder.build().toString());
+    }
+    
+    @Test
+    public void nullJsonValueArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(JsonValue.NULL).add(JsonValue.NULL);
+        assertEquals("[null,null]", builder.build().toString());
+    }
+    
+    @Test
+    public void boolJsonValueArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(JsonValue.TRUE).add(JsonValue.FALSE);
+        assertEquals("[true,false]", builder.build().toString());
+    }
+    
+    @Test
+    public void numJsonValueArray() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add(123.12d).add(new BigDecimal("456.789E-12")).add(-0).add(0).add((short)1).add((byte)1);
+        assertEquals("[123.12,4.56789E-10,0,0,1,1]", builder.build().toString());
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addStringNpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((String) null);
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addJVNpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((JsonValue) null);
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addBDNpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((BigDecimal) null);
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addBINpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((BigInteger) null);
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addJABuilderNpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((JsonArrayBuilder) null);
+    }
+    
+    @Test(expected=NullPointerException.class)
+    public void addJOBuilderNpeIfNull() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((JsonObjectBuilder) null);
+    }
+    
+    @Test(expected=NumberFormatException.class)
+    public void addDoubleNpeIfNaN() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((double) Double.NaN);
+    }
+    
+    @Test(expected=NumberFormatException.class)
+    public void addDoubleNpeIfPosInfinite() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((double) Double.POSITIVE_INFINITY);
+    }
+    
+    @Test(expected=NumberFormatException.class)
+    public void addDoubleNpeIfNegIfinite() {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+        builder.add((double) Double.NEGATIVE_INFINITY);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayImplTest.java
new file mode 100644
index 0000000..b0918b1
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonArrayImplTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+
+import org.junit.Test;
+
+public class JsonArrayImplTest {
+    @Test
+    public void arrayToString() {       
+        JsonArrayBuilder ab = Json.createArrayBuilder();
+        
+        ab.add(new JsonStringImpl("a"));
+        ab.add(new JsonStringImpl("b"));
+        assertEquals("[\"a\",\"b\"]", ab.build().toString());
+    }
+    
+    @Test
+    public void arrayIndex() {
+        JsonArrayBuilder ab = Json.createArrayBuilder();
+        ab.add(new JsonStringImpl("a"));
+        ab.add(new JsonStringImpl("b"));
+        ab.add(new JsonLongImpl(5));
+        final JsonArray array = (JsonArray) ab.build();
+        assertFalse(array.isEmpty());
+        assertEquals("a", array.getJsonString(0).getString());
+        assertEquals("b", array.getJsonString(1).getString());
+        assertEquals(5, array.getJsonNumber(2).longValue());
+        assertEquals("[\"a\",\"b\",5]", array.toString());
+    }
+    
+    @Test
+    public void emptyArray() {
+        final JsonArray array = Json.createArrayBuilder().build();
+        assertTrue(array.isEmpty());
+        assertEquals("[]", array.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java
new file mode 100644
index 0000000..4f73aaa
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonGeneratorImplTest.java
@@ -0,0 +1,281 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.HashMap;
+
+import javax.json.Json;
+import javax.json.JsonValue;
+import javax.json.stream.JsonGenerationException;
+import javax.json.stream.JsonGenerator;
+
+import org.junit.Test;
+
+public class JsonGeneratorImplTest {
+    @Test
+    public void notFluentGeneratorUsage() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final JsonGenerator generator = Json.createGenerator(baos);
+        generator.writeStartArray();
+        generator.writeStartObject();
+        generator.writeEnd();
+        generator.writeEnd();
+        generator.close();
+        assertEquals("[{}]", new String(baos.toByteArray()));
+    }
+
+    @Test
+    public void emptyArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final JsonGenerator generator = Json.createGenerator(baos);
+        generator.writeStartArray().writeEnd().close();
+        assertEquals("[]", new String(baos.toByteArray()));
+    }
+
+    @Test
+    public void simpleArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().write(1).write(2).writeEnd().close();
+        assertEquals("[1,2]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void stringArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().write("val1").write("val2").writeEnd().close();
+        assertEquals("[\"val1\",\"val2\"]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void stringArrayEscapes() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().write("\"val1\t\u0010").write("val2\\").writeEnd().close();
+        assertEquals("[\"\\\"val1\\t\\u0010\",\"val2\\\\\"]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void stringArrayEscapes2() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().write("\"val1\t\u0067").write("val2\\").writeEnd().close();
+        assertEquals("[\"\\\"val1\\tg\",\"val2\\\\\"]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void emptyStringArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().writeNull().write("").writeEnd().close();
+        assertEquals("[null,\"\"]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void nullLiteralArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().writeNull().write(JsonValue.NULL).writeEnd().close();
+        assertEquals("[null,null]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void boolLiteralArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos).writeStartArray().write(JsonValue.FALSE).write(JsonValue.TRUE).writeEnd().close();
+        assertEquals("[false,true]", new String(baos.toByteArray()));
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail1() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray("test");      
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail2() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .write("test",1);      
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail3() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartObject()
+        .writeStartObject();
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail4() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeEnd();
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail5() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .close();
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail6() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray()
+        .writeStartObject("test");
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail7() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray()
+        .writeNull()
+        .writeStartObject()
+        .write("a", new BigDecimal("123.123"))
+        .write("b", true)
+        .write("c", new BigInteger("3312"))
+        .write("d", new JsonStringImpl("mystring"))
+        .writeEnd()
+        .close();
+        
+    }
+    
+    @Test(expected=JsonGenerationException.class)
+    public void fail9() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartObject()
+        .write("a", new BigDecimal("123.123"))
+        .write("b", true)
+        .write("c", new BigInteger("3312"))
+        .write("d", new JsonStringImpl("mystring"))
+        .writeEnd()
+        .writeStartObject()
+        .close();
+        
+    }
+   
+    @Test
+    public void numbers() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray()
+        .writeNull()
+        .writeStartObject()
+        .write("a", new BigDecimal("123.123"))
+        .write("b", true)
+        .write("c", new BigInteger("3312"))
+        .write("d", new JsonStringImpl("Mystring"))
+        .writeEnd()
+        .writeEnd()
+        .close();
+        assertEquals("[null,{\"a\":123.123,\"b\":true,\"c\":3312,\"d\":\"Mystring\"}]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void numbers2() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray()
+        .writeNull()
+        .writeStartObject()
+        .write("a", 999999999L)
+        .write("b", 123)
+        .write("c", -444444444L)
+        .write("d",-123)
+        .writeEnd()
+        .writeEnd()
+        .close();
+        assertEquals("[null,{\"a\":999999999,\"b\":123,\"c\":-444444444,\"d\":-123}]", new String(baos.toByteArray()));
+    }
+    
+    @Test
+    public void arrayInArray() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Json.createGenerator(baos)
+        .writeStartArray()
+        .writeStartArray()
+        .writeNull()
+        .writeEnd()
+        .writeEnd()
+        .close();
+         assertEquals("[[null]]", new String(baos.toByteArray()));
+    }
+    
+
+    @Test
+    public void generate() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final JsonGenerator generator = Json.createGenerator(baos);
+
+        generator.writeStartObject().write("firstName", "John").write("lastName", "Smith").write("age", 25)
+        .writeStartObject("address").write("streetAddress", "21 2nd Street").write("city", "New York")
+        .write("state", "NY").write("postalCode", "10021").writeEnd().writeStartArray("phoneNumber")
+        .writeStartObject().write("type", "home").write("number", "212 555-1234").writeEnd().writeStartObject()
+        .write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd().writeEnd().close();
+
+        assertEquals("{\"firstName\":\"John\",\"lastName\":\"Smith\",\"age\":25,\"address\":"
+                + "{\"streetAddress\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"postalCode\":\"10021\"},"
+                + "\"phoneNumber\":[{\"type\":\"home\",\"number\":\"212 555-1234\"},{\"type\":\"fax\",\"number\":\"646 555-4567\"}]}", 
+                new String(baos.toByteArray()));
+    }
+
+    @Test
+    public void pretty() {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final JsonGenerator generator = Json.createGeneratorFactory(new HashMap<String, Object>() {{
+            put(JsonGenerator.PRETTY_PRINTING, true);
+        }}).createGenerator(baos);
+
+        generator.writeStartObject().write("firstName", "John").write("lastName", "Smith")
+        .write("age", 25).writeStartObject("address").write("streetAddress", "21 2nd Street")
+        .write("city", "New York").write("state", "NY").write("postalCode", "10021").writeEnd()
+        .writeStartArray("phoneNumber").writeStartObject().write("type", "home").write("number", "212 555-1234")
+        .writeEnd().writeStartObject().write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd()
+        .writeEnd().close();
+
+        assertEquals("{\n" +
+                        "  \"firstName\":\"John\",\n" +
+                        "  \"lastName\":\"Smith\",\n" +
+                        "  \"age\":25,\n" +
+                        "  \"address\":{\n" +
+                        "    \"streetAddress\":\"21 2nd Street\",\n" +
+                        "    \"city\":\"New York\",\n" +
+                        "    \"state\":\"NY\",\n" +
+                        "    \"postalCode\":\"10021\"\n" +
+                        "  },\n" +
+                        "  \"phoneNumber\":[\n" +
+                        "    {\n" +
+                        "      \"type\":\"home\",\n" +
+                        "      \"number\":\"212 555-1234\"\n" +
+                        "    },\n" +
+                        "    {\n" +
+                        "      \"type\":\"fax\",\n" +
+                        "      \"number\":\"646 555-4567\"\n" +
+                        "    }\n" +
+                        "  ]\n" +
+                        "}", new String(baos.toByteArray()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
new file mode 100644
index 0000000..b610995
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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 java.math.BigInteger;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+public class JsonNumberTest {
+    
+    @Test(expected=ArithmeticException.class)
+    public void testBigIntegerExact() {
+       
+        JsonArray array = Json.createArrayBuilder().add(100.0200).build();
+        array.getJsonNumber(0).bigIntegerValueExact();
+
+       
+    }
+    
+    @Test
+    public void testBigInteger() {
+       
+        JsonArray array = Json.createArrayBuilder().add(100.0200).build();
+        Assert.assertEquals(new BigInteger("100"), array.getJsonNumber(0).bigIntegerValue());
+
+       
+    }
+
+}


[20/20] git commit: renamed fleece to johnzon

Posted by sa...@apache.org.
renamed fleece to johnzon


Project: http://git-wip-us.apache.org/repos/asf/incubator-fleece/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fleece/commit/6e86a53e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fleece/tree/6e86a53e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fleece/diff/6e86a53e

Branch: refs/heads/renaming
Commit: 6e86a53e85f50893fbbb8ab156e99a8e10de59a8
Parents: 8ff6945
Author: salyh <he...@gmail.com>
Authored: Mon Sep 1 18:27:10 2014 +0200
Committer: salyh <he...@gmail.com>
Committed: Mon Sep 1 18:27:10 2014 +0200

----------------------------------------------------------------------
 DISCLAIMER                                      |     6 +-
 fleece-core/pom.xml                             |    36 -
 .../org/apache/fleece/core/BufferStrategy.java  |   272 -
 .../fleece/core/JsonArrayBuilderImpl.java       |   130 -
 .../org/apache/fleece/core/JsonArrayImpl.java   |   174 -
 .../fleece/core/JsonBuilderFactoryImpl.java     |    61 -
 .../java/org/apache/fleece/core/JsonChars.java  |    82 -
 .../org/apache/fleece/core/JsonDoubleImpl.java  |   102 -
 .../fleece/core/JsonGeneratorFactoryImpl.java   |   121 -
 .../apache/fleece/core/JsonGeneratorImpl.java   |   870 -
 .../apache/fleece/core/JsonInMemoryParser.java  |   180 -
 .../apache/fleece/core/JsonLocationImpl.java    |    80 -
 .../org/apache/fleece/core/JsonLongImpl.java    |    97 -
 .../org/apache/fleece/core/JsonNumberImpl.java  |   107 -
 .../fleece/core/JsonObjectBuilderImpl.java      |   131 -
 .../org/apache/fleece/core/JsonObjectImpl.java  |   167 -
 .../fleece/core/JsonParserFactoryImpl.java      |   149 -
 .../fleece/core/JsonPrettyGeneratorImpl.java    |   305 -
 .../apache/fleece/core/JsonProviderImpl.java    |   205 -
 .../fleece/core/JsonReaderFactoryImpl.java      |    72 -
 .../org/apache/fleece/core/JsonReaderImpl.java  |   208 -
 .../fleece/core/JsonStreamParserImpl.java       |   964 -
 .../org/apache/fleece/core/JsonStringImpl.java  |    76 -
 .../fleece/core/JsonWriterFactoryImpl.java      |    77 -
 .../org/apache/fleece/core/JsonWriterImpl.java  |    73 -
 .../core/RFC4627AwareInputStreamReader.java     |   130 -
 .../java/org/apache/fleece/core/Strings.java    |   127 -
 .../fleece/core/ThreadLocalBufferCache.java     |    53 -
 .../services/javax.json.spi.JsonProvider        |     1 -
 .../fleece/core/JsonArrayBuilderImplTest.java   |   170 -
 .../apache/fleece/core/JsonArrayImplTest.java   |    61 -
 .../fleece/core/JsonGeneratorImplTest.java      |   281 -
 .../org/apache/fleece/core/JsonNumberTest.java  |    51 -
 .../fleece/core/JsonObjectBuilderImplTest.java  |    35 -
 .../apache/fleece/core/JsonObjectImplTest.java  |    35 -
 .../org/apache/fleece/core/JsonParserTest.java  |  1419 -
 .../apache/fleece/core/JsonReaderImplTest.java  |   453 -
 .../apache/fleece/core/JsonWriterImplTest.java  |    42 -
 .../org/apache/fleece/core/LocationTest.java    |   235 -
 .../src/test/resources/bench/big_600kb.json     | 21170 --------
 .../src/test/resources/bench/huge_1mb.json      | 44003 -----------------
 .../src/test/resources/bench/large_130kb.json   |  4328 --
 .../src/test/resources/bench/medium_11kb.json   |   443 -
 .../src/test/resources/bench/small_3kb.json     |    86 -
 .../src/test/resources/bench/tiny_50b.json      |     5 -
 .../resources/bench/unicode_chars_1400kb.txt    |   Bin 1424384 -> 0 bytes
 .../resources/bench/unicode_chars_170kb.txt     |   Bin 178048 -> 0 bytes
 fleece-core/src/test/resources/json/array.json  |     8 -
 .../src/test/resources/json/bigdecimal.json     |     5 -
 fleece-core/src/test/resources/json/empty.json  |     1 -
 .../src/test/resources/json/emptyarray.json     |     3 -
 .../src/test/resources/json/escaping.json       |    11 -
 .../src/test/resources/json/fails/fail1.json    |     8 -
 .../src/test/resources/json/fails/fail10.json   |     7 -
 .../src/test/resources/json/fails/fail11.json   |     8 -
 .../src/test/resources/json/fails/fail12.json   |     8 -
 .../src/test/resources/json/fails/fail13.json   |     8 -
 .../src/test/resources/json/fails/fail14.json   |     8 -
 .../src/test/resources/json/fails/fail15.json   |    11 -
 .../src/test/resources/json/fails/fail16.json   |     9 -
 .../src/test/resources/json/fails/fail17.json   |     9 -
 .../src/test/resources/json/fails/fail18.json   |    11 -
 .../src/test/resources/json/fails/fail19.json   |    10 -
 .../src/test/resources/json/fails/fail2.json    |     8 -
 .../src/test/resources/json/fails/fail20.json   |    10 -
 .../src/test/resources/json/fails/fail21.json   |    10 -
 .../src/test/resources/json/fails/fail22.json   |     1 -
 .../src/test/resources/json/fails/fail23.json   |     8 -
 .../src/test/resources/json/fails/fail24.json   |     5 -
 .../src/test/resources/json/fails/fail25.json   |     8 -
 .../src/test/resources/json/fails/fail26.json   |     7 -
 .../src/test/resources/json/fails/fail27.json   |     7 -
 .../src/test/resources/json/fails/fail28.json   |     7 -
 .../src/test/resources/json/fails/fail29.json   |     7 -
 .../src/test/resources/json/fails/fail3.json    |     8 -
 .../src/test/resources/json/fails/fail30.json   |     7 -
 .../src/test/resources/json/fails/fail31.json   |     7 -
 .../src/test/resources/json/fails/fail32.json   |     7 -
 .../src/test/resources/json/fails/fail33.json   |     7 -
 .../src/test/resources/json/fails/fail34.json   |     7 -
 .../src/test/resources/json/fails/fail35.json   |     7 -
 .../src/test/resources/json/fails/fail36.json   |     3 -
 .../src/test/resources/json/fails/fail37.json   |     4 -
 .../src/test/resources/json/fails/fail38.json   |     3 -
 .../src/test/resources/json/fails/fail39.json   |     3 -
 .../src/test/resources/json/fails/fail4.json    |     8 -
 .../src/test/resources/json/fails/fail40.json   |     4 -
 .../src/test/resources/json/fails/fail41.json   |     3 -
 .../src/test/resources/json/fails/fail42.json   |     3 -
 .../src/test/resources/json/fails/fail43.json   |     3 -
 .../src/test/resources/json/fails/fail44.json   |     3 -
 .../src/test/resources/json/fails/fail45.json   |     3 -
 .../src/test/resources/json/fails/fail46.json   |     3 -
 .../src/test/resources/json/fails/fail47.json   |     1 -
 .../src/test/resources/json/fails/fail48.json   |     6 -
 .../src/test/resources/json/fails/fail49.json   |     1 -
 .../src/test/resources/json/fails/fail5.json    |     8 -
 .../src/test/resources/json/fails/fail50.json   |     4 -
 .../src/test/resources/json/fails/fail51.json   |     1 -
 .../src/test/resources/json/fails/fail52.json   |     1 -
 .../src/test/resources/json/fails/fail53.json   |    11 -
 .../src/test/resources/json/fails/fail54.json   |    12 -
 .../src/test/resources/json/fails/fail55.json   |    12 -
 .../src/test/resources/json/fails/fail56.json   |    11 -
 .../src/test/resources/json/fails/fail57.json   |     1 -
 .../src/test/resources/json/fails/fail58.json   |     3 -
 .../src/test/resources/json/fails/fail59.json   |     1 -
 .../src/test/resources/json/fails/fail6.json    |     8 -
 .../src/test/resources/json/fails/fail60.json   |     1 -
 .../src/test/resources/json/fails/fail61.json   |     3 -
 .../src/test/resources/json/fails/fail62.json   |     3 -
 .../src/test/resources/json/fails/fail63.json   |     3 -
 .../src/test/resources/json/fails/fail64.json   |     3 -
 .../src/test/resources/json/fails/fail65.json   |     3 -
 .../src/test/resources/json/fails/fail66.json   |     3 -
 .../src/test/resources/json/fails/fail67.json   |     3 -
 .../src/test/resources/json/fails/fail68.json   |     3 -
 .../src/test/resources/json/fails/fail69.json   |     3 -
 .../src/test/resources/json/fails/fail7.json    |     8 -
 .../src/test/resources/json/fails/fail70.json   |     3 -
 .../src/test/resources/json/fails/fail71.json   |     3 -
 .../src/test/resources/json/fails/fail72.json   |     3 -
 .../src/test/resources/json/fails/fail8.json    |     8 -
 .../src/test/resources/json/fails/fail9.json    |     8 -
 .../src/test/resources/json/fails/numbers.json  |    18 -
 fleece-core/src/test/resources/json/nested.json |     9 -
 .../src/test/resources/json/numbers.json        |    18 -
 fleece-core/src/test/resources/json/simple.json |     8 -
 .../src/test/resources/json/simple2.json        |     8 -
 .../src/test/resources/json/simple_utf16le.json |   Bin 136 -> 0 bytes
 .../src/test/resources/json/special.json        |    18 -
 .../src/test/resources/json/stringescape.json   |     3 -
 .../src/test/resources/json/unicode.json        |    10 -
 fleece-jaxrs/pom.xml                            |    71 -
 .../apache/fleece/jaxrs/DelegateProvider.java   |    73 -
 .../fleece/jaxrs/FleeceMessageBodyReader.java   |    75 -
 .../fleece/jaxrs/FleeceMessageBodyWriter.java   |    88 -
 .../org/apache/fleece/jaxrs/FleeceProvider.java |    41 -
 .../java/org/apache/fleece/jaxrs/Jsons.java     |    39 -
 .../fleece/jaxrs/JsrMessageBodyReader.java      |    75 -
 .../fleece/jaxrs/JsrMessageBodyWriter.java      |    88 -
 .../org/apache/fleece/jaxrs/JsrProvider.java    |    35 -
 .../jaxrs/WadlDocumentMessageBodyWriter.java    |    63 -
 .../fleece/jaxrs/xml/WadlDocumentToJson.java    |    98 -
 .../apache/fleece/jaxrs/FleeceProviderTest.java |   161 -
 .../apache/fleece/jaxrs/JsrProviderTest.java    |   104 -
 .../jaxrs/xml/WadlDocumentToJsonTest.java       |    61 -
 fleece-mapper/pom.xml                           |    44 -
 .../org/apache/fleece/mapper/Converter.java     |    24 -
 .../apache/fleece/mapper/FleeceConverter.java   |    31 -
 .../org/apache/fleece/mapper/FleeceIgnore.java  |    36 -
 .../java/org/apache/fleece/mapper/Mapper.java   |   670 -
 .../org/apache/fleece/mapper/MapperBuilder.java |   127 -
 .../apache/fleece/mapper/MapperException.java   |    31 -
 .../mapper/converter/BigDecimalConverter.java   |    35 -
 .../mapper/converter/BigIntegerConverter.java   |    35 -
 .../mapper/converter/BooleanConverter.java      |    33 -
 .../fleece/mapper/converter/ByteConverter.java  |    33 -
 .../converter/CachedDelegateConverter.java      |    54 -
 .../mapper/converter/CharacterConverter.java    |    33 -
 .../fleece/mapper/converter/ClassConverter.java |    37 -
 .../fleece/mapper/converter/DateConverter.java  |    54 -
 .../mapper/converter/DoubleConverter.java       |    33 -
 .../fleece/mapper/converter/EnumConverter.java  |    46 -
 .../fleece/mapper/converter/FloatConverter.java |    33 -
 .../mapper/converter/IntegerConverter.java      |    33 -
 .../fleece/mapper/converter/LongConverter.java  |    33 -
 .../fleece/mapper/converter/ShortConverter.java |    33 -
 .../mapper/converter/StringConverter.java       |    33 -
 .../fleece/mapper/reflection/Mappings.java      |   266 -
 .../org/apache/fleece/mapper/LiteralTest.java   |   253 -
 .../fleece/mapper/MapperEnhancedTest.java       |   304 -
 .../org/apache/fleece/mapper/MapperTest.java    |   505 -
 .../apache/fleece/mapper/MapperVersionTest.java |    68 -
 .../mapper/converter/EnumConverterTest.java     |    39 -
 johnzon-core/pom.xml                            |    36 +
 .../org/apache/johnzon/core/BufferStrategy.java |   272 +
 .../johnzon/core/JsonArrayBuilderImpl.java      |   130 +
 .../org/apache/johnzon/core/JsonArrayImpl.java  |   174 +
 .../johnzon/core/JsonBuilderFactoryImpl.java    |    61 +
 .../java/org/apache/johnzon/core/JsonChars.java |    82 +
 .../org/apache/johnzon/core/JsonDoubleImpl.java |   102 +
 .../johnzon/core/JsonGeneratorFactoryImpl.java  |   121 +
 .../apache/johnzon/core/JsonGeneratorImpl.java  |   870 +
 .../apache/johnzon/core/JsonInMemoryParser.java |   180 +
 .../apache/johnzon/core/JsonLocationImpl.java   |    80 +
 .../org/apache/johnzon/core/JsonLongImpl.java   |    97 +
 .../org/apache/johnzon/core/JsonNumberImpl.java |   107 +
 .../johnzon/core/JsonObjectBuilderImpl.java     |   131 +
 .../org/apache/johnzon/core/JsonObjectImpl.java |   167 +
 .../johnzon/core/JsonParserFactoryImpl.java     |   149 +
 .../johnzon/core/JsonPrettyGeneratorImpl.java   |   305 +
 .../apache/johnzon/core/JsonProviderImpl.java   |   205 +
 .../johnzon/core/JsonReaderFactoryImpl.java     |    72 +
 .../org/apache/johnzon/core/JsonReaderImpl.java |   208 +
 .../johnzon/core/JsonStreamParserImpl.java      |   964 +
 .../org/apache/johnzon/core/JsonStringImpl.java |    76 +
 .../johnzon/core/JsonWriterFactoryImpl.java     |    77 +
 .../org/apache/johnzon/core/JsonWriterImpl.java |    73 +
 .../core/RFC4627AwareInputStreamReader.java     |   130 +
 .../java/org/apache/johnzon/core/Strings.java   |   127 +
 .../johnzon/core/ThreadLocalBufferCache.java    |    53 +
 .../services/javax.json.spi.JsonProvider        |     1 +
 .../johnzon/core/JsonArrayBuilderImplTest.java  |   170 +
 .../apache/johnzon/core/JsonArrayImplTest.java  |    61 +
 .../johnzon/core/JsonGeneratorImplTest.java     |   281 +
 .../org/apache/johnzon/core/JsonNumberTest.java |    51 +
 .../johnzon/core/JsonObjectBuilderImplTest.java |    35 +
 .../apache/johnzon/core/JsonObjectImplTest.java |    35 +
 .../org/apache/johnzon/core/JsonParserTest.java |  1419 +
 .../apache/johnzon/core/JsonReaderImplTest.java |   453 +
 .../apache/johnzon/core/JsonWriterImplTest.java |    42 +
 .../org/apache/johnzon/core/LocationTest.java   |   235 +
 .../src/test/resources/bench/big_600kb.json     | 21170 ++++++++
 .../src/test/resources/bench/huge_1mb.json      | 44003 +++++++++++++++++
 .../src/test/resources/bench/large_130kb.json   |  4328 ++
 .../src/test/resources/bench/medium_11kb.json   |   443 +
 .../src/test/resources/bench/small_3kb.json     |    86 +
 .../src/test/resources/bench/tiny_50b.json      |     5 +
 .../resources/bench/unicode_chars_1400kb.txt    |   Bin 0 -> 1424384 bytes
 .../resources/bench/unicode_chars_170kb.txt     |   Bin 0 -> 178048 bytes
 johnzon-core/src/test/resources/json/array.json |     8 +
 .../src/test/resources/json/bigdecimal.json     |     5 +
 johnzon-core/src/test/resources/json/empty.json |     1 +
 .../src/test/resources/json/emptyarray.json     |     3 +
 .../src/test/resources/json/escaping.json       |    11 +
 .../src/test/resources/json/fails/fail1.json    |     8 +
 .../src/test/resources/json/fails/fail10.json   |     7 +
 .../src/test/resources/json/fails/fail11.json   |     8 +
 .../src/test/resources/json/fails/fail12.json   |     8 +
 .../src/test/resources/json/fails/fail13.json   |     8 +
 .../src/test/resources/json/fails/fail14.json   |     8 +
 .../src/test/resources/json/fails/fail15.json   |    11 +
 .../src/test/resources/json/fails/fail16.json   |     9 +
 .../src/test/resources/json/fails/fail17.json   |     9 +
 .../src/test/resources/json/fails/fail18.json   |    11 +
 .../src/test/resources/json/fails/fail19.json   |    10 +
 .../src/test/resources/json/fails/fail2.json    |     8 +
 .../src/test/resources/json/fails/fail20.json   |    10 +
 .../src/test/resources/json/fails/fail21.json   |    10 +
 .../src/test/resources/json/fails/fail22.json   |     1 +
 .../src/test/resources/json/fails/fail23.json   |     8 +
 .../src/test/resources/json/fails/fail24.json   |     5 +
 .../src/test/resources/json/fails/fail25.json   |     8 +
 .../src/test/resources/json/fails/fail26.json   |     7 +
 .../src/test/resources/json/fails/fail27.json   |     7 +
 .../src/test/resources/json/fails/fail28.json   |     7 +
 .../src/test/resources/json/fails/fail29.json   |     7 +
 .../src/test/resources/json/fails/fail3.json    |     8 +
 .../src/test/resources/json/fails/fail30.json   |     7 +
 .../src/test/resources/json/fails/fail31.json   |     7 +
 .../src/test/resources/json/fails/fail32.json   |     7 +
 .../src/test/resources/json/fails/fail33.json   |     7 +
 .../src/test/resources/json/fails/fail34.json   |     7 +
 .../src/test/resources/json/fails/fail35.json   |     7 +
 .../src/test/resources/json/fails/fail36.json   |     3 +
 .../src/test/resources/json/fails/fail37.json   |     4 +
 .../src/test/resources/json/fails/fail38.json   |     3 +
 .../src/test/resources/json/fails/fail39.json   |     3 +
 .../src/test/resources/json/fails/fail4.json    |     8 +
 .../src/test/resources/json/fails/fail40.json   |     4 +
 .../src/test/resources/json/fails/fail41.json   |     3 +
 .../src/test/resources/json/fails/fail42.json   |     3 +
 .../src/test/resources/json/fails/fail43.json   |     3 +
 .../src/test/resources/json/fails/fail44.json   |     3 +
 .../src/test/resources/json/fails/fail45.json   |     3 +
 .../src/test/resources/json/fails/fail46.json   |     3 +
 .../src/test/resources/json/fails/fail47.json   |     1 +
 .../src/test/resources/json/fails/fail48.json   |     6 +
 .../src/test/resources/json/fails/fail49.json   |     1 +
 .../src/test/resources/json/fails/fail5.json    |     8 +
 .../src/test/resources/json/fails/fail50.json   |     4 +
 .../src/test/resources/json/fails/fail51.json   |     1 +
 .../src/test/resources/json/fails/fail52.json   |     1 +
 .../src/test/resources/json/fails/fail53.json   |    11 +
 .../src/test/resources/json/fails/fail54.json   |    12 +
 .../src/test/resources/json/fails/fail55.json   |    12 +
 .../src/test/resources/json/fails/fail56.json   |    11 +
 .../src/test/resources/json/fails/fail57.json   |     1 +
 .../src/test/resources/json/fails/fail58.json   |     3 +
 .../src/test/resources/json/fails/fail59.json   |     1 +
 .../src/test/resources/json/fails/fail6.json    |     8 +
 .../src/test/resources/json/fails/fail60.json   |     1 +
 .../src/test/resources/json/fails/fail61.json   |     3 +
 .../src/test/resources/json/fails/fail62.json   |     3 +
 .../src/test/resources/json/fails/fail63.json   |     3 +
 .../src/test/resources/json/fails/fail64.json   |     3 +
 .../src/test/resources/json/fails/fail65.json   |     3 +
 .../src/test/resources/json/fails/fail66.json   |     3 +
 .../src/test/resources/json/fails/fail67.json   |     3 +
 .../src/test/resources/json/fails/fail68.json   |     3 +
 .../src/test/resources/json/fails/fail69.json   |     3 +
 .../src/test/resources/json/fails/fail7.json    |     8 +
 .../src/test/resources/json/fails/fail70.json   |     3 +
 .../src/test/resources/json/fails/fail71.json   |     3 +
 .../src/test/resources/json/fails/fail72.json   |     3 +
 .../src/test/resources/json/fails/fail8.json    |     8 +
 .../src/test/resources/json/fails/fail9.json    |     8 +
 .../src/test/resources/json/fails/numbers.json  |    18 +
 .../src/test/resources/json/nested.json         |     9 +
 .../src/test/resources/json/numbers.json        |    18 +
 .../src/test/resources/json/simple.json         |     8 +
 .../src/test/resources/json/simple2.json        |     8 +
 .../src/test/resources/json/simple_utf16le.json |   Bin 0 -> 136 bytes
 .../src/test/resources/json/special.json        |    18 +
 .../src/test/resources/json/stringescape.json   |     3 +
 .../src/test/resources/json/unicode.json        |    10 +
 johnzon-jaxrs/pom.xml                           |    71 +
 .../apache/johnzon/jaxrs/DelegateProvider.java  |    73 +
 .../johnzon/jaxrs/JohnzonMessageBodyReader.java |    75 +
 .../johnzon/jaxrs/JohnzonMessageBodyWriter.java |    88 +
 .../apache/johnzon/jaxrs/JohnzonProvider.java   |    41 +
 .../java/org/apache/johnzon/jaxrs/Jsons.java    |    39 +
 .../johnzon/jaxrs/JsrMessageBodyReader.java     |    75 +
 .../johnzon/jaxrs/JsrMessageBodyWriter.java     |    88 +
 .../org/apache/johnzon/jaxrs/JsrProvider.java   |    35 +
 .../jaxrs/WadlDocumentMessageBodyWriter.java    |    63 +
 .../johnzon/jaxrs/xml/WadlDocumentToJson.java   |    98 +
 .../johnzon/jaxrs/JohnzonProviderTest.java      |   161 +
 .../apache/johnzon/jaxrs/JsrProviderTest.java   |   104 +
 .../jaxrs/xml/WadlDocumentToJsonTest.java       |    61 +
 johnzon-mapper/pom.xml                          |    44 +
 .../org/apache/johnzon/mapper/Converter.java    |    24 +
 .../apache/johnzon/mapper/JohnzonConverter.java |    31 +
 .../apache/johnzon/mapper/JohnzonIgnore.java    |    36 +
 .../java/org/apache/johnzon/mapper/Mapper.java  |   670 +
 .../apache/johnzon/mapper/MapperBuilder.java    |   127 +
 .../apache/johnzon/mapper/MapperException.java  |    31 +
 .../mapper/converter/BigDecimalConverter.java   |    35 +
 .../mapper/converter/BigIntegerConverter.java   |    35 +
 .../mapper/converter/BooleanConverter.java      |    33 +
 .../johnzon/mapper/converter/ByteConverter.java |    33 +
 .../converter/CachedDelegateConverter.java      |    54 +
 .../mapper/converter/CharacterConverter.java    |    33 +
 .../mapper/converter/ClassConverter.java        |    37 +
 .../johnzon/mapper/converter/DateConverter.java |    54 +
 .../mapper/converter/DoubleConverter.java       |    33 +
 .../johnzon/mapper/converter/EnumConverter.java |    46 +
 .../mapper/converter/FloatConverter.java        |    33 +
 .../mapper/converter/IntegerConverter.java      |    33 +
 .../johnzon/mapper/converter/LongConverter.java |    33 +
 .../mapper/converter/ShortConverter.java        |    33 +
 .../mapper/converter/StringConverter.java       |    33 +
 .../johnzon/mapper/reflection/Mappings.java     |   266 +
 .../org/apache/johnzon/mapper/LiteralTest.java  |   253 +
 .../johnzon/mapper/MapperEnhancedTest.java      |   304 +
 .../org/apache/johnzon/mapper/MapperTest.java   |   505 +
 .../johnzon/mapper/MapperVersionTest.java       |    68 +
 .../mapper/converter/EnumConverterTest.java     |    39 +
 pom.xml                                         |    42 +-
 src/site/markdown/index.md                      |    28 +-
 src/site/site.xml                               |    10 +-
 352 files changed, 82468 insertions(+), 82468 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/DISCLAIMER
----------------------------------------------------------------------
diff --git a/DISCLAIMER b/DISCLAIMER
index 27d45d2..39e09ad 100644
--- a/DISCLAIMER
+++ b/DISCLAIMER
@@ -1,4 +1,4 @@
-Apache Fleece is an effort undergoing incubation at the Apache Software
+Apache Johnzon is an effort undergoing incubation at the Apache Software
 Foundation (ASF), sponsored by the Apache Incubator PMC.
 
 Incubation is required of all newly accepted projects until a further review
@@ -12,5 +12,5 @@ fully endorsed by the ASF.
 For more information about the incubation status of the Apache Sirona project you
 can go to the following page:
 
-http://incubator.apache.org/projects/fleece.html
-http://fleece.incubator.apache.org
+http://incubator.apache.org/projects/johnzon.html
+http://johnzon.incubator.apache.org

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/pom.xml
----------------------------------------------------------------------
diff --git a/fleece-core/pom.xml b/fleece-core/pom.xml
deleted file mode 100644
index 6fb26e9..0000000
--- a/fleece-core/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>fleece</artifactId>
-    <groupId>org.apache.fleece</groupId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>fleece-core</artifactId>
-  <name>Fleece :: Core</name>
-
-  <properties>
-    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-  </properties>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/BufferStrategy.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/BufferStrategy.java b/fleece-core/src/main/java/org/apache/fleece/core/BufferStrategy.java
deleted file mode 100644
index e80dd91..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/BufferStrategy.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-public enum BufferStrategy {
-    BY_INSTANCE {
-        @Override
-        public BufferProvider<char[]> newCharProvider(final int size) {
-            return new CharBufferByInstanceProvider(size);
-        }
-
-        @Override
-        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
-            return new StringBuilderByInstanceProvider(size);
-        }
-    },
-    THREAD_LOCAL {
-        @Override
-        public BufferProvider<char[]> newCharProvider(final int size) {
-            return new CharBufferThreadLocalProvider(size);
-        }
-
-        @Override
-        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
-            return new StringBuilderThreadLocalProvider(size);
-        }
-    },
-    QUEUE {
-        @Override
-        public BufferProvider<char[]> newCharProvider(final int size) {
-            return new CharBufferQueueProvider(size);
-        }
-
-        @Override
-        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
-            return new StringBuilderQueueProvider(size);
-        }
-    },
-    SINGLETON {
-        @Override
-        public BufferProvider<char[]> newCharProvider(final int size) {
-            return new CharBufferSingletonProvider(size);
-        }
-
-        @Override
-        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
-            return new StringBuilderSingletonProvider(size);
-        }
-    };
-
-    public abstract BufferProvider<char[]> newCharProvider(int size);
-    public abstract BufferProvider<StringBuilder> newStringBuilderProvider(int size);
-
-    public static interface BufferProvider<T> extends Serializable {
-        T newBuffer();
-
-        void release(T value);
-    }
-
-    private static class CharBufferSingletonProvider extends SingletonProvider<char[]> {
-        public CharBufferSingletonProvider(final int size) {
-            super(size);
-        }
-
-        @Override
-        protected char[] newInstance(int size) {
-            return new char[size];
-        }
-
-        @Override
-        public void release(final char[] value) {
-            // no-op
-        }
-    }
-
-    private static class StringBuilderSingletonProvider extends SingletonProvider<StringBuilder> {
-        public StringBuilderSingletonProvider(final int size) {
-            super(size);
-        }
-
-        @Override
-        protected StringBuilder newInstance(final int size) {
-            return new StringBuilder(size);
-        }
-
-        @Override
-        public void release(final StringBuilder value) {
-            value.setLength(0);
-        }
-    }
-
-    private static abstract class SingletonProvider<T> implements BufferProvider<T> {
-        protected final T buffer;
-
-        public SingletonProvider(final int size) {
-            buffer = newInstance(size);
-        }
-
-        protected abstract T newInstance(int size);
-
-        @Override
-        public T newBuffer() {
-            return buffer;
-        }
-
-        @Override
-        public void release(final T value) {
-            // no-op
-        }
-    }
-
-    private static abstract class ThreadLocalProvider<T> implements BufferProvider<T> {
-        private final ThreadLocalBufferCache<T> cache;
-
-        public ThreadLocalProvider(final int size) {
-            cache = new ThreadLocalBufferCache<T>(size) {
-                @Override
-                protected T newValue(int defaultSize) {
-                    return newInstance(size);
-                }
-            };
-        }
-
-        protected abstract T newInstance(int size);
-
-        @Override
-        public T newBuffer() {
-            return cache.getCache();
-        }
-
-        @Override
-        public void release(final T value) {
-            cache.release(value);
-        }
-    }
-
-    private static class CharBufferThreadLocalProvider extends ThreadLocalProvider<char[]> {
-        public CharBufferThreadLocalProvider(int size) {
-            super(size);
-        }
-
-        @Override
-        protected char[] newInstance(final int size) {
-            return new char[size];
-        }
-    }
-
-    private static class StringBuilderThreadLocalProvider extends ThreadLocalProvider<StringBuilder> {
-        public StringBuilderThreadLocalProvider(int size) {
-            super(size);
-        }
-
-        @Override
-        protected StringBuilder newInstance(final int size) {
-            return new StringBuilder(size);
-        }
-
-        @Override
-        public void release(final StringBuilder value) {
-            value.setLength(0);
-            super.release(value);
-        }
-    }
-
-    private static class CharBufferByInstanceProvider implements BufferProvider<char[]> {
-        private final int size;
-
-        public CharBufferByInstanceProvider(final int size) {
-            this.size = size;
-        }
-
-        @Override
-        public char[] newBuffer() {
-            return new char[size];
-        }
-
-        @Override
-        public void release(final char[] value) {
-            // no-op
-        }
-    }
-
-    private static class StringBuilderByInstanceProvider implements BufferProvider<StringBuilder> {
-        private final int size;
-
-        public StringBuilderByInstanceProvider(final int size) {
-            this.size = size;
-        }
-
-        @Override
-        public StringBuilder newBuffer() {
-            return new StringBuilder(size);
-        }
-
-        @Override
-        public void release(final StringBuilder value) {
-            // no-op
-        }
-    }
-
-    private static abstract class QueueProvider<T> implements BufferProvider<T> {
-        private final int size;
-        private final ConcurrentLinkedQueue<T> queue = new ConcurrentLinkedQueue<T>();
-
-        public QueueProvider(final int size) {
-            this.size = size;
-        }
-
-        protected abstract T newInstance(int size);
-
-        @Override
-        public T newBuffer() {
-            final T buffer = queue.poll();
-            if (buffer == null) {
-                return newInstance(size);
-            }
-            return buffer;
-        }
-
-        @Override
-        public void release(final T value) {
-            queue.offer(value);
-        }
-    }
-
-    private static class CharBufferQueueProvider extends QueueProvider<char[]> {
-        public CharBufferQueueProvider(final int size) {
-            super(size);
-        }
-
-        @Override
-        protected char[] newInstance(int size) {
-            return new char[size];
-        }
-    }
-
-    private static class StringBuilderQueueProvider extends QueueProvider<StringBuilder> {
-        public StringBuilderQueueProvider(final int size) {
-            super(size);
-        }
-
-        @Override
-        protected StringBuilder newInstance(int size) {
-            return new StringBuilder(size);
-        }
-
-        @Override
-        public void release(final StringBuilder value) {
-            value.setLength(0);
-            super.release(value);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayBuilderImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayBuilderImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayBuilderImpl.java
deleted file mode 100644
index a92eede..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayBuilderImpl.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-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;
-
-    @Override
-    public JsonArrayBuilder add(final JsonValue value) {
-        addValue(value);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final String value) {
-        addValue(new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final BigDecimal value) {
-        addValue(new JsonNumberImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final BigInteger value) {
-        addValue(new JsonNumberImpl(new BigDecimal(value)));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final int value) {
-        addValue(new JsonLongImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final long value) {
-        addValue(new JsonLongImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final double value) {
-        addValue(new JsonDoubleImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final boolean value) {
-        addValue(value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder addNull() {
-        addValue(JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final JsonObjectBuilder builder) {
-        addValue(builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(final JsonArrayBuilder builder) {
-        addValue(builder.build());
-        return this;
-    }
-    
-    private void addValue(JsonValue value){
-        if (value == null) {
-            throw npe();
-        }
-        
-        if(tmpList==null){
-            tmpList=new ArrayList<JsonValue>();
-        }
-        
-        tmpList.add(value);
-    }
-
-    @Override
-    public JsonArray build() {
-        
-        if(tmpList == null) {
-            return new JsonArrayImpl(Collections.EMPTY_LIST);
-        } else {
-            List<JsonValue> dump = (Collections.unmodifiableList(tmpList));
-            tmpList=null;
-            return new JsonArrayImpl(dump);
-        }
-        
-    }
-
-    private static NullPointerException npe() {
-        throw new NullPointerException("value/builder must not be null");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayImpl.java
deleted file mode 100644
index fa1e230..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonArrayImpl.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * 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.fleece.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;
-
-class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serializable {
-    private Integer hashCode = null;
-    private final List<JsonValue> unmodifieableBackingList;
-
-    JsonArrayImpl(List<JsonValue> backingList) {
-        super();
-        this.unmodifieableBackingList = backingList;
-    }
-
-
-
-    private <T> T value(final int idx, final Class<T> type) {
-        if (idx > unmodifieableBackingList.size()) {
-            throw new IndexOutOfBoundsException(idx + "/" + unmodifieableBackingList.size());
-        }
-        return type.cast(unmodifieableBackingList.get(idx));
-    }
-    
-    
-
-    @Override
-    public JsonObject getJsonObject(final int index) {
-        return value(index, JsonObject.class);
-    }
-
-    @Override
-    public JsonArray getJsonArray(final int index) {
-        return value(index, JsonArray.class);
-    }
-
-    @Override
-    public JsonNumber getJsonNumber(final int index) {
-        return value(index, JsonNumber.class);
-    }
-
-    @Override
-    public JsonString getJsonString(final int index) {
-        return value(index, JsonString.class);
-    }
-
-    @Override
-    public <T extends JsonValue> List<T> getValuesAs(final Class<T> clazz) {
-        return (List<T>) unmodifieableBackingList;
-    }
-
-    @Override
-    public String getString(final int index) {
-        return value(index, JsonString.class).getString();
-    }
-
-    @Override
-    public String getString(final int index, final String defaultValue) {
-        try {
-            return getString(index);
-        } catch (final IndexOutOfBoundsException ioobe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public int getInt(final int index) {
-        return value(index, JsonNumber.class).intValue();
-    }
-
-    @Override
-    public int getInt(final int index, final int defaultValue) {
-        try {
-            return getInt(index);
-        } catch (final IndexOutOfBoundsException ioobe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public boolean getBoolean(final int index) {
-        return value(index, JsonValue.class) == JsonValue.TRUE;
-    }
-
-    @Override
-    public boolean getBoolean(final int index, final boolean defaultValue) {
-        try {
-            return getBoolean(index);
-        } catch (final IndexOutOfBoundsException ioobe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public boolean isNull(final int index) {
-        return value(index, JsonValue.class) == JsonValue.NULL;
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.ARRAY;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder("[");
-        final Iterator<JsonValue> it = unmodifieableBackingList.iterator();
-        boolean hasNext = it.hasNext();
-        while (hasNext) {
-            final JsonValue jsonValue = it.next();
-            if (JsonString.class.isInstance(jsonValue)) {
-                builder.append(jsonValue.toString());
-            } else {
-                builder.append(jsonValue != JsonValue.NULL ? jsonValue.toString() : JsonChars.NULL);
-            }
-            hasNext = it.hasNext();
-            if (hasNext) {
-                builder.append(",");
-            }
-        }
-        return builder.append(']').toString();
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonArrayImpl.class.isInstance(obj) && unmodifieableBackingList.equals(JsonArrayImpl.class.cast(obj).unmodifieableBackingList);
-    }
-
-    
-    @Override
-    public int hashCode() {
-        Integer h=hashCode;
-        if (h == null) {
-            h = unmodifieableBackingList.hashCode();
-            h=hashCode;
-        }
-        return h;
-    }
-
-    @Override
-    public JsonValue get(int index) {
-        return unmodifieableBackingList.get(index);
-    }
-
-    @Override
-    public int size() {
-        return unmodifieableBackingList.size();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonBuilderFactoryImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonBuilderFactoryImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonBuilderFactoryImpl.java
deleted file mode 100644
index 76b0455..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonBuilderFactoryImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonBuilderFactory;
-import javax.json.JsonObjectBuilder;
-
-class JsonBuilderFactoryImpl implements JsonBuilderFactory {
-    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
-    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-    //nothing yet
-
-    };
-
-    JsonBuilderFactoryImpl(final Map<String, ?> config) {
-        if (config != null) {
-
-            for (final String configKey : SUPPORTED_CONFIG_KEYS) {
-                if (config.containsKey(configKey)) {
-                    internalConfig.put(configKey, config.get(configKey));
-                }
-            }
-        }
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return new JsonObjectBuilderImpl();
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return new JsonArrayBuilderImpl();
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return Collections.unmodifiableMap(internalConfig);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonChars.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonChars.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonChars.java
deleted file mode 100644
index b135886..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonChars.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.fleece.core;
-
-import javax.json.stream.JsonParser.Event;
-
-public interface JsonChars {
-    char EOF = Character.MIN_VALUE;
-
-    char START_OBJECT_CHAR = '{';
-    char END_OBJECT_CHAR = '}';
-    char START_ARRAY_CHAR = '[';
-    char END_ARRAY_CHAR = ']';
-    char QUOTE_CHAR = '"';
-    char COMMA_CHAR = ',';
-    char KEY_SEPARATOR = ':';
-    
-    char EOL = '\n';
-    char SPACE = ' ';
-    
-    char TRUE_T = 't';
-    char TRUE_R = 'r';
-    char TRUE_U = 'u';
-    char TRUE_E = 'e';
-    char FALSE_F = 'f';
-    char FALSE_A = 'a';
-    char FALSE_L = 'l';
-    char FALSE_S = 's';
-    char FALSE_E = 'e';
-    char NULL_N = 'n';
-    char NULL_U = 'u';
-    char NULL_L = 'l';
- 
-    char ZERO = '0';
-    char NINE = '9';
-    char DOT = '.';
-    char MINUS = '-';
-    char PLUS = '+';
-    char EXP_LOWERCASE = 'e';
-    char EXP_UPPERCASE = 'E';
-    char ESCAPE_CHAR = '\\';
-    
-    char TAB = '\t';
-    char BACKSPACE = '\b';
-    char FORMFEED = '\f';
-    char CR = '\r';
-
-    String NULL = "null".intern();
-    
-    static final byte START_ARRAY = (byte) Event.START_ARRAY.ordinal();
-    static final byte START_OBJECT = (byte) Event.START_OBJECT.ordinal();
-    static final byte KEY_NAME=(byte) Event.KEY_NAME.ordinal();
-    static final byte VALUE_STRING=(byte) Event.VALUE_STRING.ordinal(); 
-    static final byte VALUE_NUMBER=(byte) Event.VALUE_NUMBER.ordinal(); 
-    static final byte VALUE_TRUE=(byte) Event.VALUE_TRUE.ordinal();
-    static final byte VALUE_FALSE=(byte) Event.VALUE_FALSE.ordinal(); 
-    static final byte VALUE_NULL=(byte) Event.VALUE_NULL.ordinal();
-    static final byte END_OBJECT=(byte) Event.END_OBJECT.ordinal();
-    static final byte END_ARRAY=(byte) Event.END_ARRAY.ordinal();
-    
-    static final byte COMMA_EVENT=Byte.MAX_VALUE;
-    static final byte KEY_SEPARATOR_EVENT=Byte.MIN_VALUE;
-    
-    static final Event[] EVT_MAP =Event.values();
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonDoubleImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonDoubleImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonDoubleImpl.java
deleted file mode 100644
index 4ff90f9..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonDoubleImpl.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.json.JsonNumber;
-
-final class JsonDoubleImpl implements JsonNumber {
-    private final double value;
-
-    JsonDoubleImpl(final double value) {
-        
-        if(Double.isInfinite(value) || Double.isNaN(value)) {
-            throw new NumberFormatException("double value must to be NaN or Infinite");
-        }
-        
-        this.value = value;
-    }
-
-    @Override
-    public boolean isIntegral() {
-        return false;
-    }
-
-    @Override
-    public int intValue() {
-        return (int) value;
-    }
-
-    @Override
-    public int intValueExact() {
-        return intValue();
-    }
-
-    @Override
-    public long longValue() {
-        return (long) value;
-    }
-
-    @Override
-    public long longValueExact() {
-        return (long) value;
-    }
-
-    @Override
-    public BigInteger bigIntegerValue() {
-        return new BigDecimal(toString()).toBigInteger();
-    }
-
-    @Override
-    public BigInteger bigIntegerValueExact() {
-        return new BigDecimal(toString()).toBigIntegerExact();
-    }
-
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    @Override
-    public BigDecimal bigDecimalValue() {
-        return new BigDecimal(toString());
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.NUMBER;
-    }
-
-    @Override
-    public String toString() {
-        return Double.toString(value);
-    }
-
-    @Override
-    public int hashCode() {
-        return Double.valueOf(value).hashCode();
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).doubleValue() == value;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorFactoryImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorFactoryImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorFactoryImpl.java
deleted file mode 100644
index 573ca70..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorFactoryImpl.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.json.stream.JsonGenerator;
-import javax.json.stream.JsonGeneratorFactory;
-
-public class JsonGeneratorFactoryImpl implements JsonGeneratorFactory, Serializable {    
-    public static final String BUFFER_LENGTH = "org.apache.fleece.default-char-buffer-generator";
-    public static final int DEFAULT_BUFFER_LENGTH = Integer.getInteger(BUFFER_LENGTH, 1024); //TODO check default string length/buffer size
-    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
-    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-        
-        JsonGenerator.PRETTY_PRINTING, BUFFER_LENGTH, JsonParserFactoryImpl.BUFFER_STRATEGY 
-        
-    };
-    //key caching currently disabled
-    private final ConcurrentMap<String, String> cache = null;//new ConcurrentHashMap<String, String>();
-    private final boolean pretty;
-    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
-
-    public JsonGeneratorFactoryImpl(final Map<String, ?> config) {
-        
-          if(config != null) {
-          
-              for (String configKey : SUPPORTED_CONFIG_KEYS) {
-                  if(config.containsKey(configKey)) {
-                      internalConfig.put(configKey, config.get(configKey));
-                  }
-              }
-          } 
-
-          if(internalConfig.containsKey(JsonGenerator.PRETTY_PRINTING)) {
-              this.pretty = Boolean.TRUE.equals(internalConfig.get(JsonGenerator.PRETTY_PRINTING)) || "true".equals(internalConfig.get(JsonGenerator.PRETTY_PRINTING));
-          } else {
-              this.pretty = false;
-          }
-          
-          final int bufferSize = getInt(BUFFER_LENGTH);
-          if (bufferSize <= 0) {
-              throw new IllegalArgumentException("buffer length must be greater than zero");
-          }
-
-          this.bufferProvider = getBufferProvider().newCharProvider(bufferSize);
-    }
-    
-    private BufferStrategy getBufferProvider() {
-        final Object name = internalConfig.get(JsonParserFactoryImpl.BUFFER_STRATEGY);
-        if (name != null) {
-            return BufferStrategy.valueOf(name.toString().toUpperCase(Locale.ENGLISH));
-        }
-        return BufferStrategy.QUEUE;
-    }
-
-    private int getInt(final String key) {
-        final Object maxStringSize = internalConfig.get(key);
-        if (maxStringSize == null) {
-            return DEFAULT_BUFFER_LENGTH;
-        } else if (Number.class.isInstance(maxStringSize)) {
-            return Number.class.cast(maxStringSize).intValue();
-        }
-        return Integer.parseInt(maxStringSize.toString());
-    }
-
-    @Override
-    public JsonGenerator createGenerator(final Writer writer) {
-        if (pretty) {
-            return new JsonPrettyGeneratorImpl(writer, bufferProvider, cache);
-        }
-        return new JsonGeneratorImpl(writer, bufferProvider, cache);
-    }
-
-   
-
-    @Override
-    public JsonGenerator createGenerator(final OutputStream out) {
-        if (pretty) {
-            return new JsonPrettyGeneratorImpl(out, bufferProvider, cache);
-        }
-        return new JsonGeneratorImpl(out, bufferProvider, cache);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(final OutputStream out, final Charset charset) {
-        if (pretty) {
-            return new JsonPrettyGeneratorImpl(out,charset, bufferProvider, cache);
-        }
-        return new JsonGeneratorImpl(out,charset, bufferProvider, cache);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return Collections.unmodifiableMap(internalConfig);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java
deleted file mode 100644
index a1d0a53..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonGeneratorImpl.java
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Serializable;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.charset.Charset;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.json.JsonArray;
-import javax.json.JsonException;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonString;
-import javax.json.JsonStructure;
-import javax.json.JsonValue;
-import javax.json.stream.JsonGenerationException;
-import javax.json.stream.JsonGenerator;
-
-class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
-    private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
-
-    private final Writer writer;
-    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
-    private final char[] buffer;
-    private int bufferPos = 0;
-    //private final ConcurrentMap<String, String> cache;
-    protected boolean needComma = false;
-
-    private StructureElement currentStructureElement = null;
-    private boolean valid = false;
-    protected int depth = 0;
-
-    //minimal stack implementation
-    private static final class StructureElement {
-        final StructureElement previous;
-        final boolean isArray;
-
-        StructureElement(final StructureElement previous, final boolean isArray) {
-            super();
-            this.previous = previous;
-            this.isArray = isArray;
-        }
-    }
-
-    JsonGeneratorImpl(final Writer writer, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache) {
-        this.writer = writer;
-        //this.cache = cache;
-        this.buffer = bufferProvider.newBuffer();
-        this.bufferProvider = bufferProvider;
-    }
-
-    JsonGeneratorImpl(final OutputStream out, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache) {
-        this(new OutputStreamWriter(out, UTF8_CHARSET), bufferProvider, cache);
-    }
-
-    JsonGeneratorImpl(final OutputStream out, final Charset encoding, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache) {
-        this(new OutputStreamWriter(out, encoding), bufferProvider, cache);
-    }
-
-    protected void addCommaIfNeeded() {
-        if (needComma) {
-            justWrite(COMMA_CHAR);
-            needComma = false;
-        }
-
-    }
-
-    //caching currently disabled
-    //two problems:
-    // 1) not easy to get the escaped value efficiently wen its streamed and the buffer is full and needs to be flushed
-    // 2) we have to use a kind of bounded threadsafe map to let the cache not grow indefinitely
-    private void writeCachedOrEscape(final String name) {
-      /*  String k = cache.get(name);
-        
-        if (k == null) {
-                
-                justWrite(QUOTE_CHAR);
-                int start = bufferPos;
-                writeEscaped0(name);
-                int end = bufferPos;
-                String escaped= get from buffer
-                ---
-                //FIXME if buffer is flushed this will not work here
-                cache.putIfAbsent(name, escaped);
-                justWrite(QUOTE_CHAR);
-                justWrite(KEY_SEPARATOR);
-        }else*/
-        {
-            justWrite(QUOTE_CHAR);
-            writeEscaped0(name);
-            justWrite(QUOTE_CHAR);
-            justWrite(KEY_SEPARATOR);
-        }
-
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-
-        if (currentStructureElement == null && valid) {
-            throw new JsonGenerationException("Method must not be called more than once in no context");
-        }
-
-        if (currentStructureElement != null && !currentStructureElement.isArray) {
-            throw new JsonGenerationException("Method must not be called within an object context");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, false);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
-            currentStructureElement = localStructureElement;
-        }
-
-        if (!valid) {
-            valid = true;
-        }
-
-        noCheckWrite(START_OBJECT_CHAR);
-        depth++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(final String name) {
-        if (currentStructureElement == null || currentStructureElement.isArray) {
-            throw new JsonGenerationException("Method must not be called within an array context");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, false);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
-            currentStructureElement = localStructureElement;
-        }
-
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWrite(START_OBJECT_CHAR);
-        depth++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        if (currentStructureElement == null && valid) {
-            throw new JsonGenerationException("Method must not be called more than once in no context");
-        }
-
-        if (currentStructureElement != null && !currentStructureElement.isArray) {
-            throw new JsonGenerationException("Method must not be called within an object context");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, true);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
-            currentStructureElement = localStructureElement;
-        }
-
-        if (!valid) {
-            valid = true;
-        }
-
-        noCheckWrite(START_ARRAY_CHAR);
-        depth++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(final String name) {
-        if (currentStructureElement == null || currentStructureElement.isArray) {
-            throw new JsonGenerationException("Method must not be called within an array context");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, true);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
-            currentStructureElement = localStructureElement;
-        }
-
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWrite(START_ARRAY_CHAR);
-        depth++;
-        return this;
-    }
-
-    private void writeJsonValue(final String name, final JsonValue value) {
-        if (currentStructureElement != null) {
-            checkObject();
-        }
-        //TODO check null handling
-        switch (value.getValueType()) {
-            case ARRAY:
-                writeStartArray(name);
-                final JsonArray array = JsonArray.class.cast(value);
-                final Iterator<JsonValue> ait = array.iterator();
-                while (ait.hasNext()) {
-                    write(ait.next());
-                }
-                writeEnd();
-
-                break;
-            case OBJECT:
-                writeStartObject(name);
-                final JsonObject object = JsonObject.class.cast(value);
-                final Iterator<Map.Entry<String, JsonValue>> oit = object.entrySet().iterator();
-                while (oit.hasNext()) {
-                    final Map.Entry<String, JsonValue> keyval = oit.next();
-                    write(keyval.getKey(), keyval.getValue());
-                }
-                writeEnd();
-
-                break;
-            case STRING:
-                write(name, JsonString.class.cast(value).getString());
-                break;
-            case NUMBER:
-                //TODO optimize
-                final JsonNumber number = JsonNumber.class.cast(value);
-                if (number.isIntegral()) {
-                    write(name, number.longValueExact());
-                } else {
-                    write(name, number.bigDecimalValue());
-                }
-                break;
-            case TRUE:
-                write(name, true);
-                break;
-            case FALSE:
-                write(name, false);
-                break;
-            case NULL:
-                writeNull(name);
-                break;
-            default:
-                throw new JsonGenerationException("Unknown JsonValue type");
-        }
-    }
-
-    private void writeJsonValue(final JsonValue value) {
-        if (currentStructureElement != null) {
-            checkArray();
-        }
-        //TODO check null handling
-        switch (value.getValueType()) {
-            case ARRAY:
-                writeStartArray();
-                final JsonArray array = JsonArray.class.cast(value);
-                final Iterator<JsonValue> ait = array.iterator();
-                while (ait.hasNext()) {
-                    write(ait.next());
-                }
-                writeEnd();
-
-                break;
-            case OBJECT:
-                writeStartObject();
-                final JsonObject object = JsonObject.class.cast(value);
-                final Iterator<Map.Entry<String, JsonValue>> oit = object.entrySet().iterator();
-                while (oit.hasNext()) {
-                    final Map.Entry<String, JsonValue> keyval = oit.next();
-                    write(keyval.getKey(), keyval.getValue());
-                }
-                writeEnd();
-
-                break;
-            case STRING:
-                write(JsonString.class.cast(value).getString());
-                break;
-            case NUMBER:
-                //TODO optimize
-                final JsonNumber number = JsonNumber.class.cast(value);
-                if (number.isIntegral()) {
-                    write(number.longValueExact());
-                } else {
-                    write(number.bigDecimalValue());
-                }
-                break;
-            case TRUE:
-                write(true);
-                break;
-            case FALSE:
-                write(false);
-                break;
-            case NULL:
-                writeNull();
-                break;
-            default:
-                throw new JsonGenerationException("Unknown JsonValue type");
-        }
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final JsonValue value) {
-        writeJsonValue(name, value);
-        return this;
-    }
-
-
-    @Override
-    public JsonGenerator write(final String name, final String value) {
-        checkObject();
-
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-
-        addCommaIfNeeded();
-        justWrite(QUOTE_CHAR);
-        writeEscaped0(value);
-        justWrite(QUOTE_CHAR);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final BigInteger value) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWriteAndForceComma(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final BigDecimal value) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWriteAndForceComma(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final int value) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        addCommaIfNeeded();
-        writeInt0(value);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final long value) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        addCommaIfNeeded();
-        writeLong0(value);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final double value) {
-        checkObject();
-        checkDoubleRange(value);
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWriteAndForceComma(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final boolean value) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWriteAndForceComma(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull(final String name) {
-        checkObject();
-        addCommaIfNeeded();
-        writeCachedOrEscape(name);
-        noCheckWriteAndForceComma(NULL);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        if (currentStructureElement == null) {
-            throw new JsonGenerationException("Method must not be called in no context");
-        }
-
-        writeEnd(currentStructureElement.isArray ? END_ARRAY_CHAR : END_OBJECT_CHAR);
-
-        //pop from stack
-        currentStructureElement = currentStructureElement.previous;
-        depth--;
-
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final JsonValue value) {
-        writeJsonValue(value);
-
-        if (JsonStructure.class.isInstance(value)) {
-            valid = true;
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final String value) {
-        checkArray();
-        addCommaIfNeeded();
-        justWrite(QUOTE_CHAR);
-        writeEscaped0(value);
-        justWrite(QUOTE_CHAR);
-        needComma = true;
-        return this;
-    }
-
-
-    @Override
-    public JsonGenerator write(final BigDecimal value) {
-        checkArray();
-        noCheckWrite(String.valueOf(value));
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final BigInteger value) {
-        checkArray();
-        noCheckWrite(String.valueOf(value));
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final int value) {
-        checkArray();
-        addCommaIfNeeded();
-        writeInt0(value);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final long value) {
-        checkArray();
-        addCommaIfNeeded();
-        writeLong0(value);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final double value) {
-        checkArray();
-        checkDoubleRange(value);
-        noCheckWrite(Double.toString(value));
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(final boolean value) {
-        checkArray();
-        noCheckWrite(Boolean.toString(value));
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        checkArray();
-        noCheckWriteAndForceComma(NULL);
-        needComma = true;
-        return this;
-    }
-
-    @Override
-    public void close() {
-
-        try {
-            if (currentStructureElement != null || !valid) {
-
-                throw new JsonGenerationException("Invalid json " + currentStructureElement + " " + valid);
-            }
-        } finally {
-
-            flushBuffer();
-
-            try {
-                writer.close();
-            } catch (final IOException e) {
-                throw new JsonException(e.getMessage(), e);
-            }
-
-            bufferProvider.release(buffer);
-        }
-    }
-
-    @Override
-    public void flush() {
-
-        flushBuffer();
-
-        try {
-            writer.flush();
-        } catch (final IOException e) {
-            throw new JsonException(e.getMessage(), e);
-        }
-    }
-
-    private JsonGenerator noCheckWriteAndForceComma(final String value) {
-        noCheckWrite(value);
-        needComma = true;
-        return this;
-    }
-
-    protected JsonGenerator writeEnd(final char value) {
-        justWrite(value);
-        needComma = true;
-        return this;
-    }
-
-    protected void noCheckWrite(final String value) {
-        addCommaIfNeeded();
-        justWrite(value);
-    }
-
-    protected void noCheckWrite(final char value) {
-        addCommaIfNeeded();
-        justWrite(value);
-    }
-
-    private void flushBuffer() {
-
-        if (bufferPos > 0) {
-
-            try {
-                writer.write(buffer, 0, bufferPos);
-                bufferPos = 0;
-            } catch (final IOException e) {
-                throw new JsonException(e.getMessage(), e);
-            }
-
-        }
-    }
-
-    private void writeEscaped0(final String value) {
-        int len = 0;
-        if (value == null || (len = value.length()) == 0) {
-            return;
-        }
-
-        for (int i = 0; i < value.length(); i++) {
-            char c = value.charAt(i);
-
-            while (c != ESCAPE_CHAR && c != QUOTE_CHAR && c >= SPACE) {
-                
-                //read fast
-                justWrite(c);
-
-                if (i >= len - 1) {
-                    return;
-                }
-
-                i++;
-                c = value.charAt(i);
-            }
-
-            switch (c) {
-                case QUOTE_CHAR:
-                case ESCAPE_CHAR:
-                    justWrite(ESCAPE_CHAR);
-                    justWrite(c);
-                    break;
-                default:
-                    if (c < SPACE) {
-                        switch (c) {
-                            case EOL:
-                                justWrite("\\n");
-                                break;
-                            case '\r':
-                                justWrite("\\r");
-                                break;
-                            case '\t':
-                                justWrite("\\t");
-                                break;
-                            case '\b':
-                                justWrite("\\b");
-                                break;
-                            case '\f':
-                                justWrite("\\f");
-                                break;
-                            default:
-                                justWrite(toUnicode(c));
-                        }
-                    } else if ((c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) {
-                        justWrite(toUnicode(c));
-                    } else {
-                        justWrite(c);
-                    }
-            }
-        }
-
-    }
-
-    private static final String UNICODE_PREFIX = "\\u";
-    private static final String UNICODE_PREFIX_HELPER = "000";
-
-    private static String toUnicode(final char c) {
-
-        final String hex = UNICODE_PREFIX_HELPER + Integer.toHexString(c);
-        final String s = UNICODE_PREFIX + hex.substring(hex.length() - 4);
-
-        return s;
-    }
-
-    protected void justWrite(final char[] chars) {
-
-        if (bufferPos + chars.length >= buffer.length) {
-
-            int start = 0;
-            int len = buffer.length - bufferPos;
-
-            while (true) {
-                int end = start + len;
-                if (end > chars.length) {
-                    end = chars.length;
-                }
-
-                System.arraycopy(chars, start, buffer, bufferPos, end - start);
-
-                bufferPos += (end - start);
-                start += (len);
-
-                if (start >= chars.length) {
-                    return;
-                }
-
-                if (bufferPos >= buffer.length) {
-                    flushBuffer();
-                    len = buffer.length;
-                }
-
-            }
-
-        } else {
-            //fits completely into the buffer
-            System.arraycopy(chars, 0, buffer, bufferPos, chars.length);
-            bufferPos += chars.length;
-        }
-
-    }
-
-    protected void justWrite(final String value) {
-        final int valueLength = value.length();
-
-        if (bufferPos + valueLength >= buffer.length) {
-
-            int start = 0;
-            int len = buffer.length - bufferPos;
-
-            while (true) {
-                int end = start + len;
-                if (end > valueLength) {
-                    end = valueLength;
-                }
-
-                value.getChars(start, end, buffer, bufferPos);
-
-                bufferPos += (end - start);
-                start += (len);
-
-                if (start >= valueLength) {
-                    return;
-                }
-
-                if (bufferPos >= buffer.length) {
-                    flushBuffer();
-                    len = buffer.length;
-                }
-
-            }
-
-        } else {
-            //fits completely into the buffer
-            value.getChars(0, valueLength, buffer, bufferPos);
-            bufferPos += valueLength;
-        }
-
-    }
-
-    protected void justWrite(final char value) {
-
-        if (bufferPos >= buffer.length) {
-            flushBuffer();
-        }
-
-        buffer[bufferPos++] = value;
-
-    }
-    
-    private void checkObject() {
-        if (currentStructureElement == null || currentStructureElement.isArray) {
-            throw new JsonGenerationException("write(name, param) is only valid in objects");
-        }
-    }
-
-    private void checkArray() {
-        if (currentStructureElement == null || !currentStructureElement.isArray) {
-            throw new JsonGenerationException("write(param) is only valid in arrays");
-        }
-    }
-
-    private static void checkDoubleRange(final double value) {
-        if (Double.isInfinite(value) || Double.isNaN(value)) {
-            throw new NumberFormatException("double can't be infinite or NaN");
-        }
-    }
-    
-    
-    //unopitimized, see below
-    private void writeLong0(final long i) {
-
-        justWrite(String.valueOf(i));
-    }
-
-    //unopitimized, see below
-    private void writeInt0(final int i) {
-
-        justWrite(String.valueOf(i));
-    }
-    
-    //optimized number optimizations
-/*
-    private void writeLong0(final long i) {
-        if (i == Long.MIN_VALUE) {
-            justWrite("-9223372036854775808");
-            return;
-        }
-        final int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
-        final char[] buf = new char[size];
-        getChars(i, size, buf);
-        justWrite(buf);
-    }
-
-    private void writeInt0(final int i) {
-        if (i == Integer.MIN_VALUE) {
-            justWrite("-2147483648");
-            return;
-        }
-        final int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
-        final char[] buf = new char[size];
-        getChars(i, size, buf);
-        justWrite(buf);
-    }
-
-    private final static char[] DIGIT_TENS = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1',
-            '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4',
-            '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6',
-            '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9',
-            '9', '9', '9', '9', '9', '9', '9', };
-
-    private final static char[] DIGIT_ONES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
-            '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2',
-            '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
-            '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2',
-            '3', '4', '5', '6', '7', '8', '9', };
-
-    private final static char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
-            'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
-
-    // Requires positive x
-    private static int stringSize(final long x) {
-        long p = 10;
-        for (int i = 1; i < 19; i++) {
-            if (x < p) {
-                return i;
-            }
-            p = 10 * p;
-        }
-        return 19;
-    }
-
-    private static void getChars(long i, final int index, final char[] buf) {
-        long q;
-        int r;
-        int charPos = index;
-        char sign = 0;
-
-        if (i < 0) {
-            sign = '-';
-            i = -i;
-        }
-
-        // Get 2 digits/iteration using longs until quotient fits into an int
-        while (i > Integer.MAX_VALUE) {
-            q = i / 100;
-            // really: r = i - (q * 100);
-            r = (int) (i - ((q << 6) + (q << 5) + (q << 2)));
-            i = q;
-            buf[--charPos] = DIGIT_ONES[r];
-            buf[--charPos] = DIGIT_TENS[r];
-        }
-
-        // Get 2 digits/iteration using ints
-        int q2;
-        int i2 = (int) i;
-        while (i2 >= 65536) {
-            q2 = i2 / 100;
-            // really: r = i2 - (q * 100);
-            r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
-            i2 = q2;
-            buf[--charPos] = DIGIT_ONES[r];
-            buf[--charPos] = DIGIT_TENS[r];
-        }
-
-        // Fall thru to fast mode for smaller numbers
-        // assert(i2 <= 65536, i2);
-        for (;;) {
-            q2 = (i2 * 52429) >>> (16 + 3);
-            r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ...
-            buf[--charPos] = DIGITS[r];
-            i2 = q2;
-            if (i2 == 0) {
-                break;
-            }
-        }
-        if (sign != 0) {
-            buf[--charPos] = sign;
-        }
-    }
-*/
-   
-}


[04/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/large_130kb.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/large_130kb.json b/johnzon-core/src/test/resources/bench/large_130kb.json
new file mode 100644
index 0000000..3eb3a85
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/large_130kb.json
@@ -0,0 +1,4328 @@
+[
+  {
+    "id": 0,
+    "guid": "31119a68-58dd-43ec-81d2-2be927f5b445",
+    "isActive": true,
+    "balance": "$2,882.15",
+    "picture": "http://placehold.it/32x32",
+    "age": 28,
+    "eyeColor": "blue",
+    "name": "Rojas Harrington",
+    "gender": "male",
+    "company": "YOGASM",
+    "address": "706 Louisiana Avenue, Suitland, California, 7975",
+    "about": "Tempor eiusmod eu in amet sit occaecat occaecat velit officia sint duis. Ullamco voluptate labore in officia pariatur in ipsum exercitation. Ea nostrud proident aute ad irure mollit. Consectetur veniam dolore dolor commodo laborum consequat veniam labore adipisicing. Do in laboris est exercitation excepteur duis et. Officia consequat labore ullamco excepteur dolore commodo occaecat excepteur qui aliqua Lorem.\r\n",
+    "registered": "2014-02-21T20:14:18 -01:00",
+    "latitude": 39.444802,
+    "longitude": 96.053443,
+    "tags": [
+      "ut",
+      "nulla",
+      "esse",
+      "cillum",
+      "quis",
+      "nulla",
+      "enim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Richmond Wagner"
+      },
+      {
+        "id": 1,
+        "name": "Minerva Leach"
+      },
+      {
+        "id": 2,
+        "name": "Head Washington"
+      }
+    ],
+    "greeting": "Hello, Rojas Harrington! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 1,
+    "guid": "707b227a-077c-41d7-9adc-609810e6694c",
+    "isActive": true,
+    "balance": "$1,457.81",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "green",
+    "name": "Beasley Allen",
+    "gender": "male",
+    "company": "MITROC",
+    "address": "375 Holmes Lane, Layhill, Louisiana, 797",
+    "about": "Excepteur incididunt dolor anim commodo nulla nostrud consectetur consectetur non sunt consectetur elit tempor. Esse do ut ex consectetur sint sit duis dolor ipsum ullamco pariatur. Excepteur ex irure ex exercitation minim ut veniam Lorem amet. Quis sunt ea pariatur eu. Fugiat ea qui exercitation irure. Cupidatat qui officia nulla enim nulla magna veniam cillum do voluptate officia aliqua aute tempor. Qui in laborum adipisicing mollit Lorem reprehenderit ipsum adipisicing laborum qui duis sit occaecat voluptate.\r\n",
+    "registered": "2014-02-10T19:55:02 -01:00",
+    "latitude": -29.903714,
+    "longitude": 81.686263,
+    "tags": [
+      "non",
+      "cillum",
+      "amet",
+      "ad",
+      "aute",
+      "consectetur",
+      "aliqua"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Erickson Buckley"
+      },
+      {
+        "id": 1,
+        "name": "Letha Nash"
+      },
+      {
+        "id": 2,
+        "name": "Marci Watkins"
+      }
+    ],
+    "greeting": "Hello, Beasley Allen! You have 10 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 2,
+    "guid": "524066d5-0a9d-40c7-ae51-68c4f8ba2e69",
+    "isActive": true,
+    "balance": "$3,080.99",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "green",
+    "name": "Tracey Barber",
+    "gender": "female",
+    "company": "CONJURICA",
+    "address": "259 Dewitt Avenue, Dixie, Alaska, 162",
+    "about": "Occaecat est dolor voluptate proident ad ea minim. Est non laborum aute quis excepteur ad minim veniam eiusmod nulla. Adipisicing laborum minim nostrud cillum sit. Sunt minim fugiat consequat veniam eiusmod irure nostrud eu dolore est nulla. Quis nisi labore duis consectetur irure irure est aliqua fugiat elit. Exercitation ullamco in nisi adipisicing consequat.\r\n",
+    "registered": "2014-05-03T15:37:06 -02:00",
+    "latitude": -3.77466,
+    "longitude": -71.850697,
+    "tags": [
+      "enim",
+      "veniam",
+      "sit",
+      "in",
+      "irure",
+      "fugiat",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lee Johns"
+      },
+      {
+        "id": 1,
+        "name": "Sadie Sweeney"
+      },
+      {
+        "id": 2,
+        "name": "Craft Gaines"
+      }
+    ],
+    "greeting": "Hello, Tracey Barber! You have 3 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 3,
+    "guid": "6ce5f0c0-e1a6-4947-8927-05323f362178",
+    "isActive": false,
+    "balance": "$2,566.68",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Ewing Lott",
+    "gender": "male",
+    "company": "BIFLEX",
+    "address": "894 Kiely Place, Callaghan, Northern Mariana Islands, 5864",
+    "about": "Veniam laboris aliquip labore anim do exercitation sunt eu. Nostrud dolor commodo qui incididunt deserunt mollit fugiat minim irure est do veniam consequat. Aute excepteur cupidatat excepteur quis velit ea veniam duis. Incididunt magna cupidatat deserunt do. Velit elit ullamco ullamco pariatur ipsum. Pariatur incididunt eiusmod labore deserunt laborum eiusmod excepteur ipsum. Eiusmod laboris voluptate qui minim irure aliqua laboris consectetur dolor id anim enim proident.\r\n",
+    "registered": "2014-01-26T06:05:59 -01:00",
+    "latitude": -69.732288,
+    "longitude": -7.580134,
+    "tags": [
+      "occaecat",
+      "labore",
+      "pariatur",
+      "tempor",
+      "proident",
+      "consequat",
+      "nostrud"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "West Wiley"
+      },
+      {
+        "id": 1,
+        "name": "Cervantes Reed"
+      },
+      {
+        "id": 2,
+        "name": "Katelyn Nielsen"
+      }
+    ],
+    "greeting": "Hello, Ewing Lott! You have 8 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 4,
+    "guid": "9b83a401-3d6d-4ad4-8e97-5855417a0523",
+    "isActive": true,
+    "balance": "$3,818.75",
+    "picture": "http://placehold.it/32x32",
+    "age": 21,
+    "eyeColor": "green",
+    "name": "Patel Blankenship",
+    "gender": "male",
+    "company": "SOFTMICRO",
+    "address": "438 Brighton Court, Wacissa, Georgia, 8476",
+    "about": "Fugiat labore consequat cillum laboris anim. Aliqua nisi Lorem labore amet elit cillum anim occaecat irure cupidatat exercitation. Amet officia officia laboris cillum sit officia tempor quis esse eiusmod Lorem est. Pariatur ex consectetur cupidatat ut elit ipsum et. Quis sint anim sit dolor ad anim velit sunt ex laborum. Lorem dolor nisi ad non incididunt ullamco.\r\n",
+    "registered": "2014-02-10T21:41:29 -01:00",
+    "latitude": 11.17367,
+    "longitude": 113.960197,
+    "tags": [
+      "sint",
+      "reprehenderit",
+      "eu",
+      "veniam",
+      "aute",
+      "commodo",
+      "nisi"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Luella Holder"
+      },
+      {
+        "id": 1,
+        "name": "Bettie Morin"
+      },
+      {
+        "id": 2,
+        "name": "Morse Boyd"
+      }
+    ],
+    "greeting": "Hello, Patel Blankenship! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 5,
+    "guid": "c56196b1-b9e7-4bf1-8068-952da87c9d86",
+    "isActive": true,
+    "balance": "$3,819.38",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "blue",
+    "name": "Mcguire Barker",
+    "gender": "male",
+    "company": "NURALI",
+    "address": "153 Verona Street, Floriston, Pennsylvania, 5399",
+    "about": "Voluptate non irure id minim proident sit. In ullamco laborum exercitation excepteur commodo esse aliquip velit ipsum tempor nisi. Est ullamco ut est aute reprehenderit.\r\n",
+    "registered": "2014-03-18T10:54:27 -01:00",
+    "latitude": 77.996689,
+    "longitude": -44.938304,
+    "tags": [
+      "non",
+      "veniam",
+      "anim",
+      "nisi",
+      "excepteur",
+      "nisi",
+      "Lorem"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Patton Lester"
+      },
+      {
+        "id": 1,
+        "name": "Cathy Irwin"
+      },
+      {
+        "id": 2,
+        "name": "Dionne Glover"
+      }
+    ],
+    "greeting": "Hello, Mcguire Barker! You have 3 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 6,
+    "guid": "8420cdc7-d386-4f31-be3d-47b4e20d71e5",
+    "isActive": false,
+    "balance": "$2,031.14",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Erma Kim",
+    "gender": "female",
+    "company": "UNDERTAP",
+    "address": "136 Battery Avenue, Calverton, North Carolina, 9576",
+    "about": "Ea laboris ut mollit aute quis velit commodo Lorem in. Consequat aute in ad incididunt cupidatat ad do qui ad consectetur commodo pariatur est laborum. Esse et officia reprehenderit deserunt excepteur officia irure eu elit deserunt nisi sint. Duis dolor sunt deserunt nulla aliquip aute pariatur sunt aute aliquip. Ipsum mollit id sint minim culpa commodo incididunt aute est minim velit sunt labore sit.\r\n",
+    "registered": "2014-02-06T18:48:05 -01:00",
+    "latitude": -73.346179,
+    "longitude": 23.035911,
+    "tags": [
+      "magna",
+      "tempor",
+      "sit",
+      "cupidatat",
+      "sint",
+      "reprehenderit",
+      "voluptate"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Ollie Richard"
+      },
+      {
+        "id": 1,
+        "name": "Lydia Dawson"
+      },
+      {
+        "id": 2,
+        "name": "Mccoy Dickerson"
+      }
+    ],
+    "greeting": "Hello, Erma Kim! You have 8 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 7,
+    "guid": "d383c2e1-1db0-419b-ae25-010ab076b5b0",
+    "isActive": true,
+    "balance": "$1,641.47",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "green",
+    "name": "Ball Riggs",
+    "gender": "male",
+    "company": "ARTIQ",
+    "address": "290 Hyman Court, Norris, Texas, 5506",
+    "about": "Voluptate esse elit sunt exercitation. Amet enim sint mollit qui ex. Anim aute mollit officia elit enim. Officia incididunt et occaecat esse velit amet sunt sint minim. Consectetur occaecat commodo deserunt laboris reprehenderit irure sit laboris non non incididunt sunt est. Lorem magna anim dolor enim enim aliqua pariatur ex cupidatat enim ut anim aliquip tempor.\r\n",
+    "registered": "2014-02-02T08:03:27 -01:00",
+    "latitude": 13.969932,
+    "longitude": 52.716571,
+    "tags": [
+      "dolor",
+      "sint",
+      "occaecat",
+      "ipsum",
+      "elit",
+      "duis",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Jodie Anthony"
+      },
+      {
+        "id": 1,
+        "name": "Cooke Gilliam"
+      },
+      {
+        "id": 2,
+        "name": "Jimmie Pace"
+      }
+    ],
+    "greeting": "Hello, Ball Riggs! You have 8 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 8,
+    "guid": "b8e03355-2a1a-4c21-b2cc-30d88177e5c4",
+    "isActive": true,
+    "balance": "$1,184.70",
+    "picture": "http://placehold.it/32x32",
+    "age": 20,
+    "eyeColor": "brown",
+    "name": "Albert Franks",
+    "gender": "male",
+    "company": "NIPAZ",
+    "address": "612 Atlantic Avenue, Cazadero, Federated States Of Micronesia, 1512",
+    "about": "Fugiat veniam id eiusmod sit aliqua ut labore culpa cillum anim labore laboris incididunt. Non ad aliquip tempor minim exercitation. Nostrud deserunt ea laborum reprehenderit sit in occaecat proident ut Lorem esse. Sunt eiusmod laborum ullamco aliquip mollit eiusmod. Cupidatat laborum pariatur quis eiusmod duis nisi amet magna excepteur aliqua qui. Ut exercitation proident enim sint. In quis sit id qui nostrud voluptate tempor ex in deserunt non laboris.\r\n",
+    "registered": "2014-06-04T19:07:40 -02:00",
+    "latitude": 3.397634,
+    "longitude": 49.085583,
+    "tags": [
+      "ut",
+      "sit",
+      "sit",
+      "dolor",
+      "excepteur",
+      "ipsum",
+      "id"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sharon Randall"
+      },
+      {
+        "id": 1,
+        "name": "Johns Moreno"
+      },
+      {
+        "id": 2,
+        "name": "Lillian Tran"
+      }
+    ],
+    "greeting": "Hello, Albert Franks! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 9,
+    "guid": "79f3ee07-cc4d-4dae-8169-dd3993211516",
+    "isActive": true,
+    "balance": "$2,267.42",
+    "picture": "http://placehold.it/32x32",
+    "age": 21,
+    "eyeColor": "green",
+    "name": "Kristi Wiggins",
+    "gender": "female",
+    "company": "ENAUT",
+    "address": "359 Berriman Street, Herbster, New Jersey, 6663",
+    "about": "Deserunt anim et elit ea eu voluptate cillum anim. Laborum labore anim velit mollit ea Lorem nostrud duis non nostrud ut excepteur laborum aliquip. Sint do elit quis eiusmod labore deserunt incididunt esse. Laboris reprehenderit nisi anim esse aute irure ipsum quis proident. Dolore veniam Lorem incididunt aute.\r\n",
+    "registered": "2014-04-08T22:57:51 -02:00",
+    "latitude": -49.48219,
+    "longitude": -51.916414,
+    "tags": [
+      "cillum",
+      "fugiat",
+      "occaecat",
+      "duis",
+      "nostrud",
+      "id",
+      "aliquip"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Diana Hobbs"
+      },
+      {
+        "id": 1,
+        "name": "Perry Mcdaniel"
+      },
+      {
+        "id": 2,
+        "name": "Terry Bean"
+      }
+    ],
+    "greeting": "Hello, Kristi Wiggins! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 10,
+    "guid": "c2eba44a-29d2-44ee-a7d6-490dbd1a71d3",
+    "isActive": false,
+    "balance": "$3,840.61",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "brown",
+    "name": "Rice Douglas",
+    "gender": "male",
+    "company": "ZOARERE",
+    "address": "110 Dorset Street, Brewster, Michigan, 1702",
+    "about": "Officia reprehenderit mollit amet pariatur pariatur veniam amet deserunt. Cupidatat ex pariatur nostrud in deserunt mollit nostrud ex deserunt. Nulla mollit est et occaecat enim enim. Amet minim reprehenderit velit in adipisicing id commodo.\r\n",
+    "registered": "2014-06-09T19:49:59 -02:00",
+    "latitude": 53.130366,
+    "longitude": -69.354215,
+    "tags": [
+      "ea",
+      "cupidatat",
+      "magna",
+      "sit",
+      "in",
+      "incididunt",
+      "irure"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Jewel Duran"
+      },
+      {
+        "id": 1,
+        "name": "Steele Jimenez"
+      },
+      {
+        "id": 2,
+        "name": "Walsh Walls"
+      }
+    ],
+    "greeting": "Hello, Rice Douglas! You have 10 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 11,
+    "guid": "9394c1b7-c05c-4260-82ae-6464d480026b",
+    "isActive": false,
+    "balance": "$3,094.53",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "blue",
+    "name": "Wolf Beasley",
+    "gender": "male",
+    "company": "DUFLEX",
+    "address": "307 Suydam Place, Cowiche, Maryland, 7500",
+    "about": "In et amet ex eiusmod eu ipsum cupidatat aliqua tempor anim. Non velit nostrud nisi magna do. Enim cillum aute enim excepteur consequat mollit proident irure aliquip nisi incididunt. Deserunt labore et elit labore in duis pariatur id quis cupidatat labore. Pariatur ipsum laboris voluptate incididunt.\r\n",
+    "registered": "2014-03-29T17:27:17 -01:00",
+    "latitude": 37.737167,
+    "longitude": -38.884315,
+    "tags": [
+      "tempor",
+      "eu",
+      "est",
+      "sit",
+      "id",
+      "duis",
+      "mollit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Adams Conrad"
+      },
+      {
+        "id": 1,
+        "name": "Muriel Mercer"
+      },
+      {
+        "id": 2,
+        "name": "Rosetta Cohen"
+      }
+    ],
+    "greeting": "Hello, Wolf Beasley! You have 2 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 12,
+    "guid": "5db3e12d-5daf-4a19-9b01-51af34d083dd",
+    "isActive": false,
+    "balance": "$2,018.49",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "brown",
+    "name": "Hester Knowles",
+    "gender": "male",
+    "company": "PLASMOX",
+    "address": "634 Joralemon Street, Norfolk, Florida, 2771",
+    "about": "Amet eiusmod ea Lorem et officia et Lorem dolor velit. Tempor aliquip laboris consectetur reprehenderit do aliquip. Excepteur tempor anim eu enim dolore anim reprehenderit culpa occaecat amet occaecat minim fugiat laborum. Lorem eiusmod anim in nisi proident aliqua commodo cupidatat irure eiusmod quis exercitation laboris. Minim ipsum cupidatat esse Lorem commodo sit. Elit reprehenderit cillum mollit culpa laboris sint occaecat eu nostrud id.\r\n",
+    "registered": "2014-03-05T14:32:02 -01:00",
+    "latitude": 0.647737,
+    "longitude": -137.287789,
+    "tags": [
+      "voluptate",
+      "fugiat",
+      "in",
+      "ad",
+      "exercitation",
+      "incididunt",
+      "sunt"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Justice Vang"
+      },
+      {
+        "id": 1,
+        "name": "Coleman Munoz"
+      },
+      {
+        "id": 2,
+        "name": "Wilkerson Grimes"
+      }
+    ],
+    "greeting": "Hello, Hester Knowles! You have 6 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 13,
+    "guid": "0717adec-d070-4ce2-83b9-0ba695ee7b07",
+    "isActive": false,
+    "balance": "$3,183.67",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Gillespie Cannon",
+    "gender": "male",
+    "company": "TECHTRIX",
+    "address": "864 Suydam Street, Tooleville, Palau, 1930",
+    "about": "Amet excepteur veniam ex deserunt est dolore qui irure quis amet sint aute. Quis consequat occaecat ad ipsum pariatur labore commodo ipsum aliquip do laborum proident. Reprehenderit id ea eiusmod adipisicing do dolor nostrud cupidatat minim.\r\n",
+    "registered": "2014-05-30T08:18:23 -02:00",
+    "latitude": 66.135817,
+    "longitude": 8.149644,
+    "tags": [
+      "do",
+      "dolore",
+      "aliqua",
+      "laboris",
+      "dolor",
+      "consectetur",
+      "duis"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sabrina Dunlap"
+      },
+      {
+        "id": 1,
+        "name": "Benjamin Henson"
+      },
+      {
+        "id": 2,
+        "name": "Kaitlin Landry"
+      }
+    ],
+    "greeting": "Hello, Gillespie Cannon! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 14,
+    "guid": "6677d19c-8f50-4486-9225-3f9ed92c2c85",
+    "isActive": false,
+    "balance": "$1,576.54",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "brown",
+    "name": "Joann Gibson",
+    "gender": "female",
+    "company": "AUTOMON",
+    "address": "436 Conduit Boulevard, Ogema, Idaho, 2506",
+    "about": "Veniam laboris velit dolore sint enim qui dolor culpa eu culpa enim incididunt ad nostrud. Irure duis tempor velit sit sit fugiat enim consectetur proident ad elit. Et aliqua minim ut eiusmod sit proident excepteur adipisicing dolor magna.\r\n",
+    "registered": "2014-03-16T23:45:03 -01:00",
+    "latitude": 11.216845,
+    "longitude": -162.05913,
+    "tags": [
+      "proident",
+      "ut",
+      "exercitation",
+      "ullamco",
+      "labore",
+      "incididunt",
+      "velit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Hattie Waters"
+      },
+      {
+        "id": 1,
+        "name": "Acosta Hughes"
+      },
+      {
+        "id": 2,
+        "name": "Kidd Bush"
+      }
+    ],
+    "greeting": "Hello, Joann Gibson! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 15,
+    "guid": "60bdb9d5-934e-45cd-9d01-961b69db6e82",
+    "isActive": false,
+    "balance": "$2,824.27",
+    "picture": "http://placehold.it/32x32",
+    "age": 28,
+    "eyeColor": "green",
+    "name": "Gould Webb",
+    "gender": "male",
+    "company": "ZERBINA",
+    "address": "274 Powers Street, Temperanceville, Wisconsin, 6887",
+    "about": "Duis magna aliqua aliquip officia voluptate tempor officia elit deserunt esse ipsum tempor. Proident amet in laborum Lorem amet dolore. Occaecat proident consequat nisi sint ipsum pariatur anim tempor esse quis commodo velit. Nulla non sint mollit excepteur dolor tempor nulla non mollit. Adipisicing esse mollit in cillum magna nulla anim ullamco esse.\r\n",
+    "registered": "2014-06-30T00:55:27 -02:00",
+    "latitude": -48.469436,
+    "longitude": -149.179486,
+    "tags": [
+      "dolore",
+      "dolore",
+      "minim",
+      "cillum",
+      "esse",
+      "do",
+      "anim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lillie Cabrera"
+      },
+      {
+        "id": 1,
+        "name": "Fuentes Leonard"
+      },
+      {
+        "id": 2,
+        "name": "Franco Newton"
+      }
+    ],
+    "greeting": "Hello, Gould Webb! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 16,
+    "guid": "363e0486-3b7b-462a-a462-adfda0638e65",
+    "isActive": true,
+    "balance": "$3,934.16",
+    "picture": "http://placehold.it/32x32",
+    "age": 40,
+    "eyeColor": "blue",
+    "name": "Marion Harris",
+    "gender": "female",
+    "company": "ENTOGROK",
+    "address": "761 Osborn Street, Chicopee, Puerto Rico, 3587",
+    "about": "Eiusmod tempor anim consectetur excepteur ut reprehenderit elit laborum ex Lorem culpa deserunt eiusmod ut. In nisi voluptate consectetur deserunt est. Non laborum adipisicing id veniam irure amet id veniam.\r\n",
+    "registered": "2014-05-27T05:09:48 -02:00",
+    "latitude": -44.462929,
+    "longitude": 122.06393,
+    "tags": [
+      "eiusmod",
+      "nisi",
+      "minim",
+      "quis",
+      "dolor",
+      "ad",
+      "et"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Haley Jacobson"
+      },
+      {
+        "id": 1,
+        "name": "Corrine Mendez"
+      },
+      {
+        "id": 2,
+        "name": "Flores Dale"
+      }
+    ],
+    "greeting": "Hello, Marion Harris! You have 7 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 17,
+    "guid": "07a6abba-cbaf-4ab3-b438-24a009595a2b",
+    "isActive": false,
+    "balance": "$3,234.43",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "blue",
+    "name": "Ratliff Ratliff",
+    "gender": "male",
+    "company": "MARQET",
+    "address": "493 Johnson Street, Muir, Maine, 7224",
+    "about": "Minim sunt incididunt eu aliquip. Dolore aute voluptate amet officia eiusmod ullamco ullamco nulla consectetur. Ut aliqua quis excepteur occaecat magna Lorem magna cupidatat fugiat esse. Mollit sint nisi pariatur dolore laborum cupidatat ad quis deserunt proident excepteur. Cupidatat ea quis veniam consectetur consequat Lorem.\r\n",
+    "registered": "2014-02-01T08:37:40 -01:00",
+    "latitude": 64.797783,
+    "longitude": 21.30513,
+    "tags": [
+      "adipisicing",
+      "excepteur",
+      "non",
+      "mollit",
+      "cillum",
+      "mollit",
+      "ea"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Saunders Knapp"
+      },
+      {
+        "id": 1,
+        "name": "Carter Conley"
+      },
+      {
+        "id": 2,
+        "name": "Miles Christian"
+      }
+    ],
+    "greeting": "Hello, Ratliff Ratliff! You have 6 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 18,
+    "guid": "63e9cae8-a275-4c27-b649-d0b84583881f",
+    "isActive": false,
+    "balance": "$3,845.93",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "brown",
+    "name": "Gertrude Dennis",
+    "gender": "female",
+    "company": "ISOPLEX",
+    "address": "690 Tech Place, Riner, Washington, 5790",
+    "about": "Ea labore elit velit consequat mollit dolor consequat deserunt eiusmod. Cillum amet exercitation aliquip laborum consequat amet ex deserunt ipsum proident ullamco. Irure ad ad elit officia aliqua laborum ad veniam aliquip est non sunt magna. Consectetur culpa esse officia tempor reprehenderit adipisicing.\r\n",
+    "registered": "2014-03-12T03:14:00 -01:00",
+    "latitude": 89.204373,
+    "longitude": -91.487508,
+    "tags": [
+      "velit",
+      "non",
+      "ut",
+      "aute",
+      "consequat",
+      "ullamco",
+      "fugiat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Rodriquez Cote"
+      },
+      {
+        "id": 1,
+        "name": "Parrish Townsend"
+      },
+      {
+        "id": 2,
+        "name": "Fitzgerald Cline"
+      }
+    ],
+    "greeting": "Hello, Gertrude Dennis! You have 3 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 19,
+    "guid": "8488845a-d84c-4ab0-9b6e-0f61ec1d8f2f",
+    "isActive": true,
+    "balance": "$3,092.65",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "green",
+    "name": "Booth Walters",
+    "gender": "male",
+    "company": "RENOVIZE",
+    "address": "966 Nixon Court, Farmington, New Hampshire, 9704",
+    "about": "Proident veniam laborum veniam officia fugiat veniam aliquip adipisicing. Est nulla veniam proident ipsum fugiat qui. Nostrud do fugiat ex Lorem labore laborum consequat elit. Ullamco ipsum ut sit officia non laborum eiusmod sit commodo. Minim labore quis ipsum aute voluptate reprehenderit incididunt minim sint commodo reprehenderit. Et culpa voluptate tempor minim veniam esse voluptate proident qui duis magna qui minim adipisicing. Dolore sunt velit esse ex laborum sint tempor dolore adipisicing voluptate culpa.\r\n",
+    "registered": "2014-03-23T04:03:44 -01:00",
+    "latitude": -3.1728,
+    "longitude": -71.674485,
+    "tags": [
+      "ipsum",
+      "dolore",
+      "aliquip",
+      "veniam",
+      "veniam",
+      "cupidatat",
+      "exercitation"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Petersen Adams"
+      },
+      {
+        "id": 1,
+        "name": "Patrica Wheeler"
+      },
+      {
+        "id": 2,
+        "name": "Goff Manning"
+      }
+    ],
+    "greeting": "Hello, Booth Walters! You have 6 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 20,
+    "guid": "3a14f7a5-465a-459c-981d-811c4b3bcabb",
+    "isActive": true,
+    "balance": "$2,389.89",
+    "picture": "http://placehold.it/32x32",
+    "age": 38,
+    "eyeColor": "green",
+    "name": "Goodman Pollard",
+    "gender": "male",
+    "company": "BOINK",
+    "address": "814 Minna Street, Yorklyn, Kansas, 1783",
+    "about": "Incididunt esse nisi excepteur et elit dolore do ea qui duis excepteur et. Est sit eiusmod culpa et ex magna nisi laboris laborum dolore officia et. Occaecat fugiat esse qui dolore aliquip est. Eiusmod mollit proident cillum excepteur occaecat exercitation nisi amet ad commodo. Sit nostrud cillum velit tempor culpa pariatur duis excepteur cillum cillum nisi aliqua cillum. Nostrud cupidatat laborum elit do occaecat et nulla labore eiusmod enim quis ut.\r\n",
+    "registered": "2014-01-30T05:43:57 -01:00",
+    "latitude": -49.438136,
+    "longitude": 77.163106,
+    "tags": [
+      "cupidatat",
+      "pariatur",
+      "elit",
+      "veniam",
+      "pariatur",
+      "id",
+      "eu"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Elise Howe"
+      },
+      {
+        "id": 1,
+        "name": "Cooley Dean"
+      },
+      {
+        "id": 2,
+        "name": "Heath Reeves"
+      }
+    ],
+    "greeting": "Hello, Goodman Pollard! You have 9 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 21,
+    "guid": "b9824725-ad59-4614-ac6a-8a5cb1f4d38f",
+    "isActive": false,
+    "balance": "$3,576.88",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "brown",
+    "name": "Shannon Pearson",
+    "gender": "male",
+    "company": "INTRADISK",
+    "address": "603 Schenck Court, Vincent, Nebraska, 4816",
+    "about": "Duis aliquip pariatur consequat labore laborum reprehenderit culpa voluptate magna. Dolor irure aliqua ullamco ex excepteur ad ut ex incididunt consequat mollit sint voluptate. Cillum sunt nisi dolore aliqua laboris ut et commodo do eu voluptate adipisicing voluptate. Voluptate officia voluptate sint velit. Et velit ad nisi ex id in sint mollit. Anim et adipisicing ullamco veniam eiusmod culpa fugiat esse aliquip tempor consectetur. Minim est consequat labore enim sint.\r\n",
+    "registered": "2014-05-19T09:36:18 -02:00",
+    "latitude": 62.528531,
+    "longitude": -132.572314,
+    "tags": [
+      "elit",
+      "minim",
+      "elit",
+      "elit",
+      "commodo",
+      "quis",
+      "fugiat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Cynthia Stanton"
+      },
+      {
+        "id": 1,
+        "name": "Jennings Kelley"
+      },
+      {
+        "id": 2,
+        "name": "Fulton Vance"
+      }
+    ],
+    "greeting": "Hello, Shannon Pearson! You have 1 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 22,
+    "guid": "ec621505-23ae-4df9-9a23-ca51078ea3e0",
+    "isActive": false,
+    "balance": "$3,025.38",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "green",
+    "name": "Hilda Morrison",
+    "gender": "female",
+    "company": "MANGLO",
+    "address": "249 Rogers Avenue, Gorst, Hawaii, 7109",
+    "about": "Nulla qui velit proident aliqua amet aliquip in. Labore et veniam dolore adipisicing dolore magna irure. Proident sint in qui aliqua consectetur aliqua deserunt proident velit. Aliquip minim nulla dolor do anim pariatur nisi laboris exercitation consequat ipsum velit do id. Ad anim labore consectetur irure et nulla anim voluptate consectetur fugiat.\r\n",
+    "registered": "2014-06-28T05:40:08 -02:00",
+    "latitude": 47.857679,
+    "longitude": 177.50372,
+    "tags": [
+      "enim",
+      "nisi",
+      "dolore",
+      "culpa",
+      "deserunt",
+      "do",
+      "et"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Audra Chan"
+      },
+      {
+        "id": 1,
+        "name": "Angel Marsh"
+      },
+      {
+        "id": 2,
+        "name": "Yates Barron"
+      }
+    ],
+    "greeting": "Hello, Hilda Morrison! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 23,
+    "guid": "83ef2f1a-f8d5-4fc1-9521-b3fc57a83751",
+    "isActive": false,
+    "balance": "$1,160.52",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "blue",
+    "name": "Brewer Hicks",
+    "gender": "male",
+    "company": "PLUTORQUE",
+    "address": "270 Benson Avenue, Downsville, District Of Columbia, 6931",
+    "about": "Duis tempor voluptate minim sint amet cillum anim ullamco quis anim ipsum veniam. Exercitation eiusmod commodo cillum magna ut aute laborum esse. Pariatur exercitation excepteur elit cillum ut sit consequat non nisi cillum officia. Adipisicing aliqua exercitation non velit incididunt quis sint ipsum sunt irure do duis adipisicing Lorem. Elit do aliquip anim exercitation proident velit enim velit ipsum esse. Esse nulla ex ex est Lorem esse consequat. Ea reprehenderit incididunt amet mollit aliquip commodo velit ullamco fugiat aliquip eu enim minim pariatur.\r\n",
+    "registered": "2014-01-09T02:04:43 -01:00",
+    "latitude": -75.853523,
+    "longitude": 163.776518,
+    "tags": [
+      "est",
+      "do",
+      "id",
+      "mollit",
+      "quis",
+      "proident",
+      "sit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Hamilton Black"
+      },
+      {
+        "id": 1,
+        "name": "Claudia Barlow"
+      },
+      {
+        "id": 2,
+        "name": "Socorro Spears"
+      }
+    ],
+    "greeting": "Hello, Brewer Hicks! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 24,
+    "guid": "cb69d074-cce9-45e9-a24d-7fd08bca4323",
+    "isActive": true,
+    "balance": "$2,836.40",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "blue",
+    "name": "Trudy Gates",
+    "gender": "female",
+    "company": "XIXAN",
+    "address": "961 McKibben Street, Matheny, South Dakota, 9685",
+    "about": "Minim sint enim non excepteur eiusmod. Incididunt eu do ad non duis elit Lorem id dolor dolor reprehenderit ipsum sit anim. Deserunt deserunt cillum labore ullamco anim. Amet nulla nisi labore pariatur deserunt veniam incididunt reprehenderit quis ad veniam. Excepteur elit deserunt duis ad mollit. Sit elit sint tempor proident ex duis adipisicing proident anim. Laboris officia ullamco fugiat et laboris non in dolor.\r\n",
+    "registered": "2014-05-25T10:37:08 -02:00",
+    "latitude": 21.885136,
+    "longitude": -41.678052,
+    "tags": [
+      "velit",
+      "aute",
+      "eiusmod",
+      "et",
+      "adipisicing",
+      "consectetur",
+      "minim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Camacho Farmer"
+      },
+      {
+        "id": 1,
+        "name": "Donaldson Vincent"
+      },
+      {
+        "id": 2,
+        "name": "Flora Clemons"
+      }
+    ],
+    "greeting": "Hello, Trudy Gates! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 25,
+    "guid": "b2807de3-ba87-482c-84d1-4aabc5f06436",
+    "isActive": false,
+    "balance": "$3,004.82",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "brown",
+    "name": "Mcclain Dyer",
+    "gender": "male",
+    "company": "IMAGEFLOW",
+    "address": "145 Veranda Place, Woodlake, Tennessee, 9160",
+    "about": "Nostrud incididunt cupidatat enim ullamco do enim fugiat dolore dolore ipsum. Elit dolore laboris in quis. Ad sit excepteur sunt Lorem fugiat consequat. Sunt id qui pariatur voluptate Lorem. Velit irure fugiat commodo est deserunt sunt consectetur consectetur duis magna dolor et. Consectetur minim ea cillum cupidatat adipisicing cillum nisi deserunt cillum enim.\r\n",
+    "registered": "2014-05-30T13:54:21 -02:00",
+    "latitude": 26.506892,
+    "longitude": -45.497276,
+    "tags": [
+      "culpa",
+      "quis",
+      "nulla",
+      "aliqua",
+      "consequat",
+      "exercitation",
+      "ullamco"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Moon Kemp"
+      },
+      {
+        "id": 1,
+        "name": "Erna Hunter"
+      },
+      {
+        "id": 2,
+        "name": "Virgie Crosby"
+      }
+    ],
+    "greeting": "Hello, Mcclain Dyer! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 26,
+    "guid": "40357915-bca9-4028-8f11-16159d0e19bb",
+    "isActive": true,
+    "balance": "$2,405.79",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "brown",
+    "name": "Madeleine Small",
+    "gender": "female",
+    "company": "MIXERS",
+    "address": "722 Winthrop Street, Day, Arizona, 3608",
+    "about": "Proident culpa duis voluptate est sit ad. Cupidatat anim mollit commodo adipisicing eu sunt cillum et dolor occaecat exercitation et exercitation. Occaecat ad reprehenderit aliquip id velit voluptate fugiat.\r\n",
+    "registered": "2014-04-02T02:58:24 -02:00",
+    "latitude": -62.758082,
+    "longitude": 3.987232,
+    "tags": [
+      "nisi",
+      "amet",
+      "qui",
+      "incididunt",
+      "tempor",
+      "veniam",
+      "consequat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Adkins Davis"
+      },
+      {
+        "id": 1,
+        "name": "Delores Miles"
+      },
+      {
+        "id": 2,
+        "name": "Chan Orr"
+      }
+    ],
+    "greeting": "Hello, Madeleine Small! You have 8 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 27,
+    "guid": "96f5ff1e-beca-474e-aa56-d7dc339c250f",
+    "isActive": false,
+    "balance": "$3,535.72",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Cassandra Rios",
+    "gender": "female",
+    "company": "HOMETOWN",
+    "address": "430 Roebling Street, Yardville, Vermont, 6970",
+    "about": "Occaecat enim fugiat anim aliqua qui incididunt cupidatat magna. Irure est velit cillum ullamco ut nostrud id incididunt irure est culpa adipisicing irure. Et dolore nostrud do consequat. Proident qui culpa tempor non incididunt deserunt exercitation. Nostrud laborum non magna ullamco esse et deserunt. Velit in irure ad ex laboris velit pariatur exercitation quis non magna nisi. Ipsum ad mollit esse occaecat laboris laboris id occaecat enim anim aliquip est sunt.\r\n",
+    "registered": "2014-05-25T22:39:33 -02:00",
+    "latitude": 67.062085,
+    "longitude": -7.309183,
+    "tags": [
+      "Lorem",
+      "amet",
+      "ad",
+      "amet",
+      "nisi",
+      "dolor",
+      "esse"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Townsend Sanford"
+      },
+      {
+        "id": 1,
+        "name": "Ingrid Floyd"
+      },
+      {
+        "id": 2,
+        "name": "Sara Rivera"
+      }
+    ],
+    "greeting": "Hello, Cassandra Rios! You have 9 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 28,
+    "guid": "4a1fbf0c-93a9-4687-b793-75312edc212d",
+    "isActive": true,
+    "balance": "$3,255.45",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "brown",
+    "name": "Polly Solis",
+    "gender": "female",
+    "company": "ZYTRAC",
+    "address": "597 Arion Place, Catharine, Arkansas, 6507",
+    "about": "Nostrud dolore veniam labore ut do cupidatat minim magna et cupidatat ut. Culpa ut do deserunt eiusmod aliquip qui in incididunt Lorem officia. Laborum deserunt sint deserunt labore irure sunt consectetur mollit occaecat magna aliquip cupidatat nulla culpa. Nostrud adipisicing cupidatat id mollit duis anim officia ea consequat. Ex ipsum occaecat aliquip pariatur.\r\n",
+    "registered": "2014-02-02T14:32:39 -01:00",
+    "latitude": -84.730608,
+    "longitude": 119.834605,
+    "tags": [
+      "aliquip",
+      "sint",
+      "deserunt",
+      "sint",
+      "magna",
+      "anim",
+      "et"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Pickett Holden"
+      },
+      {
+        "id": 1,
+        "name": "Sherry Downs"
+      },
+      {
+        "id": 2,
+        "name": "Greer Benjamin"
+      }
+    ],
+    "greeting": "Hello, Polly Solis! You have 3 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 29,
+    "guid": "10a9a575-ce9d-48d7-a169-c85aeed01e20",
+    "isActive": false,
+    "balance": "$2,323.11",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Juliet Hendricks",
+    "gender": "female",
+    "company": "SHOPABOUT",
+    "address": "289 Huntington Street, Albrightsville, Connecticut, 740",
+    "about": "Adipisicing deserunt eu ipsum esse culpa nostrud aliquip id. Elit mollit reprehenderit consectetur ex consequat veniam pariatur commodo enim eiusmod voluptate commodo. Aute non enim laboris aute deserunt amet est laborum sunt. Minim nulla pariatur amet velit anim ipsum id. Deserunt irure esse eu duis et aliqua quis proident est amet.\r\n",
+    "registered": "2014-04-25T01:21:51 -02:00",
+    "latitude": 83.541829,
+    "longitude": -44.401622,
+    "tags": [
+      "occaecat",
+      "ullamco",
+      "proident",
+      "non",
+      "est",
+      "commodo",
+      "magna"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Consuelo Bender"
+      },
+      {
+        "id": 1,
+        "name": "Nola French"
+      },
+      {
+        "id": 2,
+        "name": "Weiss Sawyer"
+      }
+    ],
+    "greeting": "Hello, Juliet Hendricks! You have 10 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 30,
+    "guid": "37e35b9a-403f-4ea3-ae41-09d95dc9240c",
+    "isActive": true,
+    "balance": "$2,981.35",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "brown",
+    "name": "Wade Jordan",
+    "gender": "male",
+    "company": "QUONATA",
+    "address": "821 Thatford Avenue, Blanco, Marshall Islands, 6693",
+    "about": "Deserunt irure Lorem ex labore consequat magna qui elit pariatur id ipsum consectetur officia. Cupidatat ad tempor dolore pariatur nostrud dolore dolor anim cillum. Non labore duis laboris laborum nulla incididunt magna esse sunt officia duis est. Consequat ullamco mollit et aute laboris nostrud elit dolore eiusmod non velit proident dolore dolor.\r\n",
+    "registered": "2014-05-27T12:50:23 -02:00",
+    "latitude": -40.296012,
+    "longitude": 113.521677,
+    "tags": [
+      "fugiat",
+      "commodo",
+      "sint",
+      "minim",
+      "ex",
+      "eu",
+      "reprehenderit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Letitia Lang"
+      },
+      {
+        "id": 1,
+        "name": "Macdonald Meadows"
+      },
+      {
+        "id": 2,
+        "name": "Mueller Heath"
+      }
+    ],
+    "greeting": "Hello, Wade Jordan! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 31,
+    "guid": "c5f5321f-3d91-444e-a47a-b0c371ab0081",
+    "isActive": true,
+    "balance": "$3,019.23",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "blue",
+    "name": "Yang Chase",
+    "gender": "male",
+    "company": "BLURRYBUS",
+    "address": "707 Morton Street, Hanover, Kentucky, 5726",
+    "about": "Ea adipisicing excepteur qui eu et consequat ipsum exercitation excepteur eiusmod veniam. Lorem dolor nisi et fugiat commodo enim. Et ut amet officia minim ut laborum cillum est nostrud adipisicing laborum enim mollit et. Ad nostrud anim in Lorem. Pariatur deserunt cillum veniam voluptate eu consectetur ullamco aute veniam ipsum sint pariatur. Tempor commodo ea id voluptate anim exercitation aute commodo non anim.\r\n",
+    "registered": "2014-04-08T05:54:21 -02:00",
+    "latitude": 52.861453,
+    "longitude": 140.0777,
+    "tags": [
+      "nulla",
+      "qui",
+      "consequat",
+      "ullamco",
+      "cillum",
+      "excepteur",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Katy Mckinney"
+      },
+      {
+        "id": 1,
+        "name": "Hines Parks"
+      },
+      {
+        "id": 2,
+        "name": "Fischer Chen"
+      }
+    ],
+    "greeting": "Hello, Yang Chase! You have 6 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 32,
+    "guid": "74a473e0-bf9d-4475-a51b-9a765b9cc193",
+    "isActive": true,
+    "balance": "$1,105.02",
+    "picture": "http://placehold.it/32x32",
+    "age": 38,
+    "eyeColor": "green",
+    "name": "Sheena Johnson",
+    "gender": "female",
+    "company": "SURELOGIC",
+    "address": "912 Erskine Loop, Strykersville, Indiana, 7777",
+    "about": "Veniam aliquip eiusmod Lorem ea sit nisi ad cupidatat. Occaecat Lorem magna proident ullamco nisi enim elit cillum. Eiusmod ut excepteur dolore eu culpa excepteur id quis mollit.\r\n",
+    "registered": "2014-05-12T20:26:36 -02:00",
+    "latitude": 49.95926,
+    "longitude": -99.357496,
+    "tags": [
+      "enim",
+      "ad",
+      "dolor",
+      "laboris",
+      "anim",
+      "consequat",
+      "exercitation"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bartlett Fletcher"
+      },
+      {
+        "id": 1,
+        "name": "Lorie Fulton"
+      },
+      {
+        "id": 2,
+        "name": "Candace Bowman"
+      }
+    ],
+    "greeting": "Hello, Sheena Johnson! You have 10 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 33,
+    "guid": "dc0479bc-a96e-4836-b1a9-8f950e3efd83",
+    "isActive": false,
+    "balance": "$2,795.29",
+    "picture": "http://placehold.it/32x32",
+    "age": 20,
+    "eyeColor": "green",
+    "name": "Celina Joyce",
+    "gender": "female",
+    "company": "ZENTIA",
+    "address": "828 Varick Street, Tioga, Colorado, 3681",
+    "about": "Velit nulla commodo officia nostrud tempor elit anim magna sint nostrud sit quis. Amet ex do est ea pariatur consectetur laboris dolor mollit consequat ut proident magna amet. Anim laboris enim velit proident labore esse ipsum magna et. Et do nostrud ullamco anim adipisicing cillum id.\r\n",
+    "registered": "2014-01-09T09:35:03 -01:00",
+    "latitude": -20.063864,
+    "longitude": -26.824305,
+    "tags": [
+      "quis",
+      "non",
+      "est",
+      "dolor",
+      "anim",
+      "officia",
+      "aliquip"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Booker Rojas"
+      },
+      {
+        "id": 1,
+        "name": "Inez Farrell"
+      },
+      {
+        "id": 2,
+        "name": "Gail Newman"
+      }
+    ],
+    "greeting": "Hello, Celina Joyce! You have 3 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 34,
+    "guid": "453ed0b7-d013-4816-8da6-89518b12d8b3",
+    "isActive": true,
+    "balance": "$3,895.96",
+    "picture": "http://placehold.it/32x32",
+    "age": 28,
+    "eyeColor": "brown",
+    "name": "Acevedo Bright",
+    "gender": "male",
+    "company": "PROSURE",
+    "address": "701 Walker Court, Unionville, Wyoming, 9919",
+    "about": "Sunt dolor est exercitation eu ex mollit cupidatat non. Amet do quis aliquip id ex amet esse elit nulla culpa aute enim et. Exercitation labore exercitation ullamco ad. Esse aliqua do veniam id ea. Cupidatat est eiusmod aliqua culpa ullamco. Amet ex voluptate exercitation sint do incididunt eu incididunt ipsum ipsum.\r\n",
+    "registered": "2014-03-24T12:47:29 -01:00",
+    "latitude": -64.863652,
+    "longitude": 50.546838,
+    "tags": [
+      "voluptate",
+      "sit",
+      "eiusmod",
+      "nostrud",
+      "fugiat",
+      "culpa",
+      "quis"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Copeland Dillon"
+      },
+      {
+        "id": 1,
+        "name": "Battle Figueroa"
+      },
+      {
+        "id": 2,
+        "name": "Lott Davidson"
+      }
+    ],
+    "greeting": "Hello, Acevedo Bright! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 35,
+    "guid": "b9403ab7-4cc3-4ba7-9b14-c8192fc8db82",
+    "isActive": true,
+    "balance": "$1,673.85",
+    "picture": "http://placehold.it/32x32",
+    "age": 30,
+    "eyeColor": "brown",
+    "name": "Mabel Monroe",
+    "gender": "female",
+    "company": "ZEDALIS",
+    "address": "865 Love Lane, Ripley, Guam, 4463",
+    "about": "Cupidatat quis qui deserunt qui consequat minim minim fugiat magna mollit. Excepteur mollit nostrud eiusmod sit laborum enim minim sit dolore cillum minim. Pariatur officia voluptate labore sint amet deserunt. Reprehenderit dolor voluptate nostrud duis labore aliquip et officia labore sit dolore. Aliqua magna magna in laboris eiusmod incididunt est eiusmod do velit veniam commodo minim dolor. Occaecat sit aliquip nulla exercitation nulla enim deserunt aute nostrud fugiat proident irure irure amet.\r\n",
+    "registered": "2014-04-30T12:17:04 -02:00",
+    "latitude": -55.542003,
+    "longitude": -171.447153,
+    "tags": [
+      "tempor",
+      "qui",
+      "ullamco",
+      "aute",
+      "cillum",
+      "est",
+      "velit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bullock Lamb"
+      },
+      {
+        "id": 1,
+        "name": "Pratt Sanders"
+      },
+      {
+        "id": 2,
+        "name": "Stephenson Boone"
+      }
+    ],
+    "greeting": "Hello, Mabel Monroe! You have 6 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 36,
+    "guid": "e574f534-f8ef-440b-8a1f-6c68a0a4c844",
+    "isActive": false,
+    "balance": "$3,191.59",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "blue",
+    "name": "Wilma Justice",
+    "gender": "female",
+    "company": "TRASOLA",
+    "address": "729 Seton Place, Dorneyville, Mississippi, 8313",
+    "about": "Fugiat ea deserunt commodo nostrud qui cupidatat do. Minim quis id culpa sit labore. Adipisicing do anim pariatur incididunt qui dolore tempor mollit mollit labore est adipisicing velit commodo. Ut pariatur mollit proident tempor magna nostrud ut aute incididunt proident.\r\n",
+    "registered": "2014-05-04T21:24:27 -02:00",
+    "latitude": -49.765389,
+    "longitude": -37.133321,
+    "tags": [
+      "nostrud",
+      "aute",
+      "tempor",
+      "ipsum",
+      "esse",
+      "ex",
+      "minim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Hilary Rodriguez"
+      },
+      {
+        "id": 1,
+        "name": "Watson Valencia"
+      },
+      {
+        "id": 2,
+        "name": "Bolton Buck"
+      }
+    ],
+    "greeting": "Hello, Wilma Justice! You have 9 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 37,
+    "guid": "19a06d59-e67f-45e1-9601-9272147cd608",
+    "isActive": true,
+    "balance": "$2,678.18",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Sharron Buckner",
+    "gender": "female",
+    "company": "ACCUPRINT",
+    "address": "281 Duryea Place, Bethany, Ohio, 993",
+    "about": "Do id commodo labore nostrud. Elit aliquip reprehenderit laborum nisi ea incididunt culpa velit labore eu officia. Do aute tempor duis ut. Ex exercitation ullamco irure dolor qui eu. Et fugiat eiusmod elit tempor amet.\r\n",
+    "registered": "2014-05-12T08:10:46 -02:00",
+    "latitude": -13.193791,
+    "longitude": -98.4976,
+    "tags": [
+      "adipisicing",
+      "enim",
+      "ut",
+      "ipsum",
+      "occaecat",
+      "in",
+      "pariatur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Stacy Jackson"
+      },
+      {
+        "id": 1,
+        "name": "Roberta Decker"
+      },
+      {
+        "id": 2,
+        "name": "Louisa Moran"
+      }
+    ],
+    "greeting": "Hello, Sharron Buckner! You have 5 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 38,
+    "guid": "76902598-0d5b-4b1b-ba17-775f5c255b97",
+    "isActive": false,
+    "balance": "$1,696.80",
+    "picture": "http://placehold.it/32x32",
+    "age": 21,
+    "eyeColor": "brown",
+    "name": "Holt Merritt",
+    "gender": "male",
+    "company": "PROGENEX",
+    "address": "419 Alice Court, Cedarville, Minnesota, 477",
+    "about": "Anim cupidatat sint anim dolor ea amet proident et do aliquip. Consequat excepteur sunt amet eu nisi adipisicing. Velit cillum cupidatat esse fugiat. Id do incididunt ullamco sunt ut et proident consectetur. Dolor aliqua tempor ipsum fugiat irure tempor id. Mollit deserunt amet do officia. Officia proident laborum aliquip esse consectetur dolore ipsum dolor sint anim.\r\n",
+    "registered": "2014-06-01T13:19:33 -02:00",
+    "latitude": -75.529871,
+    "longitude": -154.634484,
+    "tags": [
+      "enim",
+      "nostrud",
+      "quis",
+      "fugiat",
+      "nisi",
+      "duis",
+      "consequat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Maggie Castro"
+      },
+      {
+        "id": 1,
+        "name": "Boyd Gamble"
+      },
+      {
+        "id": 2,
+        "name": "Petra Olsen"
+      }
+    ],
+    "greeting": "Hello, Holt Merritt! You have 10 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 39,
+    "guid": "340de99c-b08b-4cfe-8949-edee0fd3057b",
+    "isActive": true,
+    "balance": "$1,585.36",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "brown",
+    "name": "Adeline Forbes",
+    "gender": "female",
+    "company": "OVOLO",
+    "address": "988 Concord Street, Delco, Nevada, 4671",
+    "about": "Exercitation commodo fugiat proident aute. Id officia culpa fugiat labore magna elit aliquip dolore excepteur. Veniam ea aliquip aliquip ullamco nostrud qui irure irure in do duis minim. Magna occaecat ipsum laboris laborum duis incididunt ipsum voluptate eu id elit.\r\n",
+    "registered": "2014-02-28T13:35:35 -01:00",
+    "latitude": -50.30747,
+    "longitude": -46.436881,
+    "tags": [
+      "est",
+      "eu",
+      "veniam",
+      "aliquip",
+      "do",
+      "duis",
+      "excepteur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Tanisha Lopez"
+      },
+      {
+        "id": 1,
+        "name": "Claire Hood"
+      },
+      {
+        "id": 2,
+        "name": "Glass Casey"
+      }
+    ],
+    "greeting": "Hello, Adeline Forbes! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 40,
+    "guid": "465d4c2d-66be-4f5b-b1ca-89d905b57d10",
+    "isActive": false,
+    "balance": "$2,431.75",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "brown",
+    "name": "Cassie Reid",
+    "gender": "female",
+    "company": "KAGE",
+    "address": "975 Montague Terrace, Drummond, Alabama, 3384",
+    "about": "Deserunt reprehenderit ad nisi sit sit enim et. Cillum enim irure do eu ad reprehenderit aliqua ipsum occaecat. Aliqua id pariatur occaecat sunt sit laborum culpa proident.\r\n",
+    "registered": "2014-06-16T12:34:20 -02:00",
+    "latitude": -80.740395,
+    "longitude": -120.970002,
+    "tags": [
+      "dolor",
+      "cillum",
+      "consectetur",
+      "pariatur",
+      "commodo",
+      "deserunt",
+      "exercitation"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Jessica Lancaster"
+      },
+      {
+        "id": 1,
+        "name": "Rogers Bradford"
+      },
+      {
+        "id": 2,
+        "name": "Rasmussen Pennington"
+      }
+    ],
+    "greeting": "Hello, Cassie Reid! You have 9 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 41,
+    "guid": "0c95f3b3-ed1e-4e73-b875-9ef9d8175178",
+    "isActive": true,
+    "balance": "$2,963.57",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "green",
+    "name": "Theresa Garrison",
+    "gender": "female",
+    "company": "GOKO",
+    "address": "346 Garden Street, Sena, American Samoa, 3751",
+    "about": "In reprehenderit sit esse pariatur laboris sit Lorem adipisicing ea minim dolor dolore. Veniam sunt anim aliqua ex sit excepteur est. Cillum ad nisi dolore id veniam. Ea elit ad adipisicing occaecat magna proident elit ea.\r\n",
+    "registered": "2014-03-28T18:57:25 -01:00",
+    "latitude": 74.367959,
+    "longitude": -156.849438,
+    "tags": [
+      "deserunt",
+      "ex",
+      "enim",
+      "ipsum",
+      "aute",
+      "nulla",
+      "id"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Park Whitney"
+      },
+      {
+        "id": 1,
+        "name": "Judy Reyes"
+      },
+      {
+        "id": 2,
+        "name": "Dillon Coffey"
+      }
+    ],
+    "greeting": "Hello, Theresa Garrison! You have 2 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 42,
+    "guid": "67cb9440-bc5b-4d55-b7e6-611b737fdf50",
+    "isActive": false,
+    "balance": "$1,905.50",
+    "picture": "http://placehold.it/32x32",
+    "age": 23,
+    "eyeColor": "green",
+    "name": "Sue Thomas",
+    "gender": "female",
+    "company": "QUIZKA",
+    "address": "895 Eldert Lane, Skyland, North Dakota, 2061",
+    "about": "Occaecat amet magna laborum ad laborum minim dolor ad eu laboris veniam nisi. Reprehenderit duis sunt excepteur duis mollit amet ad amet veniam. Lorem in non adipisicing deserunt minim consequat eu. Reprehenderit et mollit velit amet adipisicing. Nulla sunt exercitation dolore ad sunt sit excepteur ex id dolor commodo sint cillum veniam. Aliqua consequat mollit adipisicing sint et deserunt elit consectetur commodo labore mollit eiusmod tempor. Pariatur culpa pariatur sunt nostrud sint.\r\n",
+    "registered": "2014-04-10T13:41:18 -02:00",
+    "latitude": 4.868181,
+    "longitude": 80.852318,
+    "tags": [
+      "est",
+      "do",
+      "enim",
+      "sit",
+      "nisi",
+      "do",
+      "nisi"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Debbie Hart"
+      },
+      {
+        "id": 1,
+        "name": "Allen Turner"
+      },
+      {
+        "id": 2,
+        "name": "Aimee Reilly"
+      }
+    ],
+    "greeting": "Hello, Sue Thomas! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 43,
+    "guid": "52318c33-b606-4362-970e-743f560c2c6e",
+    "isActive": false,
+    "balance": "$2,779.11",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "blue",
+    "name": "Key Baldwin",
+    "gender": "male",
+    "company": "SPORTAN",
+    "address": "296 Jackson Place, Jugtown, Virgin Islands, 4817",
+    "about": "Et duis elit mollit eiusmod est eiusmod amet in proident ex quis. Pariatur mollit quis duis id esse qui aute deserunt qui. Nisi velit fugiat ex occaecat consequat id quis ullamco nisi in. Ea occaecat do commodo officia cillum officia irure eiusmod ex. Elit enim qui incididunt laborum quis in exercitation qui cupidatat dolor cillum minim elit eu.\r\n",
+    "registered": "2014-06-15T10:53:26 -02:00",
+    "latitude": -70.284549,
+    "longitude": 52.119751,
+    "tags": [
+      "ad",
+      "mollit",
+      "veniam",
+      "enim",
+      "enim",
+      "adipisicing",
+      "excepteur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Elliott Powell"
+      },
+      {
+        "id": 1,
+        "name": "Mann Snider"
+      },
+      {
+        "id": 2,
+        "name": "Velma Bernard"
+      }
+    ],
+    "greeting": "Hello, Key Baldwin! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 44,
+    "guid": "b7840c63-6cf1-4e09-9b72-18c3ba5a7111",
+    "isActive": false,
+    "balance": "$3,919.74",
+    "picture": "http://placehold.it/32x32",
+    "age": 40,
+    "eyeColor": "green",
+    "name": "Cotton Pickett",
+    "gender": "male",
+    "company": "ASIMILINE",
+    "address": "956 Madison Street, Yonah, Massachusetts, 5533",
+    "about": "Velit adipisicing aliquip fugiat nostrud tempor cillum in excepteur laborum esse est ut sunt magna. Dolore non laborum ut ea exercitation dolore Lorem. Cillum cillum occaecat dolore Lorem est labore. Do eu occaecat mollit do.\r\n",
+    "registered": "2014-03-16T05:29:39 -01:00",
+    "latitude": 40.126991,
+    "longitude": 161.483099,
+    "tags": [
+      "duis",
+      "mollit",
+      "ullamco",
+      "cupidatat",
+      "tempor",
+      "ullamco",
+      "anim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Megan Mays"
+      },
+      {
+        "id": 1,
+        "name": "Darlene Ortega"
+      },
+      {
+        "id": 2,
+        "name": "Deidre Ortiz"
+      }
+    ],
+    "greeting": "Hello, Cotton Pickett! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 45,
+    "guid": "fdc22758-b370-4504-8c32-52f08d0f1742",
+    "isActive": true,
+    "balance": "$1,138.69",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "brown",
+    "name": "Camille Glass",
+    "gender": "female",
+    "company": "KEGULAR",
+    "address": "874 Fuller Place, Gerber, New York, 9249",
+    "about": "Cillum laborum consectetur id ipsum est consequat. Et consectetur non amet laborum ut occaecat reprehenderit aliqua voluptate amet. Cillum veniam excepteur excepteur consequat anim proident ullamco consequat dolore. Nostrud veniam cupidatat ex qui exercitation ut sunt sunt cillum ex minim id ad culpa. Laborum adipisicing velit cillum magna nostrud sunt aute ullamco sit ullamco adipisicing sunt nisi duis.\r\n",
+    "registered": "2014-05-31T10:26:10 -02:00",
+    "latitude": -40.005694,
+    "longitude": -44.464273,
+    "tags": [
+      "id",
+      "id",
+      "dolor",
+      "officia",
+      "consequat",
+      "laboris",
+      "dolor"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Mccall Emerson"
+      },
+      {
+        "id": 1,
+        "name": "Osborn Hancock"
+      },
+      {
+        "id": 2,
+        "name": "Kline Ashley"
+      }
+    ],
+    "greeting": "Hello, Camille Glass! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 46,
+    "guid": "54e5395f-9339-413a-83f1-a687485600d8",
+    "isActive": false,
+    "balance": "$1,200.04",
+    "picture": "http://placehold.it/32x32",
+    "age": 30,
+    "eyeColor": "green",
+    "name": "Jana Horton",
+    "gender": "female",
+    "company": "POWERNET",
+    "address": "489 King Street, Boyd, New Mexico, 5703",
+    "about": "Irure consectetur sit anim id sint do occaecat labore enim nulla. Aliquip laborum excepteur et aliquip. Irure nostrud reprehenderit dolore adipisicing in non labore cillum amet deserunt et qui dolor nostrud. Do eu veniam magna occaecat laboris in aliqua laboris incididunt enim et. Culpa labore ut minim cupidatat aute magna sunt occaecat consectetur incididunt. Amet proident ullamco officia sunt ad sunt sit quis minim. Amet quis amet do elit qui ipsum in.\r\n",
+    "registered": "2014-01-17T18:06:57 -01:00",
+    "latitude": 43.378224,
+    "longitude": 176.44602,
+    "tags": [
+      "qui",
+      "occaecat",
+      "duis",
+      "incididunt",
+      "excepteur",
+      "labore",
+      "fugiat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Yvette Holt"
+      },
+      {
+        "id": 1,
+        "name": "Diane Sharp"
+      },
+      {
+        "id": 2,
+        "name": "Morin Rowe"
+      }
+    ],
+    "greeting": "Hello, Jana Horton! You have 7 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 47,
+    "guid": "0e8df74b-aa2d-4b3b-8bdc-24af1def021a",
+    "isActive": false,
+    "balance": "$1,267.90",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "green",
+    "name": "Yolanda Rogers",
+    "gender": "female",
+    "company": "RONELON",
+    "address": "159 Stuart Street, Brenton, Iowa, 1880",
+    "about": "Tempor esse et aliqua esse irure minim commodo ullamco ea. Sunt ad anim nisi qui ut cillum. Dolor proident exercitation est adipisicing elit aliquip mollit pariatur ad ex elit anim esse. Et ad irure veniam irure nostrud proident culpa anim ea deserunt sit. Dolor excepteur aliqua in dolore aute eiusmod ea est consectetur.\r\n",
+    "registered": "2014-03-27T04:44:16 -01:00",
+    "latitude": -88.062899,
+    "longitude": 71.323626,
+    "tags": [
+      "occaecat",
+      "incididunt",
+      "deserunt",
+      "minim",
+      "consequat",
+      "enim",
+      "culpa"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bender Mcfarland"
+      },
+      {
+        "id": 1,
+        "name": "Cherie Blanchard"
+      },
+      {
+        "id": 2,
+        "name": "Kaufman Potter"
+      }
+    ],
+    "greeting": "Hello, Yolanda Rogers! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 48,
+    "guid": "0f9038e2-b4a5-4d36-aa82-ca3a409fb8fb",
+    "isActive": true,
+    "balance": "$2,493.13",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "brown",
+    "name": "Hood Gillespie",
+    "gender": "male",
+    "company": "ISODRIVE",
+    "address": "115 Norman Avenue, Loveland, Illinois, 7679",
+    "about": "Anim proident exercitation aute commodo velit duis esse laboris ad incididunt ut proident sit officia. Tempor nostrud cillum esse consectetur commodo qui nostrud do. Eiusmod ut enim consequat cillum voluptate voluptate anim ullamco irure do enim Lorem quis commodo.\r\n",
+    "registered": "2014-03-01T04:41:00 -01:00",
+    "latitude": 1.411013,
+    "longitude": 45.030233,
+    "tags": [
+      "consectetur",
+      "occaecat",
+      "qui",
+      "eu",
+      "non",
+      "non",
+      "elit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Swanson Glenn"
+      },
+      {
+        "id": 1,
+        "name": "Cain Rich"
+      },
+      {
+        "id": 2,
+        "name": "Josefa Holloway"
+      }
+    ],
+    "greeting": "Hello, Hood Gillespie! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 49,
+    "guid": "8253b02a-d31d-46fb-8937-4ac81c6de333",
+    "isActive": false,
+    "balance": "$2,186.97",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "brown",
+    "name": "Ferguson Gordon",
+    "gender": "male",
+    "company": "KONGLE",
+    "address": "964 Kings Place, Clarksburg, Virginia, 9708",
+    "about": "Nulla commodo esse id aliquip eu. Nulla officia consectetur pariatur enim fugiat eu laborum culpa dolor tempor nulla. Aute culpa nostrud nisi adipisicing ipsum consequat exercitation ad reprehenderit. Pariatur id occaecat dolore non est minim ipsum cupidatat proident excepteur. Culpa ut minim id pariatur elit culpa exercitation irure reprehenderit nostrud magna adipisicing duis. Reprehenderit consectetur culpa cupidatat enim elit.\r\n",
+    "registered": "2014-05-30T03:07:37 -02:00",
+    "latitude": 15.44445,
+    "longitude": 17.743487,
+    "tags": [
+      "dolore",
+      "aliquip",
+      "commodo",
+      "occaecat",
+      "voluptate",
+      "qui",
+      "ut"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sanford Goff"
+      },
+      {
+        "id": 1,
+        "name": "Burks Velazquez"
+      },
+      {
+        "id": 2,
+        "name": "Crystal Hinton"
+      }
+    ],
+    "greeting": "Hello, Ferguson Gordon! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 50,
+    "guid": "8dce6586-8010-4072-97e6-8936c2f24ab0",
+    "isActive": true,
+    "balance": "$1,289.97",
+    "picture": "http://placehold.it/32x32",
+    "age": 25,
+    "eyeColor": "blue",
+    "name": "Francis Logan",
+    "gender": "male",
+    "company": "COMTOUR",
+    "address": "614 Overbaugh Place, Kilbourne, Delaware, 5387",
+    "about": "Eiusmod officia elit incididunt aute reprehenderit dolore culpa ea mollit nostrud et. Commodo laborum aliqua fugiat consectetur. Anim excepteur ad commodo non proident labore ad voluptate aliqua elit et excepteur cupidatat. Aliquip aute anim eu quis voluptate ipsum ad reprehenderit enim. Ad adipisicing commodo Lorem ad dolor. Et elit proident eu occaecat laboris cupidatat anim. Commodo consectetur fugiat laborum esse quis cillum aliquip.\r\n",
+    "registered": "2014-04-30T02:09:36 -02:00",
+    "latitude": 25.592851,
+    "longitude": 93.071978,
+    "tags": [
+      "proident",
+      "occaecat",
+      "fugiat",
+      "sit",
+      "nisi",
+      "quis",
+      "qui"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Atkins Gomez"
+      },
+      {
+        "id": 1,
+        "name": "Holmes Fernandez"
+      },
+      {
+        "id": 2,
+        "name": "Katrina Pierce"
+      }
+    ],
+    "greeting": "Hello, Francis Logan! You have 7 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 51,
+    "guid": "8dbfa109-8861-4326-b094-1796d9a57f75",
+    "isActive": true,
+    "balance": "$3,734.07",
+    "picture": "http://placehold.it/32x32",
+    "age": 25,
+    "eyeColor": "green",
+    "name": "Bean Mejia",
+    "gender": "male",
+    "company": "UXMOX",
+    "address": "167 Colby Court, National, Missouri, 6726",
+    "about": "Adipisicing ad do tempor anim sunt deserunt commodo consequat consectetur commodo ut ut. Tempor Lorem ea pariatur nostrud ea dolor culpa. Dolore nostrud dolore dolore aute irure laboris. Magna sunt occaecat laborum est consectetur.\r\n",
+    "registered": "2014-01-17T23:03:36 -01:00",
+    "latitude": 39.195905,
+    "longitude": -56.985216,
+    "tags": [
+      "culpa",
+      "consectetur",
+      "minim",
+      "ut",
+      "ad",
+      "incididunt",
+      "quis"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sawyer Frank"
+      },
+      {
+        "id": 1,
+        "name": "Peterson Cain"
+      },
+      {
+        "id": 2,
+        "name": "Nadine Gibbs"
+      }
+    ],
+    "greeting": "Hello, Bean Mejia! You have 9 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 52,
+    "guid": "3b0e32e7-2f23-4931-a3d1-ef3132c1c9da",
+    "isActive": true,
+    "balance": "$1,048.41",
+    "picture": "http://placehold.it/32x32",
+    "age": 40,
+    "eyeColor": "blue",
+    "name": "Bates Porter",
+    "gender": "male",
+    "company": "MANUFACT",
+    "address": "487 Irving Place, Mahtowa, Montana, 6259",
+    "about": "Est excepteur nulla anim consequat quis fugiat sit pariatur qui dolore laborum consectetur Lorem nulla. Laborum fugiat exercitation enim magna ut id dolore aliqua dolor in laboris labore ad incididunt. Ad ipsum fugiat cillum velit in non tempor in dolore cillum consequat quis.\r\n",
+    "registered": "2014-02-03T20:20:23 -01:00",
+    "latitude": 19.543599,
+    "longitude": -42.379181,
+    "tags": [
+      "ipsum",
+      "eiusmod",
+      "cupidatat",
+      "ea",
+      "veniam",
+      "cillum",
+      "nulla"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Kelli Johnston"
+      },
+      {
+        "id": 1,
+        "name": "Vickie Williams"
+      },
+      {
+        "id": 2,
+        "name": "Deana Cobb"
+      }
+    ],
+    "greeting": "Hello, Bates Porter! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 53,
+    "guid": "5d79c129-b426-4f76-8d66-5611721f0578",
+    "isActive": false,
+    "balance": "$1,677.94",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "blue",
+    "name": "Ernestine Dominguez",
+    "gender": "female",
+    "company": "FURNITECH",
+    "address": "527 Cass Place, Bradenville, Oregon, 6049",
+    "about": "Ipsum dolor mollit et enim cillum qui aliquip ex. Cillum officia sit quis tempor. Velit labore adipisicing duis do sint in ea. Amet reprehenderit in dolore voluptate ullamco non occaecat do nulla elit. Anim non ipsum culpa ullamco nisi quis laboris aute cupidatat Lorem laborum nulla officia.\r\n",
+    "registered": "2014-05-27T16:14:17 -02:00",
+    "latitude": -24.335251,
+    "longitude": -158.055584,
+    "tags": [
+      "nostrud",
+      "voluptate",
+      "quis",
+      "officia",
+      "amet",
+      "consectetur",
+      "cupidatat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Morgan Carlson"
+      },
+      {
+        "id": 1,
+        "name": "Mclean Parrish"
+      },
+      {
+        "id": 2,
+        "name": "Pittman Leblanc"
+      }
+    ],
+    "greeting": "Hello, Ernestine Dominguez! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 54,
+    "guid": "1ba3cfa6-5062-4954-a5db-b7392e66aecb",
+    "isActive": false,
+    "balance": "$2,124.23",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "brown",
+    "name": "Violet Cantu",
+    "gender": "female",
+    "company": "LIMAGE",
+    "address": "220 Garden Place, Magnolia, Utah, 2762",
+    "about": "Dolore excepteur officia ipsum ipsum duis ipsum qui. Minim fugiat quis dolor irure. Et nulla commodo irure eu in aliquip. Reprehenderit dolor adipisicing sit laboris ea cupidatat magna consectetur ad ad consectetur exercitation sunt. Duis in aliquip culpa in eu aute elit consequat ad enim aliqua dolore consectetur culpa.\r\n",
+    "registered": "2014-01-21T10:13:23 -01:00",
+    "latitude": -80.374056,
+    "longitude": -169.452566,
+    "tags": [
+      "esse",
+      "amet",
+      "nisi",
+      "Lorem",
+      "ipsum",
+      "excepteur",
+      "nulla"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Coleen Trujillo"
+      },
+      {
+        "id": 1,
+        "name": "Valerie Knight"
+      },
+      {
+        "id": 2,
+        "name": "Natalie Bowers"
+      }
+    ],
+    "greeting": "Hello, Violet Cantu! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 55,
+    "guid": "0ac411ac-6d8b-429a-a188-66b81bd676e3",
+    "isActive": true,
+    "balance": "$1,462.39",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "brown",
+    "name": "Sanchez Oneil",
+    "gender": "male",
+    "company": "CINCYR",
+    "address": "176 Voorhies Avenue, Ellerslie, West Virginia, 2352",
+    "about": "Non adipisicing pariatur officia est adipisicing culpa eiusmod esse occaecat culpa id voluptate culpa. Elit mollit est quis pariatur est esse anim culpa ut reprehenderit excepteur et. Eu exercitation sit aliquip do minim proident excepteur deserunt ad sit est cillum qui. Sit fugiat amet aliqua veniam deserunt ex veniam irure sint. Dolore nisi irure commodo ad eu elit do quis deserunt veniam mollit commodo do. Adipisicing est officia aute aliquip nulla. Amet est adipisicing consequat voluptate irure veniam consectetur enim ullamco.\r\n",
+    "registered": "2014-02-27T07:34:07 -01:00",
+    "latitude": 37.00743,
+    "longitude": -115.416298,
+    "tags": [
+      "elit",
+      "laboris",
+      "do",
+      "Lorem",
+      "non",
+      "pariatur",
+      "deserunt"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Dorthy Hayden"
+      },
+      {
+        "id": 1,
+        "name": "Luz Hawkins"
+      },
+      {
+        "id": 2,
+        "name": "Mills Sears"
+      }
+    ],
+    "greeting": "Hello, Sanchez Oneil! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 56,
+    "guid": "aa8e6dd5-72d6-48c0-8f23-9d80cf23ecc9",
+    "isActive": true,
+    "balance": "$1,748.82",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "blue",
+    "name": "Duncan Vega",
+    "gender": "male",
+    "company": "MAKINGWAY",
+    "address": "108 Brevoort Place, Warsaw, South Carolina, 8629",
+    "about": "Eiusmod id qui laboris aute proident. Duis irure pariatur consequat amet ad tempor magna ut aliqua proident exercitation. Excepteur ex irure ullamco et ullamco aliquip proident. Velit laborum nulla duis sit officia enim culpa adipisicing incididunt reprehenderit laboris consequat qui. Incididunt exercitation exercitation irure tempor eu fugiat cillum in. Id occaecat cillum nulla minim do cillum ea fugiat.\r\n",
+    "registered": "2014-05-07T19:03:39 -02:00",
+    "latitude": -44.145893,
+    "longitude": 134.923346,
+    "tags": [
+      "aliqua",
+      "id",
+      "velit",
+      "irure",
+      "cupidatat",
+      "duis",
+      "deserunt"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Leonor Baxter"
+      },
+      {
+        "id": 1,
+        "name": "Tabitha Clements"
+      },
+      {
+        "id": 2,
+        "name": "Ballard Mccullough"
+      }
+    ],
+    "greeting": "Hello, Duncan Vega! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 57,
+    "guid": "81320e47-53c5-47ca-853a-4b070beba9c2",
+    "isActive": true,
+    "balance": "$3,606.22",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "green",
+    "name": "Parsons Yang",
+    "gender": "male",
+    "company": "MICROLUXE",
+    "address": "529 Anna Court, Cuylerville, Oklahoma, 2412",
+    "about": "Laboris irure sint nostrud dolore nulla mollit duis cupidatat ut labore dolor. Consequat magna non ex dolor aliquip ea Lorem esse mollit. Commodo excepteur nostrud magna tempor pariatur elit est eiusmod mollit.\r\n",
+    "registered": "2014-01-04T09:43:05 -01:00",
+    "latitude": -21.526041,
+    "longitude": -149.854927,
+    "tags": [
+      "ad",
+      "deserunt",
+      "amet",
+      "laboris",
+      "id",
+      "minim",
+      "irure"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Verna Gilbert"
+      },
+      {
+        "id": 1,
+        "name": "Noel Hudson"
+      },
+      {
+        "id": 2,
+        "name": "April Bell"
+      }
+    ],
+    "greeting": "Hello, Parsons Yang! You have 2 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 58,
+    "guid": "a1fe594f-63e1-479e-b77d-215ef84c9d75",
+    "isActive": false,
+    "balance": "$1,966.25",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "brown",
+    "name": "Bettye Hendrix",
+    "gender": "female",
+    "company": "ROTODYNE",
+    "address": "142 Richards Street, Avalon, California, 562",
+    "about": "Cupidatat enim magna non id consequat id cupidatat enim ea. Ipsum cupidatat excepteur laborum Lorem proident dolor in aliquip. Fugiat ea non labore ullamco qui amet mollit. Dolore consequat qui excepteur id dolor culpa dolor.\r\n",
+    "registered": "2014-04-26T19:29:40 -02:00",
+    "latitude": 48.034054,
+    "longitude": 88.026949,
+    "tags": [
+      "laboris",
+      "exercitation",
+      "adipisicing",
+      "aliqua",
+      "reprehenderit",
+      "dolor",
+      "duis"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Skinner Woodard"
+      },
+      {
+        "id": 1,
+        "name": "May Vaughan"
+      },
+      {
+        "id": 2,
+        "name": "Ware Carpenter"
+      }
+    ],
+    "greeting": "Hello, Bettye Hendrix! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 59,
+    "guid": "9dafe25b-1512-4718-8973-ba574ac17624",
+    "isActive": false,
+    "balance": "$3,204.12",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "green",
+    "name": "Jenkins Barrett",
+    "gender": "male",
+    "company": "MOBILDATA",
+    "address": "850 Varick Avenue, Cassel, Louisiana, 6242",
+    "about": "Cillum est eu exercitation aliqua in qui et et. Nulla in deserunt laborum velit. Elit occaecat occaecat id aliqua et et incididunt duis laboris ut occaecat aliqua ad. Voluptate eu elit esse veniam pariatur laboris nisi nisi excepteur cupidatat ipsum reprehenderit. Culpa consectetur cillum aliquip irure et non esse officia. Velit aliqua labore voluptate nostrud nostrud aliquip dolor adipisicing ea Lorem velit excepteur sit. Ullamco sunt minim officia amet.\r\n",
+    "registered": "2014-02-21T02:30:07 -01:00",
+    "latitude": -27.006112,
+    "longitude": 144.509897,
+    "tags": [
+      "Lorem",
+      "esse",
+      "laborum",
+      "deserunt",
+      "laboris",
+      "sint",
+      "ullamco"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Vinson Bentley"
+      },
+      {
+        "id": 1,
+        "name": "Mejia Ballard"
+      },
+      {
+        "id": 2,
+        "name": "Branch Oconnor"
+      }
+    ],
+    "greeting": "Hello, Jenkins Barrett! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 60,
+    "guid": "449cfa41-2c4c-4152-8eb6-88fbd7d1e4f6",
+    "isActive": true,
+    "balance": "$1,301.43",
+    "picture": "http://placehold.it/32x32",
+    "age": 40,
+    "eyeColor": "brown",
+    "name": "Flowers Mcguire",
+    "gender": "male",
+    "company": "ANIMALIA",
+    "address": "805 Lake Avenue, Rodanthe, Alaska, 1251",
+    "about": "Aliquip enim voluptate consectetur proident ad. Non nisi quis consequat elit voluptate consectetur commodo veniam ea. Qui eiusmod velit nostrud nulla do mollit do excepteur. Minim et et exercitation non aliqua nostrud velit et fugiat. Non minim sint veniam nisi non culpa enim duis cupidatat officia laborum et amet. Sunt duis reprehenderit dolore cupidatat. Dolore commodo in aute nostrud aliqua laboris laboris officia consectetur duis.\r\n",
+    "registered": "2014-04-21T05:56:47 -02:00",
+    "latitude": 82.411766,
+    "longitude": 98.77152,
+    "tags": [
+      "adipisicing",
+      "esse",
+      "pariatur",
+      "ea",
+      "pariatur",
+      "aute",
+      "Lorem"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Keri Barry"
+      },
+      {
+        "id": 1,
+        "name": "Aguilar Short"
+      },
+      {
+        "id": 2,
+        "name": "Mendoza Chang"
+      }
+    ],
+    "greeting": "Hello, Flowers Mcguire! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 61,
+    "guid": "b5ecc81d-fce1-473a-a3e1-d7dbbd348b78",
+    "isActive": true,
+    "balance": "$1,170.52",
+    "picture": "http://placehold.it/32x32",
+    "age": 38,
+    "eyeColor": "green",
+    "name": "Rodgers Austin",
+    "gender": "male",
+    "company": "VISUALIX",
+    "address": "330 Miami Court, Carrizo, Northern Mariana Islands, 8692",
+    "about": "Proident reprehenderit occaecat dolore duis ad. Exercitation commodo nostrud in cillum quis nisi nostrud incididunt culpa magna velit ea elit. Incididunt qui occaecat consequat enim do ad ea consectetur deserunt ut et adipisicing sunt tempor.\r\n",
+    "registered": "2014-04-14T03:01:41 -02:00",
+    "latitude": 53.114219,
+    "longitude": 17.890743,
+    "tags": [
+      "labore",
+      "ullamco",
+      "incididunt",
+      "cupidatat",
+      "ad",
+      "ipsum",
+      "excepteur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Fisher Russo"
+      },
+      {
+        "id": 1,
+        "name": "Ortega Clay"
+      },
+      {
+        "id": 2,
+        "name": "Gates Mullins"
+      }
+    ],
+    "greeting": "Hello, Rodgers Austin! You have 6 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 62,
+    "guid": "b6a40064-0a41-40d4-bad5-ec8ea7aec9a8",
+    "isActive": true,
+    "balance": "$2,406.27",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "blue",
+    "name": "Lou Diaz",
+    "gender": "female",
+    "company": "GENESYNK",
+    "address": "788 Coventry Road, Marbury, Georgia, 3806",
+    "about": "Anim amet aliqua incididunt nostrud consequat incididunt cupidatat nisi do aute Lorem nostrud qui. Aliqua aute laboris incididunt fugiat non quis fugiat sint sint culpa in. Culpa ea aliqua in magna magna eiusmod do. Laborum adipisicing magna voluptate est aliquip cillum mollit labore do officia consequat sunt ad esse. Ex dolore consectetur laborum sint esse elit sint cupidatat ad aliqua. Amet est eiusmod laboris enim cillum dolor cillum cupidatat velit aliquip mollit ad quis et.\r\n",
+    "registered": "2014-05-14T09:38:56 -02:00",
+    "latitude": -20.821547,
+    "longitude": 156.833327,
+    "tags": [
+      "adipisicing",
+      "eu",
+      "minim",
+      "cillum",
+      "ullamco",
+      "dolore",
+      "cupidatat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Cochran Donaldson"
+      },
+      {
+        "id": 1,
+        "name": "Rosemarie Fuentes"
+      },
+      {
+        "id": 2,
+        "name": "Dorothy Huff"
+      }
+    ],
+    "greeting": "Hello, Lou Diaz! You have 6 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 63,
+    "guid": "e109d297-ab7e-428e-930a-e5a908cd95f3",
+    "isActive": true,
+    "balance": "$2,037.72",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Tammy Giles",
+    "gender": "female",
+    "company": "GLOBOIL",
+    "address": "118 Newel Street, Sunriver, Pennsylvania, 6127",
+    "about": "Labore duis consequat ipsum commodo Lorem consectetur id enim et minim nostrud aute aliquip. Labore elit sint cupidatat ipsum dolore irure. Id dolor voluptate esse non sint aliqua duis cillum ea laboris sunt ad culpa. Ex anim ex ut id sunt laborum dolore proident sunt sit culpa ex voluptate. Tempor et laboris et eiusmod do.\r\n",
+    "registered": "2014-03-03T19:50:20 -01:00",
+    "latitude": -9.909779,
+    "longitude": -65.843199,
+    "tags": [
+      "esse",
+      "mollit",
+      "dolor",
+      "et",
+      "incididunt",
+      "excepteur",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bethany Roach"
+      },
+      {
+        "id": 1,
+        "name": "Cecile Elliott"
+      },
+      {
+        "id": 2,
+        "name": "Chandra Cortez"
+      }
+    ],
+    "greeting": "Hello, Tammy Giles! You have 9 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 64,
+    "guid": "2aa0a051-33d3-45e2-968c-22cc3130ac98",
+    "isActive": true,
+    "balance": "$3,582.28",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "brown",
+    "name": "Ruiz Bryant",
+    "gender": "male",
+    "company": "ZOLAREX",
+    "address": "275 Visitation Place, Felt, North Carolina, 4857",
+    "about": "Ipsum esse velit aute veniam officia fugiat Lorem eiusmod duis. Irure et sint cillum elit. Est occaecat consectetur nisi sit irure dolor nisi amet fugiat adipisicing nisi sunt esse. Deserunt nostrud est laboris fugiat officia. Tempor ad eiusmod id sint consequat excepteur laboris sint excepteur.\r\n",
+    "registered": "2014-02-22T19:15:22 -01:00",
+    "latitude": 24.32047,
+    "longitude": -77.296588,
+    "tags": [
+      "amet",
+      "excepteur",
+      "incididunt",
+      "eiusmod",
+      "nostrud",
+      "aliqua",
+      "cillum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Susan Hamilton"
+      },
+      {
+        "id": 1,
+        "name": "Minnie Wilkinson"
+      },
+      {
+        "id": 2,
+        "name": "Pearson Baker"
+      }
+    ],
+    "greeting": "Hello, Ruiz Bryant! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 65,
+    "guid": "cb85df28-e7ba-4e61-999b-648b9da62130",
+    "isActive": true,
+    "balance": "$1,005.06",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "blue",
+    "name": "Cecelia Simon",
+    "gender": "female",
+    "company": "BESTO",
+    "address": "128 Bay Street, Dubois, Texas, 3793",
+    "about": "Ipsum et amet adipisicing eiusmod. Sint ipsum commodo dolore ipsum enim. Officia reprehenderit cupidatat enim consequat sit ea est est est tempor incididunt veniam deserunt. Est cupidatat enim dolore laboris proident ut quis cillum magna magna. Irure aliquip duis pariatur commodo consectetur quis minim ipsum. Nostrud laboris laboris pariatur sit minim Lorem.\r\n",
+    "registered": "2014-01-30T06:53:35 -01:00",
+    "latitude": 67.530285,
+    "longitude": 174.896728,
+    "tags": [
+      "ut",
+      "amet",
+      "labore",
+      "proident",
+      "ut",
+      "eiusmod",
+      "labore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Harriet Mcpherson"
+      },
+      {
+        "id": 1,
+        "name": "Neal Rasmussen"
+      },
+      {
+        "id": 2,
+        "name": "Nelda Brooks"
+      }
+    ],
+    "greeting": "Hello, Cecelia Simon! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 66,
+    "guid": "93606162-2c05-4e61-838a-438edda1a96f",
+    "isActive": false,
+    "balance": "$3,035.52",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "green",
+    "name": "Kathleen Wong",
+    "gender": "female",
+    "company": "UNISURE",
+    "address": "615 Pierrepont Street, Chase, Federated States Of Micronesia, 9750",
+    "about": "Commodo ex incididunt voluptate do et ea fugiat deserunt eu culpa. Magna aliqua ut proident non consectetur dolor pariatur anim nostrud. Cillum adipisicing sunt Lorem cupidatat cupidatat duis quis irure minim sint. Exercitation reprehenderit anim sunt qui anim. Ipsum commodo ex pariatur aliquip.\r\n",
+    "registered": "2014-02-09T13:57:09 -01:00",
+    "latitude": 80.596981,
+    "longitude": -48.144951,
+    "tags": [
+      "sit",
+      "proident",
+      "consequat",
+      "veniam",
+      "fugiat",
+      "dolor",
+      "id"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Colon Medina"
+      },
+      {
+        "id": 1,
+        "name": "Mcgowan Drake"
+      },
+      {
+        "id": 2,
+        "name": "Porter Thornton"
+      }
+    ],
+    "greeting": "Hello, Kathleen Wong! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 67,
+    "guid": "3e645c16-5abc-478e-b043-ac37ef834f91",
+    "isActive": true,
+    "balance": "$3,496.41",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "blue",
+    "name": "Marla Santana",
+    "gender": "female",
+    "company": "SHADEASE",
+    "address": "704 Broome Street, Kieler, New Jersey, 463",
+    "about": "Elit cillum sunt minim esse officia. Nostrud sint eiusmod culpa mollit. Sit eu cillum Lorem ex mollit excepteur sit aliqua sit.\r\n",
+    "registered": "2014-03-06T07:43:34 -01:00",
+    "latitude": 67.92188,
+    "longitude": 47.214521,
+    "tags": [
+      "do",
+      "officia",
+      "nulla",
+      "deserunt",
+      "laboris",
+      "labore",
+      "cupidatat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sosa Frost"
+      },
+      

<TRUNCATED>

[14/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/large_130kb.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/large_130kb.json b/fleece-core/src/test/resources/bench/large_130kb.json
deleted file mode 100644
index 3eb3a85..0000000
--- a/fleece-core/src/test/resources/bench/large_130kb.json
+++ /dev/null
@@ -1,4328 +0,0 @@
-[
-  {
-    "id": 0,
-    "guid": "31119a68-58dd-43ec-81d2-2be927f5b445",
-    "isActive": true,
-    "balance": "$2,882.15",
-    "picture": "http://placehold.it/32x32",
-    "age": 28,
-    "eyeColor": "blue",
-    "name": "Rojas Harrington",
-    "gender": "male",
-    "company": "YOGASM",
-    "address": "706 Louisiana Avenue, Suitland, California, 7975",
-    "about": "Tempor eiusmod eu in amet sit occaecat occaecat velit officia sint duis. Ullamco voluptate labore in officia pariatur in ipsum exercitation. Ea nostrud proident aute ad irure mollit. Consectetur veniam dolore dolor commodo laborum consequat veniam labore adipisicing. Do in laboris est exercitation excepteur duis et. Officia consequat labore ullamco excepteur dolore commodo occaecat excepteur qui aliqua Lorem.\r\n",
-    "registered": "2014-02-21T20:14:18 -01:00",
-    "latitude": 39.444802,
-    "longitude": 96.053443,
-    "tags": [
-      "ut",
-      "nulla",
-      "esse",
-      "cillum",
-      "quis",
-      "nulla",
-      "enim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Richmond Wagner"
-      },
-      {
-        "id": 1,
-        "name": "Minerva Leach"
-      },
-      {
-        "id": 2,
-        "name": "Head Washington"
-      }
-    ],
-    "greeting": "Hello, Rojas Harrington! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 1,
-    "guid": "707b227a-077c-41d7-9adc-609810e6694c",
-    "isActive": true,
-    "balance": "$1,457.81",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "green",
-    "name": "Beasley Allen",
-    "gender": "male",
-    "company": "MITROC",
-    "address": "375 Holmes Lane, Layhill, Louisiana, 797",
-    "about": "Excepteur incididunt dolor anim commodo nulla nostrud consectetur consectetur non sunt consectetur elit tempor. Esse do ut ex consectetur sint sit duis dolor ipsum ullamco pariatur. Excepteur ex irure ex exercitation minim ut veniam Lorem amet. Quis sunt ea pariatur eu. Fugiat ea qui exercitation irure. Cupidatat qui officia nulla enim nulla magna veniam cillum do voluptate officia aliqua aute tempor. Qui in laborum adipisicing mollit Lorem reprehenderit ipsum adipisicing laborum qui duis sit occaecat voluptate.\r\n",
-    "registered": "2014-02-10T19:55:02 -01:00",
-    "latitude": -29.903714,
-    "longitude": 81.686263,
-    "tags": [
-      "non",
-      "cillum",
-      "amet",
-      "ad",
-      "aute",
-      "consectetur",
-      "aliqua"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Erickson Buckley"
-      },
-      {
-        "id": 1,
-        "name": "Letha Nash"
-      },
-      {
-        "id": 2,
-        "name": "Marci Watkins"
-      }
-    ],
-    "greeting": "Hello, Beasley Allen! You have 10 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 2,
-    "guid": "524066d5-0a9d-40c7-ae51-68c4f8ba2e69",
-    "isActive": true,
-    "balance": "$3,080.99",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "green",
-    "name": "Tracey Barber",
-    "gender": "female",
-    "company": "CONJURICA",
-    "address": "259 Dewitt Avenue, Dixie, Alaska, 162",
-    "about": "Occaecat est dolor voluptate proident ad ea minim. Est non laborum aute quis excepteur ad minim veniam eiusmod nulla. Adipisicing laborum minim nostrud cillum sit. Sunt minim fugiat consequat veniam eiusmod irure nostrud eu dolore est nulla. Quis nisi labore duis consectetur irure irure est aliqua fugiat elit. Exercitation ullamco in nisi adipisicing consequat.\r\n",
-    "registered": "2014-05-03T15:37:06 -02:00",
-    "latitude": -3.77466,
-    "longitude": -71.850697,
-    "tags": [
-      "enim",
-      "veniam",
-      "sit",
-      "in",
-      "irure",
-      "fugiat",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lee Johns"
-      },
-      {
-        "id": 1,
-        "name": "Sadie Sweeney"
-      },
-      {
-        "id": 2,
-        "name": "Craft Gaines"
-      }
-    ],
-    "greeting": "Hello, Tracey Barber! You have 3 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 3,
-    "guid": "6ce5f0c0-e1a6-4947-8927-05323f362178",
-    "isActive": false,
-    "balance": "$2,566.68",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Ewing Lott",
-    "gender": "male",
-    "company": "BIFLEX",
-    "address": "894 Kiely Place, Callaghan, Northern Mariana Islands, 5864",
-    "about": "Veniam laboris aliquip labore anim do exercitation sunt eu. Nostrud dolor commodo qui incididunt deserunt mollit fugiat minim irure est do veniam consequat. Aute excepteur cupidatat excepteur quis velit ea veniam duis. Incididunt magna cupidatat deserunt do. Velit elit ullamco ullamco pariatur ipsum. Pariatur incididunt eiusmod labore deserunt laborum eiusmod excepteur ipsum. Eiusmod laboris voluptate qui minim irure aliqua laboris consectetur dolor id anim enim proident.\r\n",
-    "registered": "2014-01-26T06:05:59 -01:00",
-    "latitude": -69.732288,
-    "longitude": -7.580134,
-    "tags": [
-      "occaecat",
-      "labore",
-      "pariatur",
-      "tempor",
-      "proident",
-      "consequat",
-      "nostrud"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "West Wiley"
-      },
-      {
-        "id": 1,
-        "name": "Cervantes Reed"
-      },
-      {
-        "id": 2,
-        "name": "Katelyn Nielsen"
-      }
-    ],
-    "greeting": "Hello, Ewing Lott! You have 8 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 4,
-    "guid": "9b83a401-3d6d-4ad4-8e97-5855417a0523",
-    "isActive": true,
-    "balance": "$3,818.75",
-    "picture": "http://placehold.it/32x32",
-    "age": 21,
-    "eyeColor": "green",
-    "name": "Patel Blankenship",
-    "gender": "male",
-    "company": "SOFTMICRO",
-    "address": "438 Brighton Court, Wacissa, Georgia, 8476",
-    "about": "Fugiat labore consequat cillum laboris anim. Aliqua nisi Lorem labore amet elit cillum anim occaecat irure cupidatat exercitation. Amet officia officia laboris cillum sit officia tempor quis esse eiusmod Lorem est. Pariatur ex consectetur cupidatat ut elit ipsum et. Quis sint anim sit dolor ad anim velit sunt ex laborum. Lorem dolor nisi ad non incididunt ullamco.\r\n",
-    "registered": "2014-02-10T21:41:29 -01:00",
-    "latitude": 11.17367,
-    "longitude": 113.960197,
-    "tags": [
-      "sint",
-      "reprehenderit",
-      "eu",
-      "veniam",
-      "aute",
-      "commodo",
-      "nisi"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Luella Holder"
-      },
-      {
-        "id": 1,
-        "name": "Bettie Morin"
-      },
-      {
-        "id": 2,
-        "name": "Morse Boyd"
-      }
-    ],
-    "greeting": "Hello, Patel Blankenship! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 5,
-    "guid": "c56196b1-b9e7-4bf1-8068-952da87c9d86",
-    "isActive": true,
-    "balance": "$3,819.38",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "blue",
-    "name": "Mcguire Barker",
-    "gender": "male",
-    "company": "NURALI",
-    "address": "153 Verona Street, Floriston, Pennsylvania, 5399",
-    "about": "Voluptate non irure id minim proident sit. In ullamco laborum exercitation excepteur commodo esse aliquip velit ipsum tempor nisi. Est ullamco ut est aute reprehenderit.\r\n",
-    "registered": "2014-03-18T10:54:27 -01:00",
-    "latitude": 77.996689,
-    "longitude": -44.938304,
-    "tags": [
-      "non",
-      "veniam",
-      "anim",
-      "nisi",
-      "excepteur",
-      "nisi",
-      "Lorem"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Patton Lester"
-      },
-      {
-        "id": 1,
-        "name": "Cathy Irwin"
-      },
-      {
-        "id": 2,
-        "name": "Dionne Glover"
-      }
-    ],
-    "greeting": "Hello, Mcguire Barker! You have 3 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 6,
-    "guid": "8420cdc7-d386-4f31-be3d-47b4e20d71e5",
-    "isActive": false,
-    "balance": "$2,031.14",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Erma Kim",
-    "gender": "female",
-    "company": "UNDERTAP",
-    "address": "136 Battery Avenue, Calverton, North Carolina, 9576",
-    "about": "Ea laboris ut mollit aute quis velit commodo Lorem in. Consequat aute in ad incididunt cupidatat ad do qui ad consectetur commodo pariatur est laborum. Esse et officia reprehenderit deserunt excepteur officia irure eu elit deserunt nisi sint. Duis dolor sunt deserunt nulla aliquip aute pariatur sunt aute aliquip. Ipsum mollit id sint minim culpa commodo incididunt aute est minim velit sunt labore sit.\r\n",
-    "registered": "2014-02-06T18:48:05 -01:00",
-    "latitude": -73.346179,
-    "longitude": 23.035911,
-    "tags": [
-      "magna",
-      "tempor",
-      "sit",
-      "cupidatat",
-      "sint",
-      "reprehenderit",
-      "voluptate"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Ollie Richard"
-      },
-      {
-        "id": 1,
-        "name": "Lydia Dawson"
-      },
-      {
-        "id": 2,
-        "name": "Mccoy Dickerson"
-      }
-    ],
-    "greeting": "Hello, Erma Kim! You have 8 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 7,
-    "guid": "d383c2e1-1db0-419b-ae25-010ab076b5b0",
-    "isActive": true,
-    "balance": "$1,641.47",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "green",
-    "name": "Ball Riggs",
-    "gender": "male",
-    "company": "ARTIQ",
-    "address": "290 Hyman Court, Norris, Texas, 5506",
-    "about": "Voluptate esse elit sunt exercitation. Amet enim sint mollit qui ex. Anim aute mollit officia elit enim. Officia incididunt et occaecat esse velit amet sunt sint minim. Consectetur occaecat commodo deserunt laboris reprehenderit irure sit laboris non non incididunt sunt est. Lorem magna anim dolor enim enim aliqua pariatur ex cupidatat enim ut anim aliquip tempor.\r\n",
-    "registered": "2014-02-02T08:03:27 -01:00",
-    "latitude": 13.969932,
-    "longitude": 52.716571,
-    "tags": [
-      "dolor",
-      "sint",
-      "occaecat",
-      "ipsum",
-      "elit",
-      "duis",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Jodie Anthony"
-      },
-      {
-        "id": 1,
-        "name": "Cooke Gilliam"
-      },
-      {
-        "id": 2,
-        "name": "Jimmie Pace"
-      }
-    ],
-    "greeting": "Hello, Ball Riggs! You have 8 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 8,
-    "guid": "b8e03355-2a1a-4c21-b2cc-30d88177e5c4",
-    "isActive": true,
-    "balance": "$1,184.70",
-    "picture": "http://placehold.it/32x32",
-    "age": 20,
-    "eyeColor": "brown",
-    "name": "Albert Franks",
-    "gender": "male",
-    "company": "NIPAZ",
-    "address": "612 Atlantic Avenue, Cazadero, Federated States Of Micronesia, 1512",
-    "about": "Fugiat veniam id eiusmod sit aliqua ut labore culpa cillum anim labore laboris incididunt. Non ad aliquip tempor minim exercitation. Nostrud deserunt ea laborum reprehenderit sit in occaecat proident ut Lorem esse. Sunt eiusmod laborum ullamco aliquip mollit eiusmod. Cupidatat laborum pariatur quis eiusmod duis nisi amet magna excepteur aliqua qui. Ut exercitation proident enim sint. In quis sit id qui nostrud voluptate tempor ex in deserunt non laboris.\r\n",
-    "registered": "2014-06-04T19:07:40 -02:00",
-    "latitude": 3.397634,
-    "longitude": 49.085583,
-    "tags": [
-      "ut",
-      "sit",
-      "sit",
-      "dolor",
-      "excepteur",
-      "ipsum",
-      "id"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sharon Randall"
-      },
-      {
-        "id": 1,
-        "name": "Johns Moreno"
-      },
-      {
-        "id": 2,
-        "name": "Lillian Tran"
-      }
-    ],
-    "greeting": "Hello, Albert Franks! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 9,
-    "guid": "79f3ee07-cc4d-4dae-8169-dd3993211516",
-    "isActive": true,
-    "balance": "$2,267.42",
-    "picture": "http://placehold.it/32x32",
-    "age": 21,
-    "eyeColor": "green",
-    "name": "Kristi Wiggins",
-    "gender": "female",
-    "company": "ENAUT",
-    "address": "359 Berriman Street, Herbster, New Jersey, 6663",
-    "about": "Deserunt anim et elit ea eu voluptate cillum anim. Laborum labore anim velit mollit ea Lorem nostrud duis non nostrud ut excepteur laborum aliquip. Sint do elit quis eiusmod labore deserunt incididunt esse. Laboris reprehenderit nisi anim esse aute irure ipsum quis proident. Dolore veniam Lorem incididunt aute.\r\n",
-    "registered": "2014-04-08T22:57:51 -02:00",
-    "latitude": -49.48219,
-    "longitude": -51.916414,
-    "tags": [
-      "cillum",
-      "fugiat",
-      "occaecat",
-      "duis",
-      "nostrud",
-      "id",
-      "aliquip"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Diana Hobbs"
-      },
-      {
-        "id": 1,
-        "name": "Perry Mcdaniel"
-      },
-      {
-        "id": 2,
-        "name": "Terry Bean"
-      }
-    ],
-    "greeting": "Hello, Kristi Wiggins! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 10,
-    "guid": "c2eba44a-29d2-44ee-a7d6-490dbd1a71d3",
-    "isActive": false,
-    "balance": "$3,840.61",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "brown",
-    "name": "Rice Douglas",
-    "gender": "male",
-    "company": "ZOARERE",
-    "address": "110 Dorset Street, Brewster, Michigan, 1702",
-    "about": "Officia reprehenderit mollit amet pariatur pariatur veniam amet deserunt. Cupidatat ex pariatur nostrud in deserunt mollit nostrud ex deserunt. Nulla mollit est et occaecat enim enim. Amet minim reprehenderit velit in adipisicing id commodo.\r\n",
-    "registered": "2014-06-09T19:49:59 -02:00",
-    "latitude": 53.130366,
-    "longitude": -69.354215,
-    "tags": [
-      "ea",
-      "cupidatat",
-      "magna",
-      "sit",
-      "in",
-      "incididunt",
-      "irure"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Jewel Duran"
-      },
-      {
-        "id": 1,
-        "name": "Steele Jimenez"
-      },
-      {
-        "id": 2,
-        "name": "Walsh Walls"
-      }
-    ],
-    "greeting": "Hello, Rice Douglas! You have 10 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 11,
-    "guid": "9394c1b7-c05c-4260-82ae-6464d480026b",
-    "isActive": false,
-    "balance": "$3,094.53",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "blue",
-    "name": "Wolf Beasley",
-    "gender": "male",
-    "company": "DUFLEX",
-    "address": "307 Suydam Place, Cowiche, Maryland, 7500",
-    "about": "In et amet ex eiusmod eu ipsum cupidatat aliqua tempor anim. Non velit nostrud nisi magna do. Enim cillum aute enim excepteur consequat mollit proident irure aliquip nisi incididunt. Deserunt labore et elit labore in duis pariatur id quis cupidatat labore. Pariatur ipsum laboris voluptate incididunt.\r\n",
-    "registered": "2014-03-29T17:27:17 -01:00",
-    "latitude": 37.737167,
-    "longitude": -38.884315,
-    "tags": [
-      "tempor",
-      "eu",
-      "est",
-      "sit",
-      "id",
-      "duis",
-      "mollit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Adams Conrad"
-      },
-      {
-        "id": 1,
-        "name": "Muriel Mercer"
-      },
-      {
-        "id": 2,
-        "name": "Rosetta Cohen"
-      }
-    ],
-    "greeting": "Hello, Wolf Beasley! You have 2 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 12,
-    "guid": "5db3e12d-5daf-4a19-9b01-51af34d083dd",
-    "isActive": false,
-    "balance": "$2,018.49",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "brown",
-    "name": "Hester Knowles",
-    "gender": "male",
-    "company": "PLASMOX",
-    "address": "634 Joralemon Street, Norfolk, Florida, 2771",
-    "about": "Amet eiusmod ea Lorem et officia et Lorem dolor velit. Tempor aliquip laboris consectetur reprehenderit do aliquip. Excepteur tempor anim eu enim dolore anim reprehenderit culpa occaecat amet occaecat minim fugiat laborum. Lorem eiusmod anim in nisi proident aliqua commodo cupidatat irure eiusmod quis exercitation laboris. Minim ipsum cupidatat esse Lorem commodo sit. Elit reprehenderit cillum mollit culpa laboris sint occaecat eu nostrud id.\r\n",
-    "registered": "2014-03-05T14:32:02 -01:00",
-    "latitude": 0.647737,
-    "longitude": -137.287789,
-    "tags": [
-      "voluptate",
-      "fugiat",
-      "in",
-      "ad",
-      "exercitation",
-      "incididunt",
-      "sunt"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Justice Vang"
-      },
-      {
-        "id": 1,
-        "name": "Coleman Munoz"
-      },
-      {
-        "id": 2,
-        "name": "Wilkerson Grimes"
-      }
-    ],
-    "greeting": "Hello, Hester Knowles! You have 6 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 13,
-    "guid": "0717adec-d070-4ce2-83b9-0ba695ee7b07",
-    "isActive": false,
-    "balance": "$3,183.67",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Gillespie Cannon",
-    "gender": "male",
-    "company": "TECHTRIX",
-    "address": "864 Suydam Street, Tooleville, Palau, 1930",
-    "about": "Amet excepteur veniam ex deserunt est dolore qui irure quis amet sint aute. Quis consequat occaecat ad ipsum pariatur labore commodo ipsum aliquip do laborum proident. Reprehenderit id ea eiusmod adipisicing do dolor nostrud cupidatat minim.\r\n",
-    "registered": "2014-05-30T08:18:23 -02:00",
-    "latitude": 66.135817,
-    "longitude": 8.149644,
-    "tags": [
-      "do",
-      "dolore",
-      "aliqua",
-      "laboris",
-      "dolor",
-      "consectetur",
-      "duis"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sabrina Dunlap"
-      },
-      {
-        "id": 1,
-        "name": "Benjamin Henson"
-      },
-      {
-        "id": 2,
-        "name": "Kaitlin Landry"
-      }
-    ],
-    "greeting": "Hello, Gillespie Cannon! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 14,
-    "guid": "6677d19c-8f50-4486-9225-3f9ed92c2c85",
-    "isActive": false,
-    "balance": "$1,576.54",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "brown",
-    "name": "Joann Gibson",
-    "gender": "female",
-    "company": "AUTOMON",
-    "address": "436 Conduit Boulevard, Ogema, Idaho, 2506",
-    "about": "Veniam laboris velit dolore sint enim qui dolor culpa eu culpa enim incididunt ad nostrud. Irure duis tempor velit sit sit fugiat enim consectetur proident ad elit. Et aliqua minim ut eiusmod sit proident excepteur adipisicing dolor magna.\r\n",
-    "registered": "2014-03-16T23:45:03 -01:00",
-    "latitude": 11.216845,
-    "longitude": -162.05913,
-    "tags": [
-      "proident",
-      "ut",
-      "exercitation",
-      "ullamco",
-      "labore",
-      "incididunt",
-      "velit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Hattie Waters"
-      },
-      {
-        "id": 1,
-        "name": "Acosta Hughes"
-      },
-      {
-        "id": 2,
-        "name": "Kidd Bush"
-      }
-    ],
-    "greeting": "Hello, Joann Gibson! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 15,
-    "guid": "60bdb9d5-934e-45cd-9d01-961b69db6e82",
-    "isActive": false,
-    "balance": "$2,824.27",
-    "picture": "http://placehold.it/32x32",
-    "age": 28,
-    "eyeColor": "green",
-    "name": "Gould Webb",
-    "gender": "male",
-    "company": "ZERBINA",
-    "address": "274 Powers Street, Temperanceville, Wisconsin, 6887",
-    "about": "Duis magna aliqua aliquip officia voluptate tempor officia elit deserunt esse ipsum tempor. Proident amet in laborum Lorem amet dolore. Occaecat proident consequat nisi sint ipsum pariatur anim tempor esse quis commodo velit. Nulla non sint mollit excepteur dolor tempor nulla non mollit. Adipisicing esse mollit in cillum magna nulla anim ullamco esse.\r\n",
-    "registered": "2014-06-30T00:55:27 -02:00",
-    "latitude": -48.469436,
-    "longitude": -149.179486,
-    "tags": [
-      "dolore",
-      "dolore",
-      "minim",
-      "cillum",
-      "esse",
-      "do",
-      "anim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lillie Cabrera"
-      },
-      {
-        "id": 1,
-        "name": "Fuentes Leonard"
-      },
-      {
-        "id": 2,
-        "name": "Franco Newton"
-      }
-    ],
-    "greeting": "Hello, Gould Webb! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 16,
-    "guid": "363e0486-3b7b-462a-a462-adfda0638e65",
-    "isActive": true,
-    "balance": "$3,934.16",
-    "picture": "http://placehold.it/32x32",
-    "age": 40,
-    "eyeColor": "blue",
-    "name": "Marion Harris",
-    "gender": "female",
-    "company": "ENTOGROK",
-    "address": "761 Osborn Street, Chicopee, Puerto Rico, 3587",
-    "about": "Eiusmod tempor anim consectetur excepteur ut reprehenderit elit laborum ex Lorem culpa deserunt eiusmod ut. In nisi voluptate consectetur deserunt est. Non laborum adipisicing id veniam irure amet id veniam.\r\n",
-    "registered": "2014-05-27T05:09:48 -02:00",
-    "latitude": -44.462929,
-    "longitude": 122.06393,
-    "tags": [
-      "eiusmod",
-      "nisi",
-      "minim",
-      "quis",
-      "dolor",
-      "ad",
-      "et"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Haley Jacobson"
-      },
-      {
-        "id": 1,
-        "name": "Corrine Mendez"
-      },
-      {
-        "id": 2,
-        "name": "Flores Dale"
-      }
-    ],
-    "greeting": "Hello, Marion Harris! You have 7 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 17,
-    "guid": "07a6abba-cbaf-4ab3-b438-24a009595a2b",
-    "isActive": false,
-    "balance": "$3,234.43",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "blue",
-    "name": "Ratliff Ratliff",
-    "gender": "male",
-    "company": "MARQET",
-    "address": "493 Johnson Street, Muir, Maine, 7224",
-    "about": "Minim sunt incididunt eu aliquip. Dolore aute voluptate amet officia eiusmod ullamco ullamco nulla consectetur. Ut aliqua quis excepteur occaecat magna Lorem magna cupidatat fugiat esse. Mollit sint nisi pariatur dolore laborum cupidatat ad quis deserunt proident excepteur. Cupidatat ea quis veniam consectetur consequat Lorem.\r\n",
-    "registered": "2014-02-01T08:37:40 -01:00",
-    "latitude": 64.797783,
-    "longitude": 21.30513,
-    "tags": [
-      "adipisicing",
-      "excepteur",
-      "non",
-      "mollit",
-      "cillum",
-      "mollit",
-      "ea"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Saunders Knapp"
-      },
-      {
-        "id": 1,
-        "name": "Carter Conley"
-      },
-      {
-        "id": 2,
-        "name": "Miles Christian"
-      }
-    ],
-    "greeting": "Hello, Ratliff Ratliff! You have 6 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 18,
-    "guid": "63e9cae8-a275-4c27-b649-d0b84583881f",
-    "isActive": false,
-    "balance": "$3,845.93",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "brown",
-    "name": "Gertrude Dennis",
-    "gender": "female",
-    "company": "ISOPLEX",
-    "address": "690 Tech Place, Riner, Washington, 5790",
-    "about": "Ea labore elit velit consequat mollit dolor consequat deserunt eiusmod. Cillum amet exercitation aliquip laborum consequat amet ex deserunt ipsum proident ullamco. Irure ad ad elit officia aliqua laborum ad veniam aliquip est non sunt magna. Consectetur culpa esse officia tempor reprehenderit adipisicing.\r\n",
-    "registered": "2014-03-12T03:14:00 -01:00",
-    "latitude": 89.204373,
-    "longitude": -91.487508,
-    "tags": [
-      "velit",
-      "non",
-      "ut",
-      "aute",
-      "consequat",
-      "ullamco",
-      "fugiat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Rodriquez Cote"
-      },
-      {
-        "id": 1,
-        "name": "Parrish Townsend"
-      },
-      {
-        "id": 2,
-        "name": "Fitzgerald Cline"
-      }
-    ],
-    "greeting": "Hello, Gertrude Dennis! You have 3 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 19,
-    "guid": "8488845a-d84c-4ab0-9b6e-0f61ec1d8f2f",
-    "isActive": true,
-    "balance": "$3,092.65",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "green",
-    "name": "Booth Walters",
-    "gender": "male",
-    "company": "RENOVIZE",
-    "address": "966 Nixon Court, Farmington, New Hampshire, 9704",
-    "about": "Proident veniam laborum veniam officia fugiat veniam aliquip adipisicing. Est nulla veniam proident ipsum fugiat qui. Nostrud do fugiat ex Lorem labore laborum consequat elit. Ullamco ipsum ut sit officia non laborum eiusmod sit commodo. Minim labore quis ipsum aute voluptate reprehenderit incididunt minim sint commodo reprehenderit. Et culpa voluptate tempor minim veniam esse voluptate proident qui duis magna qui minim adipisicing. Dolore sunt velit esse ex laborum sint tempor dolore adipisicing voluptate culpa.\r\n",
-    "registered": "2014-03-23T04:03:44 -01:00",
-    "latitude": -3.1728,
-    "longitude": -71.674485,
-    "tags": [
-      "ipsum",
-      "dolore",
-      "aliquip",
-      "veniam",
-      "veniam",
-      "cupidatat",
-      "exercitation"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Petersen Adams"
-      },
-      {
-        "id": 1,
-        "name": "Patrica Wheeler"
-      },
-      {
-        "id": 2,
-        "name": "Goff Manning"
-      }
-    ],
-    "greeting": "Hello, Booth Walters! You have 6 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 20,
-    "guid": "3a14f7a5-465a-459c-981d-811c4b3bcabb",
-    "isActive": true,
-    "balance": "$2,389.89",
-    "picture": "http://placehold.it/32x32",
-    "age": 38,
-    "eyeColor": "green",
-    "name": "Goodman Pollard",
-    "gender": "male",
-    "company": "BOINK",
-    "address": "814 Minna Street, Yorklyn, Kansas, 1783",
-    "about": "Incididunt esse nisi excepteur et elit dolore do ea qui duis excepteur et. Est sit eiusmod culpa et ex magna nisi laboris laborum dolore officia et. Occaecat fugiat esse qui dolore aliquip est. Eiusmod mollit proident cillum excepteur occaecat exercitation nisi amet ad commodo. Sit nostrud cillum velit tempor culpa pariatur duis excepteur cillum cillum nisi aliqua cillum. Nostrud cupidatat laborum elit do occaecat et nulla labore eiusmod enim quis ut.\r\n",
-    "registered": "2014-01-30T05:43:57 -01:00",
-    "latitude": -49.438136,
-    "longitude": 77.163106,
-    "tags": [
-      "cupidatat",
-      "pariatur",
-      "elit",
-      "veniam",
-      "pariatur",
-      "id",
-      "eu"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Elise Howe"
-      },
-      {
-        "id": 1,
-        "name": "Cooley Dean"
-      },
-      {
-        "id": 2,
-        "name": "Heath Reeves"
-      }
-    ],
-    "greeting": "Hello, Goodman Pollard! You have 9 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 21,
-    "guid": "b9824725-ad59-4614-ac6a-8a5cb1f4d38f",
-    "isActive": false,
-    "balance": "$3,576.88",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "brown",
-    "name": "Shannon Pearson",
-    "gender": "male",
-    "company": "INTRADISK",
-    "address": "603 Schenck Court, Vincent, Nebraska, 4816",
-    "about": "Duis aliquip pariatur consequat labore laborum reprehenderit culpa voluptate magna. Dolor irure aliqua ullamco ex excepteur ad ut ex incididunt consequat mollit sint voluptate. Cillum sunt nisi dolore aliqua laboris ut et commodo do eu voluptate adipisicing voluptate. Voluptate officia voluptate sint velit. Et velit ad nisi ex id in sint mollit. Anim et adipisicing ullamco veniam eiusmod culpa fugiat esse aliquip tempor consectetur. Minim est consequat labore enim sint.\r\n",
-    "registered": "2014-05-19T09:36:18 -02:00",
-    "latitude": 62.528531,
-    "longitude": -132.572314,
-    "tags": [
-      "elit",
-      "minim",
-      "elit",
-      "elit",
-      "commodo",
-      "quis",
-      "fugiat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Cynthia Stanton"
-      },
-      {
-        "id": 1,
-        "name": "Jennings Kelley"
-      },
-      {
-        "id": 2,
-        "name": "Fulton Vance"
-      }
-    ],
-    "greeting": "Hello, Shannon Pearson! You have 1 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 22,
-    "guid": "ec621505-23ae-4df9-9a23-ca51078ea3e0",
-    "isActive": false,
-    "balance": "$3,025.38",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "green",
-    "name": "Hilda Morrison",
-    "gender": "female",
-    "company": "MANGLO",
-    "address": "249 Rogers Avenue, Gorst, Hawaii, 7109",
-    "about": "Nulla qui velit proident aliqua amet aliquip in. Labore et veniam dolore adipisicing dolore magna irure. Proident sint in qui aliqua consectetur aliqua deserunt proident velit. Aliquip minim nulla dolor do anim pariatur nisi laboris exercitation consequat ipsum velit do id. Ad anim labore consectetur irure et nulla anim voluptate consectetur fugiat.\r\n",
-    "registered": "2014-06-28T05:40:08 -02:00",
-    "latitude": 47.857679,
-    "longitude": 177.50372,
-    "tags": [
-      "enim",
-      "nisi",
-      "dolore",
-      "culpa",
-      "deserunt",
-      "do",
-      "et"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Audra Chan"
-      },
-      {
-        "id": 1,
-        "name": "Angel Marsh"
-      },
-      {
-        "id": 2,
-        "name": "Yates Barron"
-      }
-    ],
-    "greeting": "Hello, Hilda Morrison! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 23,
-    "guid": "83ef2f1a-f8d5-4fc1-9521-b3fc57a83751",
-    "isActive": false,
-    "balance": "$1,160.52",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "blue",
-    "name": "Brewer Hicks",
-    "gender": "male",
-    "company": "PLUTORQUE",
-    "address": "270 Benson Avenue, Downsville, District Of Columbia, 6931",
-    "about": "Duis tempor voluptate minim sint amet cillum anim ullamco quis anim ipsum veniam. Exercitation eiusmod commodo cillum magna ut aute laborum esse. Pariatur exercitation excepteur elit cillum ut sit consequat non nisi cillum officia. Adipisicing aliqua exercitation non velit incididunt quis sint ipsum sunt irure do duis adipisicing Lorem. Elit do aliquip anim exercitation proident velit enim velit ipsum esse. Esse nulla ex ex est Lorem esse consequat. Ea reprehenderit incididunt amet mollit aliquip commodo velit ullamco fugiat aliquip eu enim minim pariatur.\r\n",
-    "registered": "2014-01-09T02:04:43 -01:00",
-    "latitude": -75.853523,
-    "longitude": 163.776518,
-    "tags": [
-      "est",
-      "do",
-      "id",
-      "mollit",
-      "quis",
-      "proident",
-      "sit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Hamilton Black"
-      },
-      {
-        "id": 1,
-        "name": "Claudia Barlow"
-      },
-      {
-        "id": 2,
-        "name": "Socorro Spears"
-      }
-    ],
-    "greeting": "Hello, Brewer Hicks! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 24,
-    "guid": "cb69d074-cce9-45e9-a24d-7fd08bca4323",
-    "isActive": true,
-    "balance": "$2,836.40",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "blue",
-    "name": "Trudy Gates",
-    "gender": "female",
-    "company": "XIXAN",
-    "address": "961 McKibben Street, Matheny, South Dakota, 9685",
-    "about": "Minim sint enim non excepteur eiusmod. Incididunt eu do ad non duis elit Lorem id dolor dolor reprehenderit ipsum sit anim. Deserunt deserunt cillum labore ullamco anim. Amet nulla nisi labore pariatur deserunt veniam incididunt reprehenderit quis ad veniam. Excepteur elit deserunt duis ad mollit. Sit elit sint tempor proident ex duis adipisicing proident anim. Laboris officia ullamco fugiat et laboris non in dolor.\r\n",
-    "registered": "2014-05-25T10:37:08 -02:00",
-    "latitude": 21.885136,
-    "longitude": -41.678052,
-    "tags": [
-      "velit",
-      "aute",
-      "eiusmod",
-      "et",
-      "adipisicing",
-      "consectetur",
-      "minim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Camacho Farmer"
-      },
-      {
-        "id": 1,
-        "name": "Donaldson Vincent"
-      },
-      {
-        "id": 2,
-        "name": "Flora Clemons"
-      }
-    ],
-    "greeting": "Hello, Trudy Gates! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 25,
-    "guid": "b2807de3-ba87-482c-84d1-4aabc5f06436",
-    "isActive": false,
-    "balance": "$3,004.82",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "brown",
-    "name": "Mcclain Dyer",
-    "gender": "male",
-    "company": "IMAGEFLOW",
-    "address": "145 Veranda Place, Woodlake, Tennessee, 9160",
-    "about": "Nostrud incididunt cupidatat enim ullamco do enim fugiat dolore dolore ipsum. Elit dolore laboris in quis. Ad sit excepteur sunt Lorem fugiat consequat. Sunt id qui pariatur voluptate Lorem. Velit irure fugiat commodo est deserunt sunt consectetur consectetur duis magna dolor et. Consectetur minim ea cillum cupidatat adipisicing cillum nisi deserunt cillum enim.\r\n",
-    "registered": "2014-05-30T13:54:21 -02:00",
-    "latitude": 26.506892,
-    "longitude": -45.497276,
-    "tags": [
-      "culpa",
-      "quis",
-      "nulla",
-      "aliqua",
-      "consequat",
-      "exercitation",
-      "ullamco"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Moon Kemp"
-      },
-      {
-        "id": 1,
-        "name": "Erna Hunter"
-      },
-      {
-        "id": 2,
-        "name": "Virgie Crosby"
-      }
-    ],
-    "greeting": "Hello, Mcclain Dyer! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 26,
-    "guid": "40357915-bca9-4028-8f11-16159d0e19bb",
-    "isActive": true,
-    "balance": "$2,405.79",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "brown",
-    "name": "Madeleine Small",
-    "gender": "female",
-    "company": "MIXERS",
-    "address": "722 Winthrop Street, Day, Arizona, 3608",
-    "about": "Proident culpa duis voluptate est sit ad. Cupidatat anim mollit commodo adipisicing eu sunt cillum et dolor occaecat exercitation et exercitation. Occaecat ad reprehenderit aliquip id velit voluptate fugiat.\r\n",
-    "registered": "2014-04-02T02:58:24 -02:00",
-    "latitude": -62.758082,
-    "longitude": 3.987232,
-    "tags": [
-      "nisi",
-      "amet",
-      "qui",
-      "incididunt",
-      "tempor",
-      "veniam",
-      "consequat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Adkins Davis"
-      },
-      {
-        "id": 1,
-        "name": "Delores Miles"
-      },
-      {
-        "id": 2,
-        "name": "Chan Orr"
-      }
-    ],
-    "greeting": "Hello, Madeleine Small! You have 8 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 27,
-    "guid": "96f5ff1e-beca-474e-aa56-d7dc339c250f",
-    "isActive": false,
-    "balance": "$3,535.72",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Cassandra Rios",
-    "gender": "female",
-    "company": "HOMETOWN",
-    "address": "430 Roebling Street, Yardville, Vermont, 6970",
-    "about": "Occaecat enim fugiat anim aliqua qui incididunt cupidatat magna. Irure est velit cillum ullamco ut nostrud id incididunt irure est culpa adipisicing irure. Et dolore nostrud do consequat. Proident qui culpa tempor non incididunt deserunt exercitation. Nostrud laborum non magna ullamco esse et deserunt. Velit in irure ad ex laboris velit pariatur exercitation quis non magna nisi. Ipsum ad mollit esse occaecat laboris laboris id occaecat enim anim aliquip est sunt.\r\n",
-    "registered": "2014-05-25T22:39:33 -02:00",
-    "latitude": 67.062085,
-    "longitude": -7.309183,
-    "tags": [
-      "Lorem",
-      "amet",
-      "ad",
-      "amet",
-      "nisi",
-      "dolor",
-      "esse"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Townsend Sanford"
-      },
-      {
-        "id": 1,
-        "name": "Ingrid Floyd"
-      },
-      {
-        "id": 2,
-        "name": "Sara Rivera"
-      }
-    ],
-    "greeting": "Hello, Cassandra Rios! You have 9 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 28,
-    "guid": "4a1fbf0c-93a9-4687-b793-75312edc212d",
-    "isActive": true,
-    "balance": "$3,255.45",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "brown",
-    "name": "Polly Solis",
-    "gender": "female",
-    "company": "ZYTRAC",
-    "address": "597 Arion Place, Catharine, Arkansas, 6507",
-    "about": "Nostrud dolore veniam labore ut do cupidatat minim magna et cupidatat ut. Culpa ut do deserunt eiusmod aliquip qui in incididunt Lorem officia. Laborum deserunt sint deserunt labore irure sunt consectetur mollit occaecat magna aliquip cupidatat nulla culpa. Nostrud adipisicing cupidatat id mollit duis anim officia ea consequat. Ex ipsum occaecat aliquip pariatur.\r\n",
-    "registered": "2014-02-02T14:32:39 -01:00",
-    "latitude": -84.730608,
-    "longitude": 119.834605,
-    "tags": [
-      "aliquip",
-      "sint",
-      "deserunt",
-      "sint",
-      "magna",
-      "anim",
-      "et"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Pickett Holden"
-      },
-      {
-        "id": 1,
-        "name": "Sherry Downs"
-      },
-      {
-        "id": 2,
-        "name": "Greer Benjamin"
-      }
-    ],
-    "greeting": "Hello, Polly Solis! You have 3 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 29,
-    "guid": "10a9a575-ce9d-48d7-a169-c85aeed01e20",
-    "isActive": false,
-    "balance": "$2,323.11",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Juliet Hendricks",
-    "gender": "female",
-    "company": "SHOPABOUT",
-    "address": "289 Huntington Street, Albrightsville, Connecticut, 740",
-    "about": "Adipisicing deserunt eu ipsum esse culpa nostrud aliquip id. Elit mollit reprehenderit consectetur ex consequat veniam pariatur commodo enim eiusmod voluptate commodo. Aute non enim laboris aute deserunt amet est laborum sunt. Minim nulla pariatur amet velit anim ipsum id. Deserunt irure esse eu duis et aliqua quis proident est amet.\r\n",
-    "registered": "2014-04-25T01:21:51 -02:00",
-    "latitude": 83.541829,
-    "longitude": -44.401622,
-    "tags": [
-      "occaecat",
-      "ullamco",
-      "proident",
-      "non",
-      "est",
-      "commodo",
-      "magna"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Consuelo Bender"
-      },
-      {
-        "id": 1,
-        "name": "Nola French"
-      },
-      {
-        "id": 2,
-        "name": "Weiss Sawyer"
-      }
-    ],
-    "greeting": "Hello, Juliet Hendricks! You have 10 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 30,
-    "guid": "37e35b9a-403f-4ea3-ae41-09d95dc9240c",
-    "isActive": true,
-    "balance": "$2,981.35",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "brown",
-    "name": "Wade Jordan",
-    "gender": "male",
-    "company": "QUONATA",
-    "address": "821 Thatford Avenue, Blanco, Marshall Islands, 6693",
-    "about": "Deserunt irure Lorem ex labore consequat magna qui elit pariatur id ipsum consectetur officia. Cupidatat ad tempor dolore pariatur nostrud dolore dolor anim cillum. Non labore duis laboris laborum nulla incididunt magna esse sunt officia duis est. Consequat ullamco mollit et aute laboris nostrud elit dolore eiusmod non velit proident dolore dolor.\r\n",
-    "registered": "2014-05-27T12:50:23 -02:00",
-    "latitude": -40.296012,
-    "longitude": 113.521677,
-    "tags": [
-      "fugiat",
-      "commodo",
-      "sint",
-      "minim",
-      "ex",
-      "eu",
-      "reprehenderit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Letitia Lang"
-      },
-      {
-        "id": 1,
-        "name": "Macdonald Meadows"
-      },
-      {
-        "id": 2,
-        "name": "Mueller Heath"
-      }
-    ],
-    "greeting": "Hello, Wade Jordan! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 31,
-    "guid": "c5f5321f-3d91-444e-a47a-b0c371ab0081",
-    "isActive": true,
-    "balance": "$3,019.23",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "blue",
-    "name": "Yang Chase",
-    "gender": "male",
-    "company": "BLURRYBUS",
-    "address": "707 Morton Street, Hanover, Kentucky, 5726",
-    "about": "Ea adipisicing excepteur qui eu et consequat ipsum exercitation excepteur eiusmod veniam. Lorem dolor nisi et fugiat commodo enim. Et ut amet officia minim ut laborum cillum est nostrud adipisicing laborum enim mollit et. Ad nostrud anim in Lorem. Pariatur deserunt cillum veniam voluptate eu consectetur ullamco aute veniam ipsum sint pariatur. Tempor commodo ea id voluptate anim exercitation aute commodo non anim.\r\n",
-    "registered": "2014-04-08T05:54:21 -02:00",
-    "latitude": 52.861453,
-    "longitude": 140.0777,
-    "tags": [
-      "nulla",
-      "qui",
-      "consequat",
-      "ullamco",
-      "cillum",
-      "excepteur",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Katy Mckinney"
-      },
-      {
-        "id": 1,
-        "name": "Hines Parks"
-      },
-      {
-        "id": 2,
-        "name": "Fischer Chen"
-      }
-    ],
-    "greeting": "Hello, Yang Chase! You have 6 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 32,
-    "guid": "74a473e0-bf9d-4475-a51b-9a765b9cc193",
-    "isActive": true,
-    "balance": "$1,105.02",
-    "picture": "http://placehold.it/32x32",
-    "age": 38,
-    "eyeColor": "green",
-    "name": "Sheena Johnson",
-    "gender": "female",
-    "company": "SURELOGIC",
-    "address": "912 Erskine Loop, Strykersville, Indiana, 7777",
-    "about": "Veniam aliquip eiusmod Lorem ea sit nisi ad cupidatat. Occaecat Lorem magna proident ullamco nisi enim elit cillum. Eiusmod ut excepteur dolore eu culpa excepteur id quis mollit.\r\n",
-    "registered": "2014-05-12T20:26:36 -02:00",
-    "latitude": 49.95926,
-    "longitude": -99.357496,
-    "tags": [
-      "enim",
-      "ad",
-      "dolor",
-      "laboris",
-      "anim",
-      "consequat",
-      "exercitation"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bartlett Fletcher"
-      },
-      {
-        "id": 1,
-        "name": "Lorie Fulton"
-      },
-      {
-        "id": 2,
-        "name": "Candace Bowman"
-      }
-    ],
-    "greeting": "Hello, Sheena Johnson! You have 10 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 33,
-    "guid": "dc0479bc-a96e-4836-b1a9-8f950e3efd83",
-    "isActive": false,
-    "balance": "$2,795.29",
-    "picture": "http://placehold.it/32x32",
-    "age": 20,
-    "eyeColor": "green",
-    "name": "Celina Joyce",
-    "gender": "female",
-    "company": "ZENTIA",
-    "address": "828 Varick Street, Tioga, Colorado, 3681",
-    "about": "Velit nulla commodo officia nostrud tempor elit anim magna sint nostrud sit quis. Amet ex do est ea pariatur consectetur laboris dolor mollit consequat ut proident magna amet. Anim laboris enim velit proident labore esse ipsum magna et. Et do nostrud ullamco anim adipisicing cillum id.\r\n",
-    "registered": "2014-01-09T09:35:03 -01:00",
-    "latitude": -20.063864,
-    "longitude": -26.824305,
-    "tags": [
-      "quis",
-      "non",
-      "est",
-      "dolor",
-      "anim",
-      "officia",
-      "aliquip"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Booker Rojas"
-      },
-      {
-        "id": 1,
-        "name": "Inez Farrell"
-      },
-      {
-        "id": 2,
-        "name": "Gail Newman"
-      }
-    ],
-    "greeting": "Hello, Celina Joyce! You have 3 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 34,
-    "guid": "453ed0b7-d013-4816-8da6-89518b12d8b3",
-    "isActive": true,
-    "balance": "$3,895.96",
-    "picture": "http://placehold.it/32x32",
-    "age": 28,
-    "eyeColor": "brown",
-    "name": "Acevedo Bright",
-    "gender": "male",
-    "company": "PROSURE",
-    "address": "701 Walker Court, Unionville, Wyoming, 9919",
-    "about": "Sunt dolor est exercitation eu ex mollit cupidatat non. Amet do quis aliquip id ex amet esse elit nulla culpa aute enim et. Exercitation labore exercitation ullamco ad. Esse aliqua do veniam id ea. Cupidatat est eiusmod aliqua culpa ullamco. Amet ex voluptate exercitation sint do incididunt eu incididunt ipsum ipsum.\r\n",
-    "registered": "2014-03-24T12:47:29 -01:00",
-    "latitude": -64.863652,
-    "longitude": 50.546838,
-    "tags": [
-      "voluptate",
-      "sit",
-      "eiusmod",
-      "nostrud",
-      "fugiat",
-      "culpa",
-      "quis"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Copeland Dillon"
-      },
-      {
-        "id": 1,
-        "name": "Battle Figueroa"
-      },
-      {
-        "id": 2,
-        "name": "Lott Davidson"
-      }
-    ],
-    "greeting": "Hello, Acevedo Bright! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 35,
-    "guid": "b9403ab7-4cc3-4ba7-9b14-c8192fc8db82",
-    "isActive": true,
-    "balance": "$1,673.85",
-    "picture": "http://placehold.it/32x32",
-    "age": 30,
-    "eyeColor": "brown",
-    "name": "Mabel Monroe",
-    "gender": "female",
-    "company": "ZEDALIS",
-    "address": "865 Love Lane, Ripley, Guam, 4463",
-    "about": "Cupidatat quis qui deserunt qui consequat minim minim fugiat magna mollit. Excepteur mollit nostrud eiusmod sit laborum enim minim sit dolore cillum minim. Pariatur officia voluptate labore sint amet deserunt. Reprehenderit dolor voluptate nostrud duis labore aliquip et officia labore sit dolore. Aliqua magna magna in laboris eiusmod incididunt est eiusmod do velit veniam commodo minim dolor. Occaecat sit aliquip nulla exercitation nulla enim deserunt aute nostrud fugiat proident irure irure amet.\r\n",
-    "registered": "2014-04-30T12:17:04 -02:00",
-    "latitude": -55.542003,
-    "longitude": -171.447153,
-    "tags": [
-      "tempor",
-      "qui",
-      "ullamco",
-      "aute",
-      "cillum",
-      "est",
-      "velit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bullock Lamb"
-      },
-      {
-        "id": 1,
-        "name": "Pratt Sanders"
-      },
-      {
-        "id": 2,
-        "name": "Stephenson Boone"
-      }
-    ],
-    "greeting": "Hello, Mabel Monroe! You have 6 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 36,
-    "guid": "e574f534-f8ef-440b-8a1f-6c68a0a4c844",
-    "isActive": false,
-    "balance": "$3,191.59",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "blue",
-    "name": "Wilma Justice",
-    "gender": "female",
-    "company": "TRASOLA",
-    "address": "729 Seton Place, Dorneyville, Mississippi, 8313",
-    "about": "Fugiat ea deserunt commodo nostrud qui cupidatat do. Minim quis id culpa sit labore. Adipisicing do anim pariatur incididunt qui dolore tempor mollit mollit labore est adipisicing velit commodo. Ut pariatur mollit proident tempor magna nostrud ut aute incididunt proident.\r\n",
-    "registered": "2014-05-04T21:24:27 -02:00",
-    "latitude": -49.765389,
-    "longitude": -37.133321,
-    "tags": [
-      "nostrud",
-      "aute",
-      "tempor",
-      "ipsum",
-      "esse",
-      "ex",
-      "minim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Hilary Rodriguez"
-      },
-      {
-        "id": 1,
-        "name": "Watson Valencia"
-      },
-      {
-        "id": 2,
-        "name": "Bolton Buck"
-      }
-    ],
-    "greeting": "Hello, Wilma Justice! You have 9 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 37,
-    "guid": "19a06d59-e67f-45e1-9601-9272147cd608",
-    "isActive": true,
-    "balance": "$2,678.18",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Sharron Buckner",
-    "gender": "female",
-    "company": "ACCUPRINT",
-    "address": "281 Duryea Place, Bethany, Ohio, 993",
-    "about": "Do id commodo labore nostrud. Elit aliquip reprehenderit laborum nisi ea incididunt culpa velit labore eu officia. Do aute tempor duis ut. Ex exercitation ullamco irure dolor qui eu. Et fugiat eiusmod elit tempor amet.\r\n",
-    "registered": "2014-05-12T08:10:46 -02:00",
-    "latitude": -13.193791,
-    "longitude": -98.4976,
-    "tags": [
-      "adipisicing",
-      "enim",
-      "ut",
-      "ipsum",
-      "occaecat",
-      "in",
-      "pariatur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Stacy Jackson"
-      },
-      {
-        "id": 1,
-        "name": "Roberta Decker"
-      },
-      {
-        "id": 2,
-        "name": "Louisa Moran"
-      }
-    ],
-    "greeting": "Hello, Sharron Buckner! You have 5 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 38,
-    "guid": "76902598-0d5b-4b1b-ba17-775f5c255b97",
-    "isActive": false,
-    "balance": "$1,696.80",
-    "picture": "http://placehold.it/32x32",
-    "age": 21,
-    "eyeColor": "brown",
-    "name": "Holt Merritt",
-    "gender": "male",
-    "company": "PROGENEX",
-    "address": "419 Alice Court, Cedarville, Minnesota, 477",
-    "about": "Anim cupidatat sint anim dolor ea amet proident et do aliquip. Consequat excepteur sunt amet eu nisi adipisicing. Velit cillum cupidatat esse fugiat. Id do incididunt ullamco sunt ut et proident consectetur. Dolor aliqua tempor ipsum fugiat irure tempor id. Mollit deserunt amet do officia. Officia proident laborum aliquip esse consectetur dolore ipsum dolor sint anim.\r\n",
-    "registered": "2014-06-01T13:19:33 -02:00",
-    "latitude": -75.529871,
-    "longitude": -154.634484,
-    "tags": [
-      "enim",
-      "nostrud",
-      "quis",
-      "fugiat",
-      "nisi",
-      "duis",
-      "consequat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Maggie Castro"
-      },
-      {
-        "id": 1,
-        "name": "Boyd Gamble"
-      },
-      {
-        "id": 2,
-        "name": "Petra Olsen"
-      }
-    ],
-    "greeting": "Hello, Holt Merritt! You have 10 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 39,
-    "guid": "340de99c-b08b-4cfe-8949-edee0fd3057b",
-    "isActive": true,
-    "balance": "$1,585.36",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "brown",
-    "name": "Adeline Forbes",
-    "gender": "female",
-    "company": "OVOLO",
-    "address": "988 Concord Street, Delco, Nevada, 4671",
-    "about": "Exercitation commodo fugiat proident aute. Id officia culpa fugiat labore magna elit aliquip dolore excepteur. Veniam ea aliquip aliquip ullamco nostrud qui irure irure in do duis minim. Magna occaecat ipsum laboris laborum duis incididunt ipsum voluptate eu id elit.\r\n",
-    "registered": "2014-02-28T13:35:35 -01:00",
-    "latitude": -50.30747,
-    "longitude": -46.436881,
-    "tags": [
-      "est",
-      "eu",
-      "veniam",
-      "aliquip",
-      "do",
-      "duis",
-      "excepteur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Tanisha Lopez"
-      },
-      {
-        "id": 1,
-        "name": "Claire Hood"
-      },
-      {
-        "id": 2,
-        "name": "Glass Casey"
-      }
-    ],
-    "greeting": "Hello, Adeline Forbes! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 40,
-    "guid": "465d4c2d-66be-4f5b-b1ca-89d905b57d10",
-    "isActive": false,
-    "balance": "$2,431.75",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "brown",
-    "name": "Cassie Reid",
-    "gender": "female",
-    "company": "KAGE",
-    "address": "975 Montague Terrace, Drummond, Alabama, 3384",
-    "about": "Deserunt reprehenderit ad nisi sit sit enim et. Cillum enim irure do eu ad reprehenderit aliqua ipsum occaecat. Aliqua id pariatur occaecat sunt sit laborum culpa proident.\r\n",
-    "registered": "2014-06-16T12:34:20 -02:00",
-    "latitude": -80.740395,
-    "longitude": -120.970002,
-    "tags": [
-      "dolor",
-      "cillum",
-      "consectetur",
-      "pariatur",
-      "commodo",
-      "deserunt",
-      "exercitation"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Jessica Lancaster"
-      },
-      {
-        "id": 1,
-        "name": "Rogers Bradford"
-      },
-      {
-        "id": 2,
-        "name": "Rasmussen Pennington"
-      }
-    ],
-    "greeting": "Hello, Cassie Reid! You have 9 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 41,
-    "guid": "0c95f3b3-ed1e-4e73-b875-9ef9d8175178",
-    "isActive": true,
-    "balance": "$2,963.57",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "green",
-    "name": "Theresa Garrison",
-    "gender": "female",
-    "company": "GOKO",
-    "address": "346 Garden Street, Sena, American Samoa, 3751",
-    "about": "In reprehenderit sit esse pariatur laboris sit Lorem adipisicing ea minim dolor dolore. Veniam sunt anim aliqua ex sit excepteur est. Cillum ad nisi dolore id veniam. Ea elit ad adipisicing occaecat magna proident elit ea.\r\n",
-    "registered": "2014-03-28T18:57:25 -01:00",
-    "latitude": 74.367959,
-    "longitude": -156.849438,
-    "tags": [
-      "deserunt",
-      "ex",
-      "enim",
-      "ipsum",
-      "aute",
-      "nulla",
-      "id"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Park Whitney"
-      },
-      {
-        "id": 1,
-        "name": "Judy Reyes"
-      },
-      {
-        "id": 2,
-        "name": "Dillon Coffey"
-      }
-    ],
-    "greeting": "Hello, Theresa Garrison! You have 2 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 42,
-    "guid": "67cb9440-bc5b-4d55-b7e6-611b737fdf50",
-    "isActive": false,
-    "balance": "$1,905.50",
-    "picture": "http://placehold.it/32x32",
-    "age": 23,
-    "eyeColor": "green",
-    "name": "Sue Thomas",
-    "gender": "female",
-    "company": "QUIZKA",
-    "address": "895 Eldert Lane, Skyland, North Dakota, 2061",
-    "about": "Occaecat amet magna laborum ad laborum minim dolor ad eu laboris veniam nisi. Reprehenderit duis sunt excepteur duis mollit amet ad amet veniam. Lorem in non adipisicing deserunt minim consequat eu. Reprehenderit et mollit velit amet adipisicing. Nulla sunt exercitation dolore ad sunt sit excepteur ex id dolor commodo sint cillum veniam. Aliqua consequat mollit adipisicing sint et deserunt elit consectetur commodo labore mollit eiusmod tempor. Pariatur culpa pariatur sunt nostrud sint.\r\n",
-    "registered": "2014-04-10T13:41:18 -02:00",
-    "latitude": 4.868181,
-    "longitude": 80.852318,
-    "tags": [
-      "est",
-      "do",
-      "enim",
-      "sit",
-      "nisi",
-      "do",
-      "nisi"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Debbie Hart"
-      },
-      {
-        "id": 1,
-        "name": "Allen Turner"
-      },
-      {
-        "id": 2,
-        "name": "Aimee Reilly"
-      }
-    ],
-    "greeting": "Hello, Sue Thomas! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 43,
-    "guid": "52318c33-b606-4362-970e-743f560c2c6e",
-    "isActive": false,
-    "balance": "$2,779.11",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "blue",
-    "name": "Key Baldwin",
-    "gender": "male",
-    "company": "SPORTAN",
-    "address": "296 Jackson Place, Jugtown, Virgin Islands, 4817",
-    "about": "Et duis elit mollit eiusmod est eiusmod amet in proident ex quis. Pariatur mollit quis duis id esse qui aute deserunt qui. Nisi velit fugiat ex occaecat consequat id quis ullamco nisi in. Ea occaecat do commodo officia cillum officia irure eiusmod ex. Elit enim qui incididunt laborum quis in exercitation qui cupidatat dolor cillum minim elit eu.\r\n",
-    "registered": "2014-06-15T10:53:26 -02:00",
-    "latitude": -70.284549,
-    "longitude": 52.119751,
-    "tags": [
-      "ad",
-      "mollit",
-      "veniam",
-      "enim",
-      "enim",
-      "adipisicing",
-      "excepteur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Elliott Powell"
-      },
-      {
-        "id": 1,
-        "name": "Mann Snider"
-      },
-      {
-        "id": 2,
-        "name": "Velma Bernard"
-      }
-    ],
-    "greeting": "Hello, Key Baldwin! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 44,
-    "guid": "b7840c63-6cf1-4e09-9b72-18c3ba5a7111",
-    "isActive": false,
-    "balance": "$3,919.74",
-    "picture": "http://placehold.it/32x32",
-    "age": 40,
-    "eyeColor": "green",
-    "name": "Cotton Pickett",
-    "gender": "male",
-    "company": "ASIMILINE",
-    "address": "956 Madison Street, Yonah, Massachusetts, 5533",
-    "about": "Velit adipisicing aliquip fugiat nostrud tempor cillum in excepteur laborum esse est ut sunt magna. Dolore non laborum ut ea exercitation dolore Lorem. Cillum cillum occaecat dolore Lorem est labore. Do eu occaecat mollit do.\r\n",
-    "registered": "2014-03-16T05:29:39 -01:00",
-    "latitude": 40.126991,
-    "longitude": 161.483099,
-    "tags": [
-      "duis",
-      "mollit",
-      "ullamco",
-      "cupidatat",
-      "tempor",
-      "ullamco",
-      "anim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Megan Mays"
-      },
-      {
-        "id": 1,
-        "name": "Darlene Ortega"
-      },
-      {
-        "id": 2,
-        "name": "Deidre Ortiz"
-      }
-    ],
-    "greeting": "Hello, Cotton Pickett! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 45,
-    "guid": "fdc22758-b370-4504-8c32-52f08d0f1742",
-    "isActive": true,
-    "balance": "$1,138.69",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "brown",
-    "name": "Camille Glass",
-    "gender": "female",
-    "company": "KEGULAR",
-    "address": "874 Fuller Place, Gerber, New York, 9249",
-    "about": "Cillum laborum consectetur id ipsum est consequat. Et consectetur non amet laborum ut occaecat reprehenderit aliqua voluptate amet. Cillum veniam excepteur excepteur consequat anim proident ullamco consequat dolore. Nostrud veniam cupidatat ex qui exercitation ut sunt sunt cillum ex minim id ad culpa. Laborum adipisicing velit cillum magna nostrud sunt aute ullamco sit ullamco adipisicing sunt nisi duis.\r\n",
-    "registered": "2014-05-31T10:26:10 -02:00",
-    "latitude": -40.005694,
-    "longitude": -44.464273,
-    "tags": [
-      "id",
-      "id",
-      "dolor",
-      "officia",
-      "consequat",
-      "laboris",
-      "dolor"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Mccall Emerson"
-      },
-      {
-        "id": 1,
-        "name": "Osborn Hancock"
-      },
-      {
-        "id": 2,
-        "name": "Kline Ashley"
-      }
-    ],
-    "greeting": "Hello, Camille Glass! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 46,
-    "guid": "54e5395f-9339-413a-83f1-a687485600d8",
-    "isActive": false,
-    "balance": "$1,200.04",
-    "picture": "http://placehold.it/32x32",
-    "age": 30,
-    "eyeColor": "green",
-    "name": "Jana Horton",
-    "gender": "female",
-    "company": "POWERNET",
-    "address": "489 King Street, Boyd, New Mexico, 5703",
-    "about": "Irure consectetur sit anim id sint do occaecat labore enim nulla. Aliquip laborum excepteur et aliquip. Irure nostrud reprehenderit dolore adipisicing in non labore cillum amet deserunt et qui dolor nostrud. Do eu veniam magna occaecat laboris in aliqua laboris incididunt enim et. Culpa labore ut minim cupidatat aute magna sunt occaecat consectetur incididunt. Amet proident ullamco officia sunt ad sunt sit quis minim. Amet quis amet do elit qui ipsum in.\r\n",
-    "registered": "2014-01-17T18:06:57 -01:00",
-    "latitude": 43.378224,
-    "longitude": 176.44602,
-    "tags": [
-      "qui",
-      "occaecat",
-      "duis",
-      "incididunt",
-      "excepteur",
-      "labore",
-      "fugiat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Yvette Holt"
-      },
-      {
-        "id": 1,
-        "name": "Diane Sharp"
-      },
-      {
-        "id": 2,
-        "name": "Morin Rowe"
-      }
-    ],
-    "greeting": "Hello, Jana Horton! You have 7 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 47,
-    "guid": "0e8df74b-aa2d-4b3b-8bdc-24af1def021a",
-    "isActive": false,
-    "balance": "$1,267.90",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "green",
-    "name": "Yolanda Rogers",
-    "gender": "female",
-    "company": "RONELON",
-    "address": "159 Stuart Street, Brenton, Iowa, 1880",
-    "about": "Tempor esse et aliqua esse irure minim commodo ullamco ea. Sunt ad anim nisi qui ut cillum. Dolor proident exercitation est adipisicing elit aliquip mollit pariatur ad ex elit anim esse. Et ad irure veniam irure nostrud proident culpa anim ea deserunt sit. Dolor excepteur aliqua in dolore aute eiusmod ea est consectetur.\r\n",
-    "registered": "2014-03-27T04:44:16 -01:00",
-    "latitude": -88.062899,
-    "longitude": 71.323626,
-    "tags": [
-      "occaecat",
-      "incididunt",
-      "deserunt",
-      "minim",
-      "consequat",
-      "enim",
-      "culpa"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bender Mcfarland"
-      },
-      {
-        "id": 1,
-        "name": "Cherie Blanchard"
-      },
-      {
-        "id": 2,
-        "name": "Kaufman Potter"
-      }
-    ],
-    "greeting": "Hello, Yolanda Rogers! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 48,
-    "guid": "0f9038e2-b4a5-4d36-aa82-ca3a409fb8fb",
-    "isActive": true,
-    "balance": "$2,493.13",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "brown",
-    "name": "Hood Gillespie",
-    "gender": "male",
-    "company": "ISODRIVE",
-    "address": "115 Norman Avenue, Loveland, Illinois, 7679",
-    "about": "Anim proident exercitation aute commodo velit duis esse laboris ad incididunt ut proident sit officia. Tempor nostrud cillum esse consectetur commodo qui nostrud do. Eiusmod ut enim consequat cillum voluptate voluptate anim ullamco irure do enim Lorem quis commodo.\r\n",
-    "registered": "2014-03-01T04:41:00 -01:00",
-    "latitude": 1.411013,
-    "longitude": 45.030233,
-    "tags": [
-      "consectetur",
-      "occaecat",
-      "qui",
-      "eu",
-      "non",
-      "non",
-      "elit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Swanson Glenn"
-      },
-      {
-        "id": 1,
-        "name": "Cain Rich"
-      },
-      {
-        "id": 2,
-        "name": "Josefa Holloway"
-      }
-    ],
-    "greeting": "Hello, Hood Gillespie! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 49,
-    "guid": "8253b02a-d31d-46fb-8937-4ac81c6de333",
-    "isActive": false,
-    "balance": "$2,186.97",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "brown",
-    "name": "Ferguson Gordon",
-    "gender": "male",
-    "company": "KONGLE",
-    "address": "964 Kings Place, Clarksburg, Virginia, 9708",
-    "about": "Nulla commodo esse id aliquip eu. Nulla officia consectetur pariatur enim fugiat eu laborum culpa dolor tempor nulla. Aute culpa nostrud nisi adipisicing ipsum consequat exercitation ad reprehenderit. Pariatur id occaecat dolore non est minim ipsum cupidatat proident excepteur. Culpa ut minim id pariatur elit culpa exercitation irure reprehenderit nostrud magna adipisicing duis. Reprehenderit consectetur culpa cupidatat enim elit.\r\n",
-    "registered": "2014-05-30T03:07:37 -02:00",
-    "latitude": 15.44445,
-    "longitude": 17.743487,
-    "tags": [
-      "dolore",
-      "aliquip",
-      "commodo",
-      "occaecat",
-      "voluptate",
-      "qui",
-      "ut"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sanford Goff"
-      },
-      {
-        "id": 1,
-        "name": "Burks Velazquez"
-      },
-      {
-        "id": 2,
-        "name": "Crystal Hinton"
-      }
-    ],
-    "greeting": "Hello, Ferguson Gordon! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 50,
-    "guid": "8dce6586-8010-4072-97e6-8936c2f24ab0",
-    "isActive": true,
-    "balance": "$1,289.97",
-    "picture": "http://placehold.it/32x32",
-    "age": 25,
-    "eyeColor": "blue",
-    "name": "Francis Logan",
-    "gender": "male",
-    "company": "COMTOUR",
-    "address": "614 Overbaugh Place, Kilbourne, Delaware, 5387",
-    "about": "Eiusmod officia elit incididunt aute reprehenderit dolore culpa ea mollit nostrud et. Commodo laborum aliqua fugiat consectetur. Anim excepteur ad commodo non proident labore ad voluptate aliqua elit et excepteur cupidatat. Aliquip aute anim eu quis voluptate ipsum ad reprehenderit enim. Ad adipisicing commodo Lorem ad dolor. Et elit proident eu occaecat laboris cupidatat anim. Commodo consectetur fugiat laborum esse quis cillum aliquip.\r\n",
-    "registered": "2014-04-30T02:09:36 -02:00",
-    "latitude": 25.592851,
-    "longitude": 93.071978,
-    "tags": [
-      "proident",
-      "occaecat",
-      "fugiat",
-      "sit",
-      "nisi",
-      "quis",
-      "qui"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Atkins Gomez"
-      },
-      {
-        "id": 1,
-        "name": "Holmes Fernandez"
-      },
-      {
-        "id": 2,
-        "name": "Katrina Pierce"
-      }
-    ],
-    "greeting": "Hello, Francis Logan! You have 7 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 51,
-    "guid": "8dbfa109-8861-4326-b094-1796d9a57f75",
-    "isActive": true,
-    "balance": "$3,734.07",
-    "picture": "http://placehold.it/32x32",
-    "age": 25,
-    "eyeColor": "green",
-    "name": "Bean Mejia",
-    "gender": "male",
-    "company": "UXMOX",
-    "address": "167 Colby Court, National, Missouri, 6726",
-    "about": "Adipisicing ad do tempor anim sunt deserunt commodo consequat consectetur commodo ut ut. Tempor Lorem ea pariatur nostrud ea dolor culpa. Dolore nostrud dolore dolore aute irure laboris. Magna sunt occaecat laborum est consectetur.\r\n",
-    "registered": "2014-01-17T23:03:36 -01:00",
-    "latitude": 39.195905,
-    "longitude": -56.985216,
-    "tags": [
-      "culpa",
-      "consectetur",
-      "minim",
-      "ut",
-      "ad",
-      "incididunt",
-      "quis"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sawyer Frank"
-      },
-      {
-        "id": 1,
-        "name": "Peterson Cain"
-      },
-      {
-        "id": 2,
-        "name": "Nadine Gibbs"
-      }
-    ],
-    "greeting": "Hello, Bean Mejia! You have 9 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 52,
-    "guid": "3b0e32e7-2f23-4931-a3d1-ef3132c1c9da",
-    "isActive": true,
-    "balance": "$1,048.41",
-    "picture": "http://placehold.it/32x32",
-    "age": 40,
-    "eyeColor": "blue",
-    "name": "Bates Porter",
-    "gender": "male",
-    "company": "MANUFACT",
-    "address": "487 Irving Place, Mahtowa, Montana, 6259",
-    "about": "Est excepteur nulla anim consequat quis fugiat sit pariatur qui dolore laborum consectetur Lorem nulla. Laborum fugiat exercitation enim magna ut id dolore aliqua dolor in laboris labore ad incididunt. Ad ipsum fugiat cillum velit in non tempor in dolore cillum consequat quis.\r\n",
-    "registered": "2014-02-03T20:20:23 -01:00",
-    "latitude": 19.543599,
-    "longitude": -42.379181,
-    "tags": [
-      "ipsum",
-      "eiusmod",
-      "cupidatat",
-      "ea",
-      "veniam",
-      "cillum",
-      "nulla"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Kelli Johnston"
-      },
-      {
-        "id": 1,
-        "name": "Vickie Williams"
-      },
-      {
-        "id": 2,
-        "name": "Deana Cobb"
-      }
-    ],
-    "greeting": "Hello, Bates Porter! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 53,
-    "guid": "5d79c129-b426-4f76-8d66-5611721f0578",
-    "isActive": false,
-    "balance": "$1,677.94",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "blue",
-    "name": "Ernestine Dominguez",
-    "gender": "female",
-    "company": "FURNITECH",
-    "address": "527 Cass Place, Bradenville, Oregon, 6049",
-    "about": "Ipsum dolor mollit et enim cillum qui aliquip ex. Cillum officia sit quis tempor. Velit labore adipisicing duis do sint in ea. Amet reprehenderit in dolore voluptate ullamco non occaecat do nulla elit. Anim non ipsum culpa ullamco nisi quis laboris aute cupidatat Lorem laborum nulla officia.\r\n",
-    "registered": "2014-05-27T16:14:17 -02:00",
-    "latitude": -24.335251,
-    "longitude": -158.055584,
-    "tags": [
-      "nostrud",
-      "voluptate",
-      "quis",
-      "officia",
-      "amet",
-      "consectetur",
-      "cupidatat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Morgan Carlson"
-      },
-      {
-        "id": 1,
-        "name": "Mclean Parrish"
-      },
-      {
-        "id": 2,
-        "name": "Pittman Leblanc"
-      }
-    ],
-    "greeting": "Hello, Ernestine Dominguez! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 54,
-    "guid": "1ba3cfa6-5062-4954-a5db-b7392e66aecb",
-    "isActive": false,
-    "balance": "$2,124.23",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "brown",
-    "name": "Violet Cantu",
-    "gender": "female",
-    "company": "LIMAGE",
-    "address": "220 Garden Place, Magnolia, Utah, 2762",
-    "about": "Dolore excepteur officia ipsum ipsum duis ipsum qui. Minim fugiat quis dolor irure. Et nulla commodo irure eu in aliquip. Reprehenderit dolor adipisicing sit laboris ea cupidatat magna consectetur ad ad consectetur exercitation sunt. Duis in aliquip culpa in eu aute elit consequat ad enim aliqua dolore consectetur culpa.\r\n",
-    "registered": "2014-01-21T10:13:23 -01:00",
-    "latitude": -80.374056,
-    "longitude": -169.452566,
-    "tags": [
-      "esse",
-      "amet",
-      "nisi",
-      "Lorem",
-      "ipsum",
-      "excepteur",
-      "nulla"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Coleen Trujillo"
-      },
-      {
-        "id": 1,
-        "name": "Valerie Knight"
-      },
-      {
-        "id": 2,
-        "name": "Natalie Bowers"
-      }
-    ],
-    "greeting": "Hello, Violet Cantu! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 55,
-    "guid": "0ac411ac-6d8b-429a-a188-66b81bd676e3",
-    "isActive": true,
-    "balance": "$1,462.39",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "brown",
-    "name": "Sanchez Oneil",
-    "gender": "male",
-    "company": "CINCYR",
-    "address": "176 Voorhies Avenue, Ellerslie, West Virginia, 2352",
-    "about": "Non adipisicing pariatur officia est adipisicing culpa eiusmod esse occaecat culpa id voluptate culpa. Elit mollit est quis pariatur est esse anim culpa ut reprehenderit excepteur et. Eu exercitation sit aliquip do minim proident excepteur deserunt ad sit est cillum qui. Sit fugiat amet aliqua veniam deserunt ex veniam irure sint. Dolore nisi irure commodo ad eu elit do quis deserunt veniam mollit commodo do. Adipisicing est officia aute aliquip nulla. Amet est adipisicing consequat voluptate irure veniam consectetur enim ullamco.\r\n",
-    "registered": "2014-02-27T07:34:07 -01:00",
-    "latitude": 37.00743,
-    "longitude": -115.416298,
-    "tags": [
-      "elit",
-      "laboris",
-      "do",
-      "Lorem",
-      "non",
-      "pariatur",
-      "deserunt"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Dorthy Hayden"
-      },
-      {
-        "id": 1,
-        "name": "Luz Hawkins"
-      },
-      {
-        "id": 2,
-        "name": "Mills Sears"
-      }
-    ],
-    "greeting": "Hello, Sanchez Oneil! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 56,
-    "guid": "aa8e6dd5-72d6-48c0-8f23-9d80cf23ecc9",
-    "isActive": true,
-    "balance": "$1,748.82",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "blue",
-    "name": "Duncan Vega",
-    "gender": "male",
-    "company": "MAKINGWAY",
-    "address": "108 Brevoort Place, Warsaw, South Carolina, 8629",
-    "about": "Eiusmod id qui laboris aute proident. Duis irure pariatur consequat amet ad tempor magna ut aliqua proident exercitation. Excepteur ex irure ullamco et ullamco aliquip proident. Velit laborum nulla duis sit officia enim culpa adipisicing incididunt reprehenderit laboris consequat qui. Incididunt exercitation exercitation irure tempor eu fugiat cillum in. Id occaecat cillum nulla minim do cillum ea fugiat.\r\n",
-    "registered": "2014-05-07T19:03:39 -02:00",
-    "latitude": -44.145893,
-    "longitude": 134.923346,
-    "tags": [
-      "aliqua",
-      "id",
-      "velit",
-      "irure",
-      "cupidatat",
-      "duis",
-      "deserunt"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Leonor Baxter"
-      },
-      {
-        "id": 1,
-        "name": "Tabitha Clements"
-      },
-      {
-        "id": 2,
-        "name": "Ballard Mccullough"
-      }
-    ],
-    "greeting": "Hello, Duncan Vega! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 57,
-    "guid": "81320e47-53c5-47ca-853a-4b070beba9c2",
-    "isActive": true,
-    "balance": "$3,606.22",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "green",
-    "name": "Parsons Yang",
-    "gender": "male",
-    "company": "MICROLUXE",
-    "address": "529 Anna Court, Cuylerville, Oklahoma, 2412",
-    "about": "Laboris irure sint nostrud dolore nulla mollit duis cupidatat ut labore dolor. Consequat magna non ex dolor aliquip ea Lorem esse mollit. Commodo excepteur nostrud magna tempor pariatur elit est eiusmod mollit.\r\n",
-    "registered": "2014-01-04T09:43:05 -01:00",
-    "latitude": -21.526041,
-    "longitude": -149.854927,
-    "tags": [
-      "ad",
-      "deserunt",
-      "amet",
-      "laboris",
-      "id",
-      "minim",
-      "irure"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Verna Gilbert"
-      },
-      {
-        "id": 1,
-        "name": "Noel Hudson"
-      },
-      {
-        "id": 2,
-        "name": "April Bell"
-      }
-    ],
-    "greeting": "Hello, Parsons Yang! You have 2 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 58,
-    "guid": "a1fe594f-63e1-479e-b77d-215ef84c9d75",
-    "isActive": false,
-    "balance": "$1,966.25",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "brown",
-    "name": "Bettye Hendrix",
-    "gender": "female",
-    "company": "ROTODYNE",
-    "address": "142 Richards Street, Avalon, California, 562",
-    "about": "Cupidatat enim magna non id consequat id cupidatat enim ea. Ipsum cupidatat excepteur laborum Lorem proident dolor in aliquip. Fugiat ea non labore ullamco qui amet mollit. Dolore consequat qui excepteur id dolor culpa dolor.\r\n",
-    "registered": "2014-04-26T19:29:40 -02:00",
-    "latitude": 48.034054,
-    "longitude": 88.026949,
-    "tags": [
-      "laboris",
-      "exercitation",
-      "adipisicing",
-      "aliqua",
-      "reprehenderit",
-      "dolor",
-      "duis"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Skinner Woodard"
-      },
-      {
-        "id": 1,
-        "name": "May Vaughan"
-      },
-      {
-        "id": 2,
-        "name": "Ware Carpenter"
-      }
-    ],
-    "greeting": "Hello, Bettye Hendrix! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 59,
-    "guid": "9dafe25b-1512-4718-8973-ba574ac17624",
-    "isActive": false,
-    "balance": "$3,204.12",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "green",
-    "name": "Jenkins Barrett",
-    "gender": "male",
-    "company": "MOBILDATA",
-    "address": "850 Varick Avenue, Cassel, Louisiana, 6242",
-    "about": "Cillum est eu exercitation aliqua in qui et et. Nulla in deserunt laborum velit. Elit occaecat occaecat id aliqua et et incididunt duis laboris ut occaecat aliqua ad. Voluptate eu elit esse veniam pariatur laboris nisi nisi excepteur cupidatat ipsum reprehenderit. Culpa consectetur cillum aliquip irure et non esse officia. Velit aliqua labore voluptate nostrud nostrud aliquip dolor adipisicing ea Lorem velit excepteur sit. Ullamco sunt minim officia amet.\r\n",
-    "registered": "2014-02-21T02:30:07 -01:00",
-    "latitude": -27.006112,
-    "longitude": 144.509897,
-    "tags": [
-      "Lorem",
-      "esse",
-      "laborum",
-      "deserunt",
-      "laboris",
-      "sint",
-      "ullamco"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Vinson Bentley"
-      },
-      {
-        "id": 1,
-        "name": "Mejia Ballard"
-      },
-      {
-        "id": 2,
-        "name": "Branch Oconnor"
-      }
-    ],
-    "greeting": "Hello, Jenkins Barrett! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 60,
-    "guid": "449cfa41-2c4c-4152-8eb6-88fbd7d1e4f6",
-    "isActive": true,
-    "balance": "$1,301.43",
-    "picture": "http://placehold.it/32x32",
-    "age": 40,
-    "eyeColor": "brown",
-    "name": "Flowers Mcguire",
-    "gender": "male",
-    "company": "ANIMALIA",
-    "address": "805 Lake Avenue, Rodanthe, Alaska, 1251",
-    "about": "Aliquip enim voluptate consectetur proident ad. Non nisi quis consequat elit voluptate consectetur commodo veniam ea. Qui eiusmod velit nostrud nulla do mollit do excepteur. Minim et et exercitation non aliqua nostrud velit et fugiat. Non minim sint veniam nisi non culpa enim duis cupidatat officia laborum et amet. Sunt duis reprehenderit dolore cupidatat. Dolore commodo in aute nostrud aliqua laboris laboris officia consectetur duis.\r\n",
-    "registered": "2014-04-21T05:56:47 -02:00",
-    "latitude": 82.411766,
-    "longitude": 98.77152,
-    "tags": [
-      "adipisicing",
-      "esse",
-      "pariatur",
-      "ea",
-      "pariatur",
-      "aute",
-      "Lorem"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Keri Barry"
-      },
-      {
-        "id": 1,
-        "name": "Aguilar Short"
-      },
-      {
-        "id": 2,
-        "name": "Mendoza Chang"
-      }
-    ],
-    "greeting": "Hello, Flowers Mcguire! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 61,
-    "guid": "b5ecc81d-fce1-473a-a3e1-d7dbbd348b78",
-    "isActive": true,
-    "balance": "$1,170.52",
-    "picture": "http://placehold.it/32x32",
-    "age": 38,
-    "eyeColor": "green",
-    "name": "Rodgers Austin",
-    "gender": "male",
-    "company": "VISUALIX",
-    "address": "330 Miami Court, Carrizo, Northern Mariana Islands, 8692",
-    "about": "Proident reprehenderit occaecat dolore duis ad. Exercitation commodo nostrud in cillum quis nisi nostrud incididunt culpa magna velit ea elit. Incididunt qui occaecat consequat enim do ad ea consectetur deserunt ut et adipisicing sunt tempor.\r\n",
-    "registered": "2014-04-14T03:01:41 -02:00",
-    "latitude": 53.114219,
-    "longitude": 17.890743,
-    "tags": [
-      "labore",
-      "ullamco",
-      "incididunt",
-      "cupidatat",
-      "ad",
-      "ipsum",
-      "excepteur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Fisher Russo"
-      },
-      {
-        "id": 1,
-        "name": "Ortega Clay"
-      },
-      {
-        "id": 2,
-        "name": "Gates Mullins"
-      }
-    ],
-    "greeting": "Hello, Rodgers Austin! You have 6 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 62,
-    "guid": "b6a40064-0a41-40d4-bad5-ec8ea7aec9a8",
-    "isActive": true,
-    "balance": "$2,406.27",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "blue",
-    "name": "Lou Diaz",
-    "gender": "female",
-    "company": "GENESYNK",
-    "address": "788 Coventry Road, Marbury, Georgia, 3806",
-    "about": "Anim amet aliqua incididunt nostrud consequat incididunt cupidatat nisi do aute Lorem nostrud qui. Aliqua aute laboris incididunt fugiat non quis fugiat sint sint culpa in. Culpa ea aliqua in magna magna eiusmod do. Laborum adipisicing magna voluptate est aliquip cillum mollit labore do officia consequat sunt ad esse. Ex dolore consectetur laborum sint esse elit sint cupidatat ad aliqua. Amet est eiusmod laboris enim cillum dolor cillum cupidatat velit aliquip mollit ad quis et.\r\n",
-    "registered": "2014-05-14T09:38:56 -02:00",
-    "latitude": -20.821547,
-    "longitude": 156.833327,
-    "tags": [
-      "adipisicing",
-      "eu",
-      "minim",
-      "cillum",
-      "ullamco",
-      "dolore",
-      "cupidatat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Cochran Donaldson"
-      },
-      {
-        "id": 1,
-        "name": "Rosemarie Fuentes"
-      },
-      {
-        "id": 2,
-        "name": "Dorothy Huff"
-      }
-    ],
-    "greeting": "Hello, Lou Diaz! You have 6 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 63,
-    "guid": "e109d297-ab7e-428e-930a-e5a908cd95f3",
-    "isActive": true,
-    "balance": "$2,037.72",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Tammy Giles",
-    "gender": "female",
-    "company": "GLOBOIL",
-    "address": "118 Newel Street, Sunriver, Pennsylvania, 6127",
-    "about": "Labore duis consequat ipsum commodo Lorem consectetur id enim et minim nostrud aute aliquip. Labore elit sint cupidatat ipsum dolore irure. Id dolor voluptate esse non sint aliqua duis cillum ea laboris sunt ad culpa. Ex anim ex ut id sunt laborum dolore proident sunt sit culpa ex voluptate. Tempor et laboris et eiusmod do.\r\n",
-    "registered": "2014-03-03T19:50:20 -01:00",
-    "latitude": -9.909779,
-    "longitude": -65.843199,
-    "tags": [
-      "esse",
-      "mollit",
-      "dolor",
-      "et",
-      "incididunt",
-      "excepteur",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bethany Roach"
-      },
-      {
-        "id": 1,
-        "name": "Cecile Elliott"
-      },
-      {
-        "id": 2,
-        "name": "Chandra Cortez"
-      }
-    ],
-    "greeting": "Hello, Tammy Giles! You have 9 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 64,
-    "guid": "2aa0a051-33d3-45e2-968c-22cc3130ac98",
-    "isActive": true,
-    "balance": "$3,582.28",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "brown",
-    "name": "Ruiz Bryant",
-    "gender": "male",
-    "company": "ZOLAREX",
-    "address": "275 Visitation Place, Felt, North Carolina, 4857",
-    "about": "Ipsum esse velit aute veniam officia fugiat Lorem eiusmod duis. Irure et sint cillum elit. Est occaecat consectetur nisi sit irure dolor nisi amet fugiat adipisicing nisi sunt esse. Deserunt nostrud est laboris fugiat officia. Tempor ad eiusmod id sint consequat excepteur laboris sint excepteur.\r\n",
-    "registered": "2014-02-22T19:15:22 -01:00",
-    "latitude": 24.32047,
-    "longitude": -77.296588,
-    "tags": [
-      "amet",
-      "excepteur",
-      "incididunt",
-      "eiusmod",
-      "nostrud",
-      "aliqua",
-      "cillum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Susan Hamilton"
-      },
-      {
-        "id": 1,
-        "name": "Minnie Wilkinson"
-      },
-      {
-        "id": 2,
-        "name": "Pearson Baker"
-      }
-    ],
-    "greeting": "Hello, Ruiz Bryant! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 65,
-    "guid": "cb85df28-e7ba-4e61-999b-648b9da62130",
-    "isActive": true,
-    "balance": "$1,005.06",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "blue",
-    "name": "Cecelia Simon",
-    "gender": "female",
-    "company": "BESTO",
-    "address": "128 Bay Street, Dubois, Texas, 3793",
-    "about": "Ipsum et amet adipisicing eiusmod. Sint ipsum commodo dolore ipsum enim. Officia reprehenderit cupidatat enim consequat sit ea est est est tempor incididunt veniam deserunt. Est cupidatat enim dolore laboris proident ut quis cillum magna magna. Irure aliquip duis pariatur commodo consectetur quis minim ipsum. Nostrud laboris laboris pariatur sit minim Lorem.\r\n",
-    "registered": "2014-01-30T06:53:35 -01:00",
-    "latitude": 67.530285,
-    "longitude": 174.896728,
-    "tags": [
-      "ut",
-      "amet",
-      "labore",
-      "proident",
-      "ut",
-      "eiusmod",
-      "labore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Harriet Mcpherson"
-      },
-      {
-        "id": 1,
-        "name": "Neal Rasmussen"
-      },
-      {
-        "id": 2,
-        "name": "Nelda Brooks"
-      }
-    ],
-    "greeting": "Hello, Cecelia Simon! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 66,
-    "guid": "93606162-2c05-4e61-838a-438edda1a96f",
-    "isActive": false,
-    "balance": "$3,035.52",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "green",
-    "name": "Kathleen Wong",
-    "gender": "female",
-    "company": "UNISURE",
-    "address": "615 Pierrepont Street, Chase, Federated States Of Micronesia, 9750",
-    "about": "Commodo ex incididunt voluptate do et ea fugiat deserunt eu culpa. Magna aliqua ut proident non consectetur dolor pariatur anim nostrud. Cillum adipisicing sunt Lorem cupidatat cupidatat duis quis irure minim sint. Exercitation reprehenderit anim sunt qui anim. Ipsum commodo ex pariatur aliquip.\r\n",
-    "registered": "2014-02-09T13:57:09 -01:00",
-    "latitude": 80.596981,
-    "longitude": -48.144951,
-    "tags": [
-      "sit",
-      "proident",
-      "consequat",
-      "veniam",
-      "fugiat",
-      "dolor",
-      "id"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Colon Medina"
-      },
-      {
-        "id": 1,
-        "name": "Mcgowan Drake"
-      },
-      {
-        "id": 2,
-        "name": "Porter Thornton"
-      }
-    ],
-    "greeting": "Hello, Kathleen Wong! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 67,
-    "guid": "3e645c16-5abc-478e-b043-ac37ef834f91",
-    "isActive": true,
-    "balance": "$3,496.41",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "blue",
-    "name": "Marla Santana",
-    "gender": "female",
-    "company": "SHADEASE",
-    "address": "704 Broome Street, Kieler, New Jersey, 463",
-    "about": "Elit cillum sunt minim esse officia. Nostrud sint eiusmod culpa mollit. Sit eu cillum Lorem ex mollit excepteur sit aliqua sit.\r\n",
-    "registered": "2014-03-06T07:43:34 -01:00",
-    "latitude": 67.92188,
-    "longitude": 47.214521,
-    "tags": [
-      "do",
-      "officia",
-      "nulla",
-      "deserunt",
-      "laboris",
-      "labore",
-      "cupidatat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sosa Frost"
-      },
-      

<TRUNCATED>

[02/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
new file mode 100644
index 0000000..70a0791
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrProvider.java
@@ -0,0 +1,35 @@
+/*
+ * 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.jaxrs;
+
+import javax.json.JsonStructure;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.Provider;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+
+@Provider
+@Produces(WILDCARD)
+@Consumes(WILDCARD)
+public class JsrProvider extends DelegateProvider<JsonStructure> {
+    public JsrProvider() {
+        super(new JsrMessageBodyReader(), new JsrMessageBodyWriter());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WadlDocumentMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WadlDocumentMessageBodyWriter.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WadlDocumentMessageBodyWriter.java
new file mode 100644
index 0000000..5adab66
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/WadlDocumentMessageBodyWriter.java
@@ -0,0 +1,63 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.johnzon.jaxrs.xml.WadlDocumentToJson;
+import org.w3c.dom.Document;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.xml.stream.XMLStreamException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import static org.apache.johnzon.jaxrs.Jsons.isJson;
+
+public class WadlDocumentMessageBodyWriter implements MessageBodyWriter<Document> {
+    private final WadlDocumentToJson converter = new WadlDocumentToJson();
+
+    @Override
+    public boolean isWriteable(final Class<?> aClass, final Type type,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return isJson(mediaType) && Document.class.isAssignableFrom(aClass);
+    }
+
+    @Override
+    public long getSize(final Document document, final Class<?> aClass,
+                        final Type type, final Annotation[] annotations,
+                        final MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    public void writeTo(final Document document, final Class<?> aClass,
+                        final Type type, final Annotation[] annotations,
+                        final MediaType mediaType, final MultivaluedMap<String, Object> stringObjectMultivaluedMap,
+                        final OutputStream outputStream) throws IOException, WebApplicationException {
+        try {
+            outputStream.write(converter.convert(document).getBytes());
+        } catch (final XMLStreamException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJson.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJson.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJson.java
new file mode 100644
index 0000000..0768e09
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJson.java
@@ -0,0 +1,98 @@
+/*
+ * 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.jaxrs.xml;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.json.Json;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonBuilderFactory;
+import javax.json.JsonObjectBuilder;
+import javax.xml.stream.XMLStreamException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+public class WadlDocumentToJson {
+    private final JsonBuilderFactory builderFactory = Json.createBuilderFactory(Collections.<String, Object>emptyMap());
+
+    public String convert(final Document doc) throws XMLStreamException {
+        final JsonObjectBuilder builder = builderFactory.createObjectBuilder();
+        if (doc.getChildNodes().getLength() != 1) {
+            return "{}";
+        }
+        final Node item = doc.getChildNodes().item(0);
+        return builder.add(item.getNodeName(), createNode(item)).build().toString();
+    }
+
+    private void addChildrens(/*final String nodeName, */final JsonObjectBuilder builder, final NodeList children) {
+        final Map<String, Collection<Node>> nodesByName = new LinkedHashMap<String, Collection<Node>>();
+        for (int i = 0; i < children.getLength(); i++) {
+            final Node node = children.item(i);
+            if ("#text".equals(node.getNodeName())) {
+                continue;
+            }
+
+            final String name = node.getNodeName();
+            Collection<Node> nodes = nodesByName.get(name);
+            if (nodes == null) {
+                nodes = new LinkedList<Node>();
+                nodesByName.put(name, nodes);
+            }
+            nodes.add(node);
+        }
+
+        for (final Map.Entry<String, Collection<Node>> entry : nodesByName.entrySet()) {
+            final JsonArrayBuilder arrayBuilder = builderFactory.createArrayBuilder();
+            for (final Node n : entry.getValue()) {
+                final JsonObjectBuilder jsonObjectBuilder = createNode(n);
+                if (jsonObjectBuilder != null) {
+                    arrayBuilder.add(jsonObjectBuilder);
+                }
+            }
+            builder.add(entry.getKey(), arrayBuilder);
+        }
+    }
+
+    private JsonObjectBuilder createNode(final Node node) {
+        JsonObjectBuilder childBuilder = null;
+
+        if (node.hasAttributes()) {
+            childBuilder = builderFactory.createObjectBuilder();
+            final NamedNodeMap attributes = node.getAttributes();
+            for (int j = 0; j < attributes.getLength(); j++) {
+                final Node namedItem = attributes.item(j);
+                childBuilder.add(namedItem.getNodeName(), namedItem.getNodeValue());
+            }
+        }
+
+        if (node.hasChildNodes()) {
+            if (childBuilder == null) {
+                childBuilder = builderFactory.createObjectBuilder();
+            }
+            addChildrens(/*node.getNodeName(),*/ childBuilder, node.getChildNodes());
+        }
+        return childBuilder;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
new file mode 100644
index 0000000..3cccf83
--- /dev/null
+++ b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JohnzonProviderTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.transport.local.LocalConduit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class JohnzonProviderTest {
+    private final static String ENDPOINT_ADDRESS = "local://johnzon";
+    private static Server server;
+
+    @BeforeClass
+    public static void bindEndpoint() throws Exception {
+        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+        sf.setResourceClasses(JohnzonResource.class);
+        sf.setProviders(asList(new JohnzonProvider<Object>()));
+        sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
+        sf.setAddress(ENDPOINT_ADDRESS);
+        server = sf.create();
+    }
+
+    @AfterClass
+    public static void unbind() throws Exception {
+        server.stop();
+        server.destroy();
+    }
+
+    @Test
+    public void asParam() {
+        final String result = client().path("johnzon").type(MediaType.APPLICATION_JSON_TYPE).post(new Johnzon("client")).readEntity(String.class);
+        assertTrue(Boolean.parseBoolean(result));
+    }
+
+    @Test
+    public void object() {
+        final Johnzon johnzon = client().path("johnzon").get(Johnzon.class);
+        assertEquals("johnzon", johnzon.getName());
+    }
+
+    @Test
+    public void array() {
+        final Johnzon[] johnzon = client().path("johnzon/all1").get(Johnzon[].class);
+        assertEquals(2, johnzon.length);
+        for (int i = 0; i < johnzon.length; i++) {
+            assertEquals("johnzon" + (i + 1), johnzon[i].getName());
+        }
+    }
+
+    @Test
+    public void list() {
+        final ParameterizedType list = new ParameterizedType() {
+            @Override
+            public Type[] getActualTypeArguments() {
+                return new Type[]{Johnzon.class};
+            }
+
+            @Override
+            public Type getRawType() {
+                return List.class;
+            }
+
+            @Override
+            public Type getOwnerType() {
+                return null;
+            }
+        };
+        final List<Johnzon> johnzons = client().path("johnzon/all2").get(new GenericType<List<Johnzon>>(list));
+        assertEquals(2, johnzons.size());
+        int i = 1;
+        for (final Johnzon f : johnzons) {
+            assertEquals("johnzon" + i, f.getName());
+            i++;
+        }
+    }
+
+    private static WebClient client() {
+        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, asList(new JohnzonProvider<Object>())).accept(MediaType.APPLICATION_JSON_TYPE);
+        WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
+        return client;
+    }
+
+    public static class Johnzon {
+        private String name;
+
+        public Johnzon(final String name) {
+            this.name = name;
+        }
+
+        public Johnzon() {
+            // no-op
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(final String name) {
+            this.name = name;
+        }
+    }
+
+    @Path("johnzon")
+    public static class JohnzonResource {
+        @GET
+        public Johnzon johnzon() {
+            return new Johnzon("johnzon");
+        }
+
+        @GET
+        @Path("all1")
+        public Johnzon[] johnzons1() {
+            return new Johnzon[] { new Johnzon("johnzon1"), new Johnzon("johnzon2") };
+        }
+
+        @GET
+        @Path("all2")
+        public List<Johnzon> johnzons2() {
+            return asList(johnzons1());
+        }
+
+        @POST
+        public String asParam(final Johnzon f) {
+            return Boolean.toString("client".equals(f.getName()));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JsrProviderTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JsrProviderTest.java b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JsrProviderTest.java
new file mode 100644
index 0000000..9954cbb
--- /dev/null
+++ b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/JsrProviderTest.java
@@ -0,0 +1,104 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.transport.local.LocalConduit;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import java.util.Iterator;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+
+public class JsrProviderTest {
+    private final static String ENDPOINT_ADDRESS = "local://johnzon";
+    private static Server server;
+
+    @BeforeClass
+    public static void bindEndpoint() throws Exception {
+        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+        sf.setResourceClasses(JohnzonResource.class);
+        sf.setProviders(asList(new JsrProvider()));
+        sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
+        sf.setAddress(ENDPOINT_ADDRESS);
+        server = sf.create();
+    }
+
+    @AfterClass
+    public static void unbind() throws Exception {
+        server.stop();
+        server.destroy();
+    }
+
+    @Test
+    public void object() {
+        final JsonObject object = client().path("johnzon/object").get(JsonObject.class);
+        assertEquals(2, object.size());
+        for (int i = 1; i <= 2; i++) {
+            assertEquals(i, object.getInt(Character.toString((char) ('a' + i - 1))));
+        }
+    }
+
+    @Test
+    public void array() {
+        final JsonArray array = client().path("johnzon/array").get(JsonArray.class);
+        assertEquals(2, array.size());
+        final Iterator<JsonValue> ints = array.iterator();
+        for (int i = 1; i <= 2; i++) {
+            final JsonValue next = ints.next();
+            assertEquals(JsonValue.ValueType.NUMBER, next.getValueType());
+            assertEquals(i, JsonNumber.class.cast(next).intValue());
+        }
+    }
+
+    private static WebClient client() {
+        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, asList(new JsrProvider())).accept(MediaType.APPLICATION_JSON_TYPE);
+        WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
+        return client;
+    }
+
+    @Path("johnzon")
+    public static class JohnzonResource {
+        @GET
+        @Path("array")
+        public JsonArray array() {
+            return Json.createArrayBuilder().add(1).add(2).build();
+        }
+
+        @GET
+        @Path("object")
+        public JsonObject object() {
+            return Json.createObjectBuilder().add("a", 1).add("b", 2).build();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJsonTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJsonTest.java b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJsonTest.java
new file mode 100644
index 0000000..ba19b0d
--- /dev/null
+++ b/johnzon-jaxrs/src/test/java/org/apache/johnzon/jaxrs/xml/WadlDocumentToJsonTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.jaxrs.xml;
+
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.ByteArrayInputStream;
+
+import static org.junit.Assert.assertEquals;
+
+public class WadlDocumentToJsonTest {
+    @Test
+    public void xmlToJson() throws Exception {
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
+            .parse(new ByteArrayInputStream(("" +
+                    "<application xmlns=\"http://wadl.dev.java.net/2009/02\">\n" +
+                    "    <resources base=\"http://example.com/api\">\n" +
+                    "        <resource path=\"books\">\n" +
+                    "            <method name=\"GET\"/>\n" +
+                    "            <resource path=\"{bookId}\">\n" +
+                    "                <param required=\"true\" style=\"template\" name=\"bookId\"/>\n" +
+                    "                <method name=\"GET\"/>\n" +
+                    "                <method name=\"DELETE\"/>\n" +
+                    "                <resource path=\"reviews\">\n" +
+                    "                    <method name=\"GET\">\n" +
+                    "                        <request>\n" +
+                    "                            <param name=\"page\" required=\"false\" default=\"1\" style=\"query\"/>\n" +
+                    "                            <param name=\"size\" required=\"false\" default=\"20\" style=\"query\"/>\n" +
+                    "                        </request>\n" +
+                    "                    </method>\n" +
+                    "                </resource>\n" +
+                    "            </resource>\n" +
+                    "        </resource>\n" +
+                    "        <resource path=\"readers\">\n" +
+                    "            <method name=\"GET\"/>\n" +
+                    "        </resource>\n" +
+                    "    </resources>\n" +
+                    "</application>").getBytes()));
+
+        final String json = new WadlDocumentToJson().convert(doc);
+        assertEquals("{\"application\":{\"xmlns\":\"http://wadl.dev.java.net/2009/02\",\"resources\":[{\"base\":\"http://example.com/api\",\"resource\":[{\"path\":\"books\",\"method\":[{\"name\":\"GET\"}],\"resource\":[{\"path\":\"{bookId}\",\"param\":[{\"name\":\"bookId\",\"required\":\"true\",\"style\":\"template\"}],\"method\":[{\"name\":\"GET\"},{\"name\":\"DELETE\"}],\"resource\":[{\"path\":\"reviews\",\"method\":[{\"name\":\"GET\",\"request\":[{\"param\":[{\"default\":\"1\",\"name\":\"page\",\"required\":\"false\",\"style\":\"query\"},{\"default\":\"20\",\"name\":\"size\",\"required\":\"false\",\"style\":\"query\"}]}]}]}]}]},{\"path\":\"readers\",\"method\":[{\"name\":\"GET\"}]}]}]}}", json);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-mapper/pom.xml b/johnzon-mapper/pom.xml
new file mode 100644
index 0000000..31d5007
--- /dev/null
+++ b/johnzon-mapper/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>johnzon</artifactId>
+    <groupId>org.apache.johnzon</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>johnzon-mapper</artifactId>
+  <name>Johnzon :: Mapper</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.johnzon</groupId>
+      <artifactId>johnzon-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <properties>
+    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
+  </properties>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Converter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Converter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Converter.java
new file mode 100644
index 0000000..3c36273
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Converter.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+public interface Converter<T> {
+    String toString(T instance);
+    T fromString(String text);
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonConverter.java
new file mode 100644
index 0000000..1c1a01d
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonConverter.java
@@ -0,0 +1,31 @@
+/*
+ * 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 java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target(METHOD)
+@Retention(RUNTIME)
+public @interface JohnzonConverter {
+    Class<? extends Converter<?>> value();
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonIgnore.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonIgnore.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonIgnore.java
new file mode 100644
index 0000000..6b75dc5
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JohnzonIgnore.java
@@ -0,0 +1,36 @@
+/*
+ * 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 java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target(METHOD)
+@Retention(RUNTIME)
+public @interface JohnzonIgnore {
+    /**
+     * Example: @JohnzonIgnore(minVersion = 2) will ignore the value until version is set to 2, 3, ...
+     *
+     * @return the first version the decorated field is not ignored.
+     */
+    int minVersion() default -1;
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..1367a65
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -0,0 +1,670 @@
+/*
+ * 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 org.apache.johnzon.mapper.converter.EnumConverter;
+import org.apache.johnzon.mapper.reflection.Mappings;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+import javax.json.JsonValue.ValueType;
+import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static java.util.Arrays.asList;
+
+public class Mapper {
+    protected static final JsonObject EMPTY_OBJECT = Json.createObjectBuilder().build();
+    private static final Converter<Object> FALLBACK_CONVERTER = new FallbackConverter();
+
+    protected final Mappings mappings;
+    protected final JsonReaderFactory readerFactory;
+    protected final JsonGeneratorFactory generatorFactory;
+    protected final boolean close;
+    protected final ConcurrentMap<Type, Converter<?>> converters;
+    protected final int version;
+
+    public Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory,
+                  final boolean doClose, final Map<Class<?>, Converter<?>> converters,
+                  final int version, final Comparator<String> attributeOrder) {
+        this.readerFactory = readerFactory;
+        this.generatorFactory = generatorFactory;
+        this.close = doClose;
+        this.converters = new ConcurrentHashMap<Type, Converter<?>>(converters);
+        this.version = version;
+        this.mappings = new Mappings(attributeOrder);
+    }
+
+    private static JsonGenerator writePrimitives(final JsonGenerator generator, final Object value) {
+        if (value == null) {
+            return null; // fake a write
+        }
+
+        final Class<?> type = value.getClass();
+        if (type == String.class) {
+            return generator.write(value.toString());
+        } else if (type == long.class || type == Long.class) {
+            return generator.write(Long.class.cast(value).longValue());
+        } else if (type == int.class || type == Integer.class) {
+            return generator.write(Integer.class.cast(value).intValue());
+        } else if (type == double.class || type == Double.class
+                || type == float.class || type == Float.class) {
+            return generator.write(Number.class.cast(value).doubleValue());
+        } else if (type == boolean.class || type == Boolean.class) {
+            return generator.write(Boolean.class.cast(value).booleanValue());
+        } else if (type == BigDecimal.class) {
+            return generator.write(BigDecimal.class.cast(value));
+        } else if (type == BigInteger.class) {
+            return generator.write(BigInteger.class.cast(value));
+        } else if (type == short.class || type == Short.class) {
+            return generator.write(Short.class.cast(value).shortValue());
+        } else if (type == char.class || type == Character.class) {
+            return generator.write(Character.class.cast(value).toString());
+        } else if (type == byte.class || type == Byte.class) {
+            return generator.write(Byte.class.cast(value).byteValue());
+        }        
+        return null;
+    }
+
+    private static JsonGenerator writePrimitives(final JsonGenerator generator, final String key, final Class<?> type, final Object value) {
+        if (type == String.class) {
+            return generator.write(key, value.toString());
+        } else if (type == long.class || type == Long.class) {
+            return generator.write(key, Long.class.cast(value).longValue());
+        } else if (type == int.class || type == Integer.class
+                    || type == byte.class || type == Byte.class
+                    || type == short.class || type == Short.class) {
+            return generator.write(key, Number.class.cast(value).intValue());
+        } else if (type == double.class || type == Double.class
+                || type == float.class || type == Float.class) {
+            return generator.write(key, Number.class.cast(value).doubleValue());
+        } else if (type == boolean.class || type == Boolean.class) {
+            return generator.write(key, Boolean.class.cast(value).booleanValue());
+        } else if (type == BigDecimal.class) {
+            return generator.write(key, BigDecimal.class.cast(value));
+        } else if (type == BigInteger.class) {
+            return generator.write(key, BigInteger.class.cast(value));
+        } else if (type == char.class || type == Character.class) {
+            return generator.write(key, Character.class.cast(value).toString());
+        } 
+        return generator;
+    }
+
+    /*private <T> String convertFrom(final Class<T> aClass, final T value) {
+        final Converter<T> converter = (Converter<T>) findConverter(aClass);
+        return doConverFrom(value, converter);
+    }*/
+
+    private static <T> String doConverFrom(final T value, final Converter<T> converter) {
+        if (converter == null) {
+            throw new MapperException("can't convert " + value + " to String");
+        }
+        return converter.toString(value);
+    }
+
+    private <T> Converter<T> findConverter(final Type aClass) {
+        final Converter<T> converter = (Converter<T>) converters.get(aClass);
+        if (converter != null) {
+            return converter;
+        }
+        if (Class.class.isInstance(aClass)) {
+            final Class<?> clazz = Class.class.cast(aClass);
+            if (clazz.isEnum()) {
+                final Converter<T> enumConverter = new EnumConverter(clazz);
+                converters.putIfAbsent(clazz, enumConverter);
+                return enumConverter;
+            }
+        }
+        return null;
+    }
+
+    private Object convertTo(final Type aClass, final String text) {
+        final Converter<?> converter = findConverter(aClass);
+        if (converter == null) {
+            converters.putIfAbsent(aClass, FALLBACK_CONVERTER);
+            return FALLBACK_CONVERTER;
+        }
+        return converter.fromString(text);
+    }
+
+    public <T> void writeArray(final Object object, final OutputStream stream) {
+        writeArray(asList((T[]) object), stream);
+    }
+
+    public <T> void writeArray(final T[] object, final OutputStream stream) {
+        writeArray(asList(object), stream);
+    }
+
+    public <T> void writeArray(final T[] object, final Writer stream) {
+        writeArray(asList(object), stream);
+    }
+
+    public <T> void writeArray(final Collection<T> object, final OutputStream stream) {
+        writeArray(object, new OutputStreamWriter(stream));
+    }
+
+    public <T> void writeArray(final Collection<T> object, final Writer stream) {
+        JsonGenerator generator = generatorFactory.createGenerator(stream);
+        try {
+            if (object == null) {
+                generator = generator.writeStartArray().writeEnd();
+            } else {
+                generator = generator.writeStartArray();
+                for (final T t : object) {
+                    generator = writeItem(generator, t);
+                }
+                generator = generator.writeEnd();
+            }
+        } finally {
+            doCloseOrFlush(generator);
+        }
+    }
+
+    private void doCloseOrFlush(JsonGenerator generator) {
+        if (close) {
+            generator.close();
+        } else {
+            generator.flush();
+        }
+    }
+
+    public <T> void writeIterable(final Iterable<T> object, final OutputStream stream) {
+        writeIterable(object, new OutputStreamWriter(stream));
+    }
+
+    public <T> void writeIterable(final Iterable<T> object, final Writer stream) {
+        JsonGenerator generator = generatorFactory.createGenerator(stream);
+        try {
+            if (object == null) {
+                generator = generator.writeStartArray().writeEnd();
+            } else {
+                generator.writeStartArray();
+                for (final T t : object) {
+                    generator = writeItem(generator, t);
+                }
+                generator.writeEnd();
+            }
+        } finally {
+            doCloseOrFlush(generator);
+        }
+    }
+
+    public void writeObject(final Object object, final Writer stream) {
+        final JsonGenerator generator = generatorFactory.createGenerator(stream);
+        doWriteHandlingNullObject(object, generator);
+    }
+
+    public void writeObject(final Object object, final OutputStream stream) {
+        final JsonGenerator generator = generatorFactory.createGenerator(stream);
+        doWriteHandlingNullObject(object, generator);
+    }
+
+    private void doWriteHandlingNullObject(final Object object, final JsonGenerator generator) {
+        if (object == null) {
+            generator.writeStartObject().writeEnd().close();
+            return;
+        }
+
+        //JsonGenerator gen = null;
+        try {
+            /*gen = */doWriteObject(generator, object);
+        } finally {
+            doCloseOrFlush(generator);
+        }
+    }
+
+    private JsonGenerator doWriteObject(final JsonGenerator generator, final Object object) {
+        try {
+            JsonGenerator gen = generator;
+            if (object == null) {
+                return generator;
+            }
+
+            if (Map.class.isInstance(object)) {
+                gen = gen.writeStartObject();
+                gen = writeMapBody((Map<?, ?>) object, gen);
+                gen = gen.writeEnd();
+                return gen;
+            }
+
+            gen = gen.writeStartObject();
+            gen = doWriteObjectBody(gen, object);
+            return gen.writeEnd();
+        } catch (final InvocationTargetException e) {
+            throw new MapperException(e);
+        } catch (final IllegalAccessException e) {
+            throw new MapperException(e);
+        }
+    }
+
+    private JsonGenerator doWriteObjectBody(final JsonGenerator gen, final Object object) throws IllegalAccessException, InvocationTargetException {
+        final Class<?> objectClass = object.getClass();
+        final Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(objectClass);
+        if (classMapping == null) {
+            throw new MapperException("No mapping for " + objectClass.getName());
+        }
+
+        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)) {
+                continue;
+            }
+
+            generator = writeValue(generator, value.getClass(),
+                                    getter.primitive, getter.array,
+                                    getter.collection, getter.map,
+                                    getterEntry.getKey(),
+                                    getter.converter == null ? value : getter.converter.toString(value));
+        }
+        return generator;
+    }
+
+    private JsonGenerator writeMapBody(final Map<?, ?> object, final JsonGenerator gen) throws InvocationTargetException, IllegalAccessException {
+        JsonGenerator generator = gen;
+        for (final Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
+            final Object value = entry.getValue();
+            if (value == null) {
+                continue;
+            }
+
+            final Object key = entry.getKey();
+            final Class<?> valueClass = value.getClass();
+            final boolean primitive = Mappings.isPrimitive(valueClass);
+            final boolean clazz = mappings.getClassMapping(valueClass) != null;
+            final boolean array = clazz || primitive ? false : valueClass.isArray();
+            final boolean collection = clazz || primitive || array ? false : Collection.class.isAssignableFrom(valueClass);
+            final boolean map = clazz || primitive || array || collection ? false : Map.class.isAssignableFrom(valueClass);
+            generator = writeValue(generator, valueClass,
+                                    primitive, array, collection, map,
+                                    key == null ? "null" : key.toString(), value);
+        }
+        return generator;
+    }
+
+    private JsonGenerator writeValue(final JsonGenerator generator, final Class<?> type,
+                                     final boolean primitive, final boolean array,
+                                     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);
+            for (int i = 0; i < length; i++) {
+                gen = writeItem(gen, Array.get(value, i));
+            }
+            return gen.writeEnd();
+        } else if (collection) {
+            JsonGenerator gen = generator.writeStartArray(key);
+            for (final Object o : Collection.class.cast(value)) {
+                gen = writeItem(gen, o);
+            }
+            return gen.writeEnd();
+        } else if (map) {
+            JsonGenerator gen = generator.writeStartObject(key);
+            gen = writeMapBody((Map<?, ?>) value, gen);
+            return gen.writeEnd();
+        } else if (primitive) {
+            return writePrimitives(generator, key, type, value);
+        } else {
+            final Converter<?> converter = findConverter(type);
+            if (converter != null) {
+                return writeValue(generator, String.class, true, false, false, false, key,
+                                    doConverFrom(value, (Converter<Object>) converter));
+            }
+            return doWriteObjectBody(generator.writeStartObject(key), value).writeEnd();
+        }
+    }
+
+    private JsonGenerator writeItem(final JsonGenerator generator, final Object o) {
+        final JsonGenerator newGen = writePrimitives(generator, o);
+        if (newGen == null) {
+            return doWriteObject(generator, o);
+        }
+        return newGen;
+    }
+
+    public <T> T readObject(final Reader stream, final Type clazz) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        return mapObject(clazz, reader);
+    }
+
+    public <T> T readObject(final InputStream stream, final Type clazz) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        return mapObject(clazz, reader);
+    }
+
+    private <T> T mapObject(final Type clazz, final JsonReader reader) {
+        try {
+            return (T) buildObject(clazz, reader.readObject());
+        } catch (final InstantiationException e) {
+            throw new MapperException(e);
+        } catch (final IllegalAccessException e) {
+            throw new MapperException(e);
+        } finally {
+            if (close) {
+                reader.close();
+            }
+        }
+    }
+
+    public <C extends Collection<T>, T> C readCollection(final InputStream stream, final ParameterizedType genericType, final Class<T> raw) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(genericType, raw);
+        if (mapping == null) {
+            throw new UnsupportedOperationException("type " + genericType + " not supported");
+        }
+        try {
+            return (C) mapCollection(mapping, reader.readArray());
+        } catch (final InstantiationException e) {
+            throw new MapperException(e);
+        } catch (final IllegalAccessException e) {
+            throw new MapperException(e);
+        } finally {
+            if (close) {
+                reader.close();
+            }
+        }
+    }
+
+    public <C extends Collection<T>, T> C readCollection(final Reader stream, final ParameterizedType genericType, final Class<T> raw) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(genericType, raw);
+        if (mapping == null) {
+            throw new UnsupportedOperationException("type " + genericType + " not supported");
+        }
+        try {
+            return (C) mapCollection(mapping, reader.readArray());
+        } catch (final InstantiationException e) {
+            throw new MapperException(e);
+        } catch (final IllegalAccessException e) {
+            throw new MapperException(e);
+        } finally {
+            if (close) {
+                reader.close();
+            }
+        }
+    }
+
+    public <T> T[] readArray(final Reader stream, final Class<T> clazz) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        return mapArray(clazz, reader);
+    }
+
+    public <T> T[] readArray(final InputStream stream, final Class<T> clazz) {
+        final JsonReader reader = readerFactory.createReader(stream);
+        return mapArray(clazz, reader);
+    }
+
+    private <T> T[] mapArray(final Class<T> clazz, final JsonReader reader) {
+        try {
+            return (T[]) buildArrayWithComponentType(reader.readArray(), clazz);
+        } catch (final InstantiationException e) {
+            throw new MapperException(e);
+        } catch (final IllegalAccessException e) {
+            throw new MapperException(e);
+        } finally {
+            if (close) {
+                reader.close();
+            }
+        }
+    }
+
+    private Object buildObject(final Type type, final JsonObject object) throws InstantiationException, IllegalAccessException {
+        final Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(type);
+
+        if (classMapping == null) {
+            if (ParameterizedType.class.isInstance(type)) {
+                final ParameterizedType aType = ParameterizedType.class.cast(type);
+                final Type[] fieldArgTypes = aType.getActualTypeArguments();
+                if (fieldArgTypes.length >= 2) {
+                    final Class<?> raw = Class.class.cast(aType.getRawType());
+                    
+                    final Map map;
+                    if (SortedMap.class.isAssignableFrom(raw)) {
+                        map = new TreeMap();
+                    } else if (ConcurrentMap.class.isAssignableFrom(raw)) {
+                        map = new ConcurrentHashMap(object.size());
+                    } else if (Map.class.isAssignableFrom(raw)) {
+                        map = new HashMap(object.size());
+                    } else {
+                        map = null;
+                    }
+
+                    if (map != null) {
+                        
+                        Type keyType;
+                        if (ParameterizedType.class.isInstance(fieldArgTypes[0])) {
+                            keyType = fieldArgTypes[0];
+                        } else {
+                            keyType = fieldArgTypes[0];
+                        }
+                         
+                        for (final Map.Entry<String, JsonValue> value : object.entrySet()) {
+                            map.put(convertTo(keyType, value.getKey()), toObject(value.getValue(), fieldArgTypes[1]));
+                        }
+                        return map;
+                    }
+                } else {
+                    throw new MapperException("Can't map " + type + ", not a map and no Mapping found");
+                }
+            } else {
+                throw new MapperException("Can't map " + type);
+            }
+        }
+
+        final Object t = classMapping.clazz.newInstance();
+        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 Object convertedValue = value.converter == null?
+                    toObject(jsonValue, value.paramType) : jsonValue.getValueType() == ValueType.STRING ?
+                                                            value.converter.fromString(JsonString.class.cast(jsonValue).getString()):
+                                                                value.converter.fromString(jsonValue.toString());
+                
+            if (convertedValue != null) {
+                try {
+                    setterMethod.invoke(t, convertedValue);
+                } catch (final InvocationTargetException e) {
+                    throw new MapperException(e.getCause());
+                }
+            }
+        }
+
+        return t;
+    }
+
+    private Object toObject(final JsonValue jsonValue, final Type type) throws InstantiationException, IllegalAccessException {
+      
+        if(jsonValue == null || jsonValue == JsonValue.NULL) {           
+            return null;
+        }
+        
+        if (type == Boolean.class || type == boolean.class) {
+            
+            //if this would be commented out than the json string value "true" would pe parsed to a bool literal
+            //but this is according to json spec invalid
+            /*if (JsonString.class.isInstance(jsonValue)) {
+                return Boolean.valueOf(JsonString.class.cast(jsonValue).getString());
+            }*/
+            
+            if(jsonValue == JsonValue.FALSE) {
+                return Boolean.FALSE;
+            }
+            
+            if(jsonValue == JsonValue.TRUE) {
+                return Boolean.TRUE;
+            }
+            
+            throw new MapperException("Unable to parse "+jsonValue+" to boolean");
+        }
+        
+        if (type == Character.class || type == char.class) {
+            
+            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
+        }
+        
+        if (JsonObject.class.isInstance(jsonValue)) {
+            return buildObject(type, JsonObject.class.cast(jsonValue));
+        } else if (JsonArray.class.isInstance(jsonValue)) {
+            return buildArray(type, JsonArray.class.cast(jsonValue));
+        } else if (JsonNumber.class.isInstance(jsonValue)) {
+                
+                final JsonNumber number = JsonNumber.class.cast(jsonValue);
+                
+                if (type == Long.class || type == long.class) {
+                    return number.longValue();
+                }
+                
+                if (type == Integer.class || type == int.class) {
+                    return number.intValue();
+                }
+                                
+                if (type == Short.class || type == short.class) {
+                    return (short) number.intValue();
+                }
+                
+                if (type == Byte.class || type == byte.class) {
+                    return (byte) number.intValue();
+                }
+                
+                if (type == Float.class || type == float.class) {
+                    return (float) number.doubleValue();
+                }
+                
+                if (type == Double.class || type == double.class) {
+                    return number.doubleValue();
+                }
+                
+                if (type == BigInteger.class) {
+                    return number.bigIntegerValue();
+                }
+                if (type == BigDecimal.class) {
+                    return number.bigDecimalValue();
+                }
+           
+        } else if (JsonString.class.isInstance(jsonValue)) {
+            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
+        }
+
+        
+        throw new MapperException("Unable to parse "+jsonValue+" to "+type);
+    }
+
+    private Object buildArray(final Type type, final JsonArray jsonArray) throws IllegalAccessException, InstantiationException {
+        if (Class.class.isInstance(type)) {
+            final Class clazz = Class.class.cast(type);
+            if (clazz.isArray()) {
+                final Class<?> componentType = clazz.getComponentType();
+                return buildArrayWithComponentType(jsonArray, componentType);
+            }
+        }
+
+        if (ParameterizedType.class.isInstance(type)) {
+            final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(
+                    ParameterizedType.class.cast(type), (Class<Object>) ParameterizedType.class.cast(type).getRawType());
+            if (mapping != null) {
+                return mapCollection(mapping, jsonArray);
+            }
+        }
+
+        throw new UnsupportedOperationException("type " + type + " not supported");
+    }
+
+    private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray) throws InstantiationException, IllegalAccessException {
+        final Collection collection;
+        
+        if (SortedSet.class == mapping.raw) {
+            collection = new TreeSet<T>();
+        } else if (Set.class == mapping.raw) {
+            collection = new HashSet<T>(jsonArray.size());
+        } else if (Queue.class == mapping.raw) {
+            collection = new ArrayBlockingQueue<T>(jsonArray.size());
+          //fail fast if collection is not know, assume Collection.class to be compatible with ArrayList is wrong for almost all cases
+        } else if (List.class == mapping.raw /*|| Collection.class == mapping.raw*/) {
+            collection = new ArrayList<T>(jsonArray.size());
+        } else {
+            throw new IllegalStateException("not supported collection type: " + mapping.raw.getName());
+        }
+
+        for (final JsonValue value : jsonArray) {
+            final Object element = toObject(value, mapping.arg);
+            collection.add(element);
+        }
+        return collection;
+    }
+
+    private Object buildArrayWithComponentType(final JsonArray jsonArray, final Class<?> componentType) throws InstantiationException, IllegalAccessException {
+        final Object array = Array.newInstance(componentType, jsonArray.size());
+        int i = 0;
+        for (final JsonValue value : jsonArray) {
+            Array.set(array, i++, toObject(value, componentType));
+        }
+        return array;
+    }
+
+    private static class FallbackConverter implements Converter<Object> {
+        @Override
+        public String toString(final Object instance) {
+            return instance.toString();
+        }
+
+        @Override
+        public Object fromString(final String text) {
+            throw new UnsupportedOperationException("Using fallback converter, " +
+                "this only works in write mode but not in read. Please register a custom converter to do so.");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..e31aab6
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -0,0 +1,127 @@
+/*
+ * 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 org.apache.johnzon.mapper.converter.BigDecimalConverter;
+import org.apache.johnzon.mapper.converter.BigIntegerConverter;
+import org.apache.johnzon.mapper.converter.BooleanConverter;
+import org.apache.johnzon.mapper.converter.ByteConverter;
+import org.apache.johnzon.mapper.converter.CachedDelegateConverter;
+import org.apache.johnzon.mapper.converter.CharacterConverter;
+import org.apache.johnzon.mapper.converter.ClassConverter;
+import org.apache.johnzon.mapper.converter.DateConverter;
+import org.apache.johnzon.mapper.converter.DoubleConverter;
+import org.apache.johnzon.mapper.converter.FloatConverter;
+import org.apache.johnzon.mapper.converter.IntegerConverter;
+import org.apache.johnzon.mapper.converter.LongConverter;
+import org.apache.johnzon.mapper.converter.ShortConverter;
+import org.apache.johnzon.mapper.converter.StringConverter;
+
+import javax.json.JsonReaderFactory;
+import javax.json.spi.JsonProvider;
+import javax.json.stream.JsonGeneratorFactory;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MapperBuilder {
+    private static final Map<Class<?>, Converter<?>> DEFAULT_CONVERTERS = new HashMap<Class<?>, Converter<?>>();
+
+    static {
+        //DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyy-MM-dd'T'HH:mm:ssZ")); // ISO8601 long RFC822 zone
+        DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyyMMddHHmmssZ")); // ISO8601 short
+        DEFAULT_CONVERTERS.put(Class.class, new ClassConverter());
+        DEFAULT_CONVERTERS.put(String.class, new StringConverter());
+        DEFAULT_CONVERTERS.put(BigDecimal.class, new BigDecimalConverter());
+        DEFAULT_CONVERTERS.put(BigInteger.class, new BigIntegerConverter());
+        DEFAULT_CONVERTERS.put(Byte.class, new CachedDelegateConverter<Byte>(new ByteConverter()));
+        DEFAULT_CONVERTERS.put(Character.class, new CharacterConverter());
+        DEFAULT_CONVERTERS.put(Double.class, new DoubleConverter());
+        DEFAULT_CONVERTERS.put(Float.class, new FloatConverter());
+        DEFAULT_CONVERTERS.put(Integer.class, new IntegerConverter());
+        DEFAULT_CONVERTERS.put(Long.class, new LongConverter());
+        DEFAULT_CONVERTERS.put(Short.class, new ShortConverter());
+        DEFAULT_CONVERTERS.put(Boolean.class, new CachedDelegateConverter<Boolean>(new BooleanConverter()));
+        DEFAULT_CONVERTERS.put(byte.class, DEFAULT_CONVERTERS.get(Byte.class));
+        DEFAULT_CONVERTERS.put(char.class, new CharacterConverter());
+        DEFAULT_CONVERTERS.put(double.class, DEFAULT_CONVERTERS.get(Double.class));
+        DEFAULT_CONVERTERS.put(float.class, DEFAULT_CONVERTERS.get(Float.class));
+        DEFAULT_CONVERTERS.put(int.class, DEFAULT_CONVERTERS.get(Integer.class));
+        DEFAULT_CONVERTERS.put(long.class, DEFAULT_CONVERTERS.get(Long.class));
+        DEFAULT_CONVERTERS.put(short.class, DEFAULT_CONVERTERS.get(Short.class));
+        DEFAULT_CONVERTERS.put(boolean.class, DEFAULT_CONVERTERS.get(Boolean.class));
+    }
+
+    private JsonReaderFactory readerFactory;
+    private JsonGeneratorFactory generatorFactory;
+    private boolean doCloseOnStreams = false;
+    private int version = -1;
+    private Comparator<String> attributeOrder = null;
+    private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS);
+
+    public Mapper build() {
+        if (readerFactory == null || generatorFactory == null) {
+            final JsonProvider provider = JsonProvider.provider();
+            final Map<String, Object> config = Collections.<String, Object>emptyMap();
+            if (readerFactory == null) {
+                readerFactory = provider.createReaderFactory(config);
+            }
+            if (generatorFactory == null) {
+                generatorFactory = provider.createGeneratorFactory(config);
+            }
+        }
+
+        return new Mapper(readerFactory, generatorFactory, doCloseOnStreams, converters, version, attributeOrder);
+    }
+
+    public MapperBuilder setAttributeOrder(final Comparator<String> attributeOrder) {
+        this.attributeOrder = attributeOrder;
+        return this;
+    }
+
+    public MapperBuilder setReaderFactory(final JsonReaderFactory readerFactory) {
+        this.readerFactory = readerFactory;
+        return this;
+    }
+
+    public MapperBuilder setGeneratorFactory(final JsonGeneratorFactory generatorFactory) {
+        this.generatorFactory = generatorFactory;
+        return this;
+    }
+
+    public MapperBuilder setDoCloseOnStreams(final boolean doCloseOnStreams) {
+        this.doCloseOnStreams = doCloseOnStreams;
+        return this;
+    }
+
+    public MapperBuilder addPropertyEditor(final Class<?> clazz, final Converter<?> converter) {
+        this.converters.put(clazz, converter);
+        return this;
+    }
+
+    public MapperBuilder setVersion(final int version) {
+        this.version = version;
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperException.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperException.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperException.java
new file mode 100644
index 0000000..6b5f00a
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperException.java
@@ -0,0 +1,31 @@
+/*
+ * 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 javax.json.JsonException;
+
+public class MapperException extends JsonException {
+    public MapperException(final Throwable e) {
+        super(e.getMessage(), e);
+    }
+
+    public MapperException(final String s) {
+        super(s);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigDecimalConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigDecimalConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigDecimalConverter.java
new file mode 100644
index 0000000..b5864e0
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigDecimalConverter.java
@@ -0,0 +1,35 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+import java.math.BigDecimal;
+
+public class BigDecimalConverter implements Converter<BigDecimal> {
+    @Override
+    public String toString(final BigDecimal instance) {
+        return instance.toString();
+    }
+
+    @Override
+    public BigDecimal fromString(final String text) {
+        return new BigDecimal(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigIntegerConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigIntegerConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigIntegerConverter.java
new file mode 100644
index 0000000..16710dd
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BigIntegerConverter.java
@@ -0,0 +1,35 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+import java.math.BigInteger;
+
+public class BigIntegerConverter implements Converter<BigInteger> {
+    @Override
+    public String toString(final BigInteger instance) {
+        return instance.toString();
+    }
+
+    @Override
+    public BigInteger fromString(final String text) {
+        return new BigInteger(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BooleanConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BooleanConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BooleanConverter.java
new file mode 100644
index 0000000..668b7df
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/BooleanConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class BooleanConverter implements Converter<Boolean> {
+    @Override
+    public String toString(final Boolean instance) {
+        return Boolean.toString(instance);
+    }
+
+    @Override
+    public Boolean fromString(final String text) {
+        return Boolean.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ByteConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ByteConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ByteConverter.java
new file mode 100644
index 0000000..f4d7991
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ByteConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class ByteConverter implements Converter<Byte> {
+    @Override
+    public String toString(final Byte instance) {
+        return Byte.toString(instance);
+    }
+
+    @Override
+    public Byte fromString(final String text) {
+        return Byte.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CachedDelegateConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CachedDelegateConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CachedDelegateConverter.java
new file mode 100644
index 0000000..e1babff
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CachedDelegateConverter.java
@@ -0,0 +1,54 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public class CachedDelegateConverter<T> implements Converter<T> {
+    private final ConcurrentMap<T, String> strings = new ConcurrentHashMap<T, String>();
+    private final ConcurrentMap<String, T> values = new ConcurrentHashMap<String, T>();
+    private final Converter<T> delegate;
+
+    public CachedDelegateConverter(final Converter<T> delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public String toString(final T instance) {
+        String v = strings.get(instance);
+        if (v == null) {
+            v = delegate.toString(instance);
+            strings.putIfAbsent(instance, v);
+        }
+        return v;
+    }
+
+    @Override
+    public T fromString(final String text) {
+        T v = values.get(text);
+        if (v == null) {
+            v = delegate.fromString(text);
+            values.putIfAbsent(text, v);
+        }
+        return v;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CharacterConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CharacterConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CharacterConverter.java
new file mode 100644
index 0000000..d028eb6
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/CharacterConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class CharacterConverter implements Converter<Character> {
+    @Override
+    public String toString(final Character instance) {
+        return Character.toString(instance);
+    }
+
+    @Override
+    public Character fromString(final String text) {
+        return text.length() > 0 ? text.charAt(0) : null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ClassConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ClassConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ClassConverter.java
new file mode 100644
index 0000000..31e0f2c
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/ClassConverter.java
@@ -0,0 +1,37 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class ClassConverter implements Converter<Class<?>> {
+    @Override
+    public String toString(final Class<?> instance) {
+        return instance.getName();
+    }
+
+    @Override
+    public Class<?> fromString(final String text) {
+        try {
+            return Class.forName(text, true, Thread.currentThread().getContextClassLoader());
+        } catch (final ClassNotFoundException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DateConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DateConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DateConverter.java
new file mode 100644
index 0000000..00af32a
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DateConverter.java
@@ -0,0 +1,54 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateConverter implements Converter<Date> {
+    // TODO: see if we can clean it
+    private final ThreadLocal<DateFormat> format;
+
+    public DateConverter(final String pattern) {
+        format = new ThreadLocal<DateFormat>() {
+            @Override
+            protected DateFormat initialValue() {
+                return new SimpleDateFormat(pattern);
+            }
+        };
+    }
+
+    @Override
+    public String toString(final Date instance) {
+        return format.get().format(instance);
+    }
+
+    @Override
+    public Date fromString(final String text) {
+        try {
+            return format.get().parse(text);
+        } catch (final ParseException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DoubleConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DoubleConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DoubleConverter.java
new file mode 100644
index 0000000..ac73684
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/DoubleConverter.java
@@ -0,0 +1,33 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+public class DoubleConverter implements Converter<Double> {
+    @Override
+    public String toString(final Double instance) {
+        return Double.toString(instance);
+    }
+
+    @Override
+    public Double fromString(final String text) {
+        return Double.valueOf(text);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
new file mode 100644
index 0000000..793356d
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/converter/EnumConverter.java
@@ -0,0 +1,46 @@
+/*
+ * 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.converter;
+
+import org.apache.johnzon.mapper.Converter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class EnumConverter<T extends Enum<T>> implements Converter<T> {
+    private final Map<String, T> values;
+
+    public EnumConverter(final Class<T> aClass) {
+        final T[] enumConstants = aClass.getEnumConstants();
+        values = new HashMap<String, T>(enumConstants.length);
+        for (final T t : enumConstants) {
+            values.put(t.name(), t);
+        }
+    }
+
+    @Override // no need of cache here, it is already fast
+    public String toString(final T instance) {
+        return instance.name();
+    }
+
+    @Override
+    public T fromString(final String text) {
+        return values.get(text);
+    }
+}


[11/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/FloatConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/FloatConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/FloatConverter.java
deleted file mode 100644
index 7e6fb1e..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/FloatConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class FloatConverter implements Converter<Float> {
-    @Override
-    public String toString(final Float instance) {
-        return Float.toString(instance);
-    }
-
-    @Override
-    public Float fromString(final String text) {
-        return Float.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/IntegerConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/IntegerConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/IntegerConverter.java
deleted file mode 100644
index 8677b3e..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/IntegerConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class IntegerConverter implements Converter<Integer> {
-    @Override
-    public String toString(final Integer instance) {
-        return Integer.toString(instance);
-    }
-
-    @Override
-    public Integer fromString(final String text) {
-        return Integer.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/LongConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/LongConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/LongConverter.java
deleted file mode 100644
index 62b17ec..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/LongConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class LongConverter implements Converter<Long> {
-    @Override
-    public String toString(final Long instance) {
-        return Long.toString(instance);
-    }
-
-    @Override
-    public Long fromString(final String text) {
-        return Long.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ShortConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ShortConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ShortConverter.java
deleted file mode 100644
index e9c48ec..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ShortConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class ShortConverter implements Converter<Short> {
-    @Override
-    public String toString(final Short instance) {
-        return Short.toString(instance);
-    }
-
-    @Override
-    public Short fromString(final String text) {
-        return Short.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/StringConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/StringConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/StringConverter.java
deleted file mode 100644
index 713702f..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/StringConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class StringConverter implements Converter<String> {
-    @Override
-    public String toString(final String instance) {
-        return instance;
-    }
-
-    @Override
-    public String fromString(final String text) {
-        return text;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
deleted file mode 100644
index 4006515..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * 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.fleece.mapper.reflection;
-
-import org.apache.fleece.mapper.Converter;
-import org.apache.fleece.mapper.FleeceConverter;
-import org.apache.fleece.mapper.FleeceIgnore;
-import org.apache.fleece.mapper.MapperException;
-
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-public class Mappings {
-    public static class ClassMapping {
-        public final Class<?> clazz;
-        public final Map<String, Getter> getters;
-        public final Map<String, Setter> setters;
-
-        protected ClassMapping(final Class<?> clazz,
-                               final Map<String, Getter> getters, final Map<String, Setter> setters) {
-            this.clazz = clazz;
-            this.getters = getters;
-            this.setters = setters;
-        }
-    }
-
-    public static class CollectionMapping {
-        public final Class<?> raw;
-        public final Type arg;
-        public final boolean primitive;
-
-        public CollectionMapping(final boolean primitive, final Class<?> collectionType, final Type fieldArgType) {
-            this.raw = collectionType;
-            this.arg = fieldArgType;
-            this.primitive = primitive;
-        }
-    }
-
-    public static class Getter {
-        public final Method setter;
-        public final int version;
-        public final Converter<Object> converter;
-        public final boolean primitive;
-        public final boolean array;
-        public final boolean map;
-        public final boolean collection;
-
-        public Getter(final Method setter,
-                      final boolean primitive, final boolean array,
-                      final boolean collection, final boolean map,
-                      final Converter<Object> converter, final int version) {
-            this.setter = setter;
-            this.converter = converter;
-            this.version = version;
-            this.array = array;
-            this.map = map && converter == null;
-            this.collection = collection;
-            this.primitive = primitive;
-        }
-    }
-
-    public static class Setter {
-        public final Method setter;
-        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;
-            this.paramType = paramType;
-            this.converter = converter;
-            this.version = version;
-            this.primitive = primitive;
-        }
-    }
-
-    protected final ConcurrentMap<Type, ClassMapping> classes = new ConcurrentHashMap<Type, ClassMapping>();
-    protected final ConcurrentMap<Type, CollectionMapping> collections = new ConcurrentHashMap<Type, CollectionMapping>();
-    protected final Comparator<String> fieldOrdering;
-
-    public Mappings(final Comparator<String> attributeOrder) {
-        this.fieldOrdering = attributeOrder;
-    }
-
-    public <T> CollectionMapping findCollectionMapping(final ParameterizedType genericType, final Class<T> raw) {
-        CollectionMapping collectionMapping = collections.get(genericType);
-        if (collectionMapping == null) {
-            collectionMapping = createCollectionMapping(genericType, raw);
-            if (collectionMapping == null) {
-                return null;
-            }
-            final CollectionMapping existing = collections.putIfAbsent(genericType, collectionMapping);
-            if (existing != null) {
-                collectionMapping = existing;
-            }
-        }
-        return collectionMapping;
-    }
-
-    private <T> CollectionMapping createCollectionMapping(final ParameterizedType aType, final Class<T> raw) {
-        final Type[] fieldArgTypes = aType.getActualTypeArguments();
-        if (fieldArgTypes.length == 1) {
-            final Class<?> collectionType;
-            if (List.class.isAssignableFrom(raw)) {
-                collectionType = List.class;
-            }else if (SortedSet.class.isAssignableFrom(raw)) {
-                collectionType = SortedSet.class;
-            } else if (Set.class.isAssignableFrom(raw)) {
-                collectionType = Set.class;
-            } else if (Queue.class.isAssignableFrom(raw)) {
-                collectionType = Queue.class;
-            } else if (Collection.class.isAssignableFrom(raw)) {
-                collectionType = Collection.class;
-            } else {
-                return null;
-            }
-
-            final CollectionMapping mapping = new CollectionMapping(isPrimitive(fieldArgTypes[0]), collectionType, fieldArgTypes[0]);
-            collections.putIfAbsent(aType, mapping);
-            return mapping;
-        }
-        return null;
-    }
-
-    // has JSon API a method for this type
-    public static boolean isPrimitive(final Type type) {
-        if (type == String.class) {
-            return true;
-        } else if (type == char.class || type == Character.class) {
-            return true;
-        } else if (type == long.class || type == Long.class) {
-            return true;
-        } else if (type == int.class || type == Integer.class
-                || type == byte.class || type == Byte.class
-                || type == short.class || type == Short.class) {
-            return true;
-        } else if (type == double.class || type == Double.class
-                || type == float.class || type == Float.class) {
-            return true;
-        } else if (type == boolean.class || type == Boolean.class) {
-            return true;
-        } else if (type == BigDecimal.class) {
-            return true;
-        } else if (type == BigInteger.class) {
-            return true;
-        }
-        return false;
-    }
-
-    public ClassMapping getClassMapping(final Type clazz) {
-        return classes.get(clazz);
-    }
-
-    public ClassMapping findOrCreateClassMapping(final Type clazz) {
-        ClassMapping classMapping = classes.get(clazz);
-        if (classMapping == null) {
-            if (!Class.class.isInstance(clazz) || Map.class.isAssignableFrom(Class.class.cast(clazz))) {
-                return null;
-            }
-
-            classMapping = createClassMapping(Class.class.cast(clazz));
-            final ClassMapping existing = classes.putIfAbsent(clazz, classMapping);
-            if (existing != null) {
-                classMapping = existing;
-            }
-        }
-        return classMapping;
-    }
-
-    private ClassMapping createClassMapping(final Class<?> clazz) {
-        try {
-            final Map<String, Getter> getters = fieldOrdering != null ?
-                new TreeMap<String, Getter>(fieldOrdering) : new HashMap<String, Getter>();
-            final Map<String, Setter> setters = fieldOrdering != null ?
-                new TreeMap<String, Setter>(fieldOrdering) : new HashMap<String, Setter>();
-
-            final PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
-            for (final PropertyDescriptor descriptor : propertyDescriptors) {
-                final Method writeMethod = descriptor.getWriteMethod();
-                final FleeceIgnore writeIgnore = writeMethod != null ? writeMethod.getAnnotation(FleeceIgnore.class) : null;
-                if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class
-                        && (writeIgnore == null || writeIgnore.minVersion() >= 0)) {
-                    if (descriptor.getName().equals("metaClass")) {
-                        continue;
-                    }
-                    final Type param = writeMethod.getGenericParameterTypes()[0];
-                    setters.put(descriptor.getName(), new Setter(
-                            writeMethod,
-                            isPrimitive(param),
-                            param,
-                            findConverter(writeMethod),
-                            writeIgnore != null ? writeIgnore.minVersion() : -1));
-                }
-
-                final Method readMethod = descriptor.getReadMethod();
-                final FleeceIgnore readIgnore = readMethod != null ? readMethod.getAnnotation(FleeceIgnore.class) : null;
-                if (readMethod != null && readMethod.getDeclaringClass() != Object.class
-                        && (readIgnore == null || readIgnore.minVersion() >= 0)) {
-                    if (descriptor.getName().equals("metaClass")) {
-                        continue;
-                    }
-
-                    final Class<?> returnType = readMethod.getReturnType();
-                    getters.put(descriptor.getName(), new Getter(
-                            readMethod,
-                            isPrimitive(returnType),
-                            returnType.isArray(),
-                            Collection.class.isAssignableFrom(returnType),
-                            Map.class.isAssignableFrom(returnType),
-                            findConverter(readMethod),
-                            readIgnore != null ? readIgnore.minVersion() : -1));
-                }
-            }
-
-            return new ClassMapping(clazz, getters, setters);
-        } catch (final IntrospectionException e) {
-            throw new MapperException(e);
-        }
-    }
-
-    private static Converter findConverter(final Method method) {
-        Converter converter = null;
-        if (method.getAnnotation(FleeceConverter.class) != null) {
-            try {
-                converter = method.getAnnotation(FleeceConverter.class).value().newInstance();
-            } catch (final Exception e) {
-                throw new IllegalArgumentException(e);
-            }
-        }
-        return converter;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/test/java/org/apache/fleece/mapper/LiteralTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/LiteralTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/LiteralTest.java
deleted file mode 100644
index 9ba12d9..0000000
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/LiteralTest.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import org.junit.Test;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Comparator;
-
-import static org.junit.Assert.assertEquals;
-
-public class LiteralTest {
-    @Test
-    public void writeReadNumbers() {
-        NumberClass nc = new NumberClass();
-        final StringWriter sw = new StringWriter();
-        nc.setBg(new BigDecimal("123.123"));
-        nc.setBi(new BigInteger("123"));
-        nc.setDoubleNumber(123.123);
-        nc.setBool(true);
-        nc.setByteNumber((byte) 1);
-        nc.setFloatNumber(123);
-        nc.setShortNumber((short) 1);
-        nc.setLongNumber(123L);
-        nc.setIntNumber(123);
-
-        final String expectedJson = "{\"shortNumber\":1,\"byteNumber\":1,\"intNumber\":123,\"floatNumber\":123.0,\"bg\":123.123,\"bool\":true,\"bi\":123,\"longNumber\":123,\"doubleNumber\":123.123}";
-        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().setAttributeOrder(attributeOrder).build().writeObject(nc, sw);
-        assertEquals(expectedJson, sw.toString());
-        final NumberClass read = new MapperBuilder().setAttributeOrder(attributeOrder).build()
-                    .readObject(new StringReader(sw.toString()), NumberClass.class);
-        assertEquals(nc, read);
-
-    }
-
-    @Test(expected = NumberFormatException.class)
-    public void writeReadNumbersInf() {
-        NumberClass nc = new NumberClass();
-        final StringWriter sw = new StringWriter();
-        nc.setBg(new BigDecimal("123.123"));
-        nc.setBi(new BigInteger("123"));
-        nc.setDoubleNumber(Double.POSITIVE_INFINITY);
-        nc.setBool(true);
-        nc.setByteNumber((byte) 1);
-        nc.setFloatNumber(123);
-        nc.setShortNumber((short) 1);
-        nc.setLongNumber(123L);
-        nc.setIntNumber(123);
-
-        new MapperBuilder().build().writeObject(nc, sw);
-
-    }
-
-    @Test(expected = NumberFormatException.class)
-    public void writeReadNumbersNaN() {
-        NumberClass nc = new NumberClass();
-        final StringWriter sw = new StringWriter();
-        nc.setBg(new BigDecimal("123.123"));
-        nc.setBi(new BigInteger("123"));
-        nc.setDoubleNumber(Double.NaN);
-        nc.setBool(true);
-        nc.setByteNumber((byte) 1);
-        nc.setFloatNumber(123);
-        nc.setShortNumber((short) 1);
-        nc.setLongNumber(123L);
-        nc.setIntNumber(123);
-
-        new MapperBuilder().build().writeObject(nc, sw);
-
-    }
-
-    public static class NumberClass {
-        private BigDecimal bg;
-        private BigInteger bi;
-        private int intNumber;
-        private long longNumber;
-        private byte byteNumber;
-        private short shortNumber;
-        private double doubleNumber;
-        private float floatNumber;
-        private boolean bool;
-
-        public BigDecimal getBg() {
-            return bg;
-        }
-
-        public void setBg(BigDecimal bg) {
-            this.bg = bg;
-        }
-
-        public BigInteger getBi() {
-            return bi;
-        }
-
-        public void setBi(BigInteger bi) {
-            this.bi = bi;
-        }
-
-        public int getIntNumber() {
-            return intNumber;
-        }
-
-        public void setIntNumber(int intNumber) {
-            this.intNumber = intNumber;
-        }
-
-        public long getLongNumber() {
-            return longNumber;
-        }
-
-        public void setLongNumber(long longNumber) {
-            this.longNumber = longNumber;
-        }
-
-        public byte getByteNumber() {
-            return byteNumber;
-        }
-
-        public void setByteNumber(byte byteNumber) {
-            this.byteNumber = byteNumber;
-        }
-
-        public short getShortNumber() {
-            return shortNumber;
-        }
-
-        public void setShortNumber(short shortNumber) {
-            this.shortNumber = shortNumber;
-        }
-
-        public double getDoubleNumber() {
-            return doubleNumber;
-        }
-
-        public void setDoubleNumber(double doubleNumber) {
-            this.doubleNumber = doubleNumber;
-        }
-
-        public float getFloatNumber() {
-            return floatNumber;
-        }
-
-        public void setFloatNumber(float floatNumber) {
-            this.floatNumber = floatNumber;
-        }
-
-        public boolean isBool() {
-            return bool;
-        }
-
-        public void setBool(boolean bool) {
-            this.bool = bool;
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((bg == null) ? 0 : bg.hashCode());
-            result = prime * result + ((bi == null) ? 0 : bi.hashCode());
-            result = prime * result + (bool ? 1231 : 1237);
-            result = prime * result + byteNumber;
-            long temp;
-            temp = Double.doubleToLongBits(doubleNumber);
-            result = prime * result + (int) (temp ^ (temp >>> 32));
-            result = prime * result + Float.floatToIntBits(floatNumber);
-            result = prime * result + intNumber;
-            result = prime * result + (int) (longNumber ^ (longNumber >>> 32));
-            result = prime * result + shortNumber;
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj == null) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            NumberClass other = (NumberClass) obj;
-            if (bg == null) {
-                if (other.bg != null) {
-                    return false;
-                }
-            } else if (!bg.equals(other.bg)) {
-                return false;
-            }
-            if (bi == null) {
-                if (other.bi != null) {
-                    return false;
-                }
-            } else if (!bi.equals(other.bi)) {
-                return false;
-            }
-            if (bool != other.bool) {
-                return false;
-            }
-            if (byteNumber != other.byteNumber) {
-                return false;
-            }
-            if (Double.doubleToLongBits(doubleNumber) != Double.doubleToLongBits(other.doubleNumber)) {
-                return false;
-            }
-            if (Float.floatToIntBits(floatNumber) != Float.floatToIntBits(other.floatNumber)) {
-                return false;
-            }
-            if (intNumber != other.intNumber) {
-                return false;
-            }
-            if (longNumber != other.longNumber) {
-                return false;
-            }
-            if (shortNumber != other.shortNumber) {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            return "NumberClass [bg=" + bg + ", bi=" + bi + ", intNumber=" + intNumber + ", longNumber=" + longNumber + ", byteNumber=" + byteNumber + ", shortNumber=" + shortNumber + ", doubleNumber=" + doubleNumber + ", floatNumber=" + floatNumber + ", bool=" + bool + "]";
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
deleted file mode 100644
index 4f020e6..0000000
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.concurrent.ArrayBlockingQueue;
-
-import static org.junit.Assert.assertEquals;
-
-public class MapperEnhancedTest {
-
-    @Test
-    public void writeNull() {
-        final StringWriter sw = new StringWriter();
-        new MapperBuilder().build().writeObject(null, sw);
-        assertEquals("{}", sw.toString());
-    }
-    
-    @Test
-    public void writeReadChar() {
-        CharClass charClass = new CharClass();
-        charClass.setCharValue('G');
-        charClass.setCharArr(new char[]{'G','O'});
-        final StringWriter sw = new StringWriter();
-        
-        new MapperBuilder().build().writeObject(charClass, sw);
-        assertEquals("{\"charArr\":[\"G\",\"O\"],\"charValue\":\"G\"}", sw.toString());
-        CharClass  read = new MapperBuilder().build().readObject(new StringReader(sw.toString()), CharClass.class);
-        Assert.assertNotNull(read);
-        Assert.assertEquals('G', read.getCharValue());
-        Assert.assertTrue(Arrays.equals(new char[]{'G','O'}, read.getCharArr()));
-    }
-    
-    @Test
-    public void writeReadSortedMap() {
-        SomaClass soseClass = new SomaClass();
-        soseClass.getSoma().put("key1", "val1");
-        soseClass.getSoma().put("key2", "val2");
-        final StringWriter sw = new StringWriter();
-        
-        new MapperBuilder().build().writeObject(soseClass, sw);
-        assertEquals("{\"soma\":{\"key1\":\"val1\",\"key2\":\"val2\"}}", sw.toString());
-        new MapperBuilder().build().readObject(new StringReader(sw.toString()), SomaClass.class);
-        
-    }
-    
-    @Test
-    public void writeReadSortedSet() {
-        SoseClass soseClass = new SoseClass();
-        soseClass.getSose().add("string1");
-        soseClass.getSose().add("string2");
-        final StringWriter sw = new StringWriter();
-        
-        new MapperBuilder().build().writeObject(soseClass, sw);
-       
-        assertEquals("{\"sose\":[\"string1\",\"string2\"]}", sw.toString());
-        new MapperBuilder().build().readObject(new StringReader(sw.toString()), SoseClass.class);
-       
-    }
-    
-    @Test
-    public void writeReadQueue() {
-        QueueClass queueClass = new QueueClass();
-        queueClass.getQueue().add("string1");
-        queueClass.getQueue().add("string2");
-        final StringWriter sw = new StringWriter();
-        
-        new MapperBuilder().build().writeObject(queueClass, sw);
-       
-        assertEquals("{\"queue\":[\"string1\",\"string2\"]}", sw.toString());
-        new MapperBuilder().build().readObject(new StringReader(sw.toString()), QueueClass.class);
-       
-    }
-
-    @Test
-    public void writeTestclass() {
-        final StringWriter sw = new StringWriter();
-        final TestClass tc2 = buildTestClassInstance();
-
-        final String json = "{" +
-            "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
-            "\"dates\":[]," +
-
-            "\"inner\":{" +
-                "\"bd\":-456.4567890987654321," +
-                "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
-                "\"dates\":[]," +
-                "\"sose\":[\"string1\",\"string2\"]," +
-                "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
-            "}," +
-            "\"sose\":[]," +
-            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}";
-        new MapperBuilder().setAttributeOrder(new Comparator<String>() {
-            @Override
-            public int compare(String o1, String o2) {
-                return json.indexOf(o1) - json.indexOf(o2);
-            }
-        }).build().writeObject(tc2, sw);
-        assertEquals(json, sw.toString());
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void needConvertersForComplexTypes() {
-        final String str = "{" +
-            "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
-            "\"dates\":[]," +
-            "\"sose\":[]," +
-            "\"inner\":{" +
-            "\"bd\":-456.4567890987654321," +
-            "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন􏿿\"," +
-            "\"dates\":[]," +
-            "\"sose\":[\"string1\",\"string2\"]," +
-            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
-            "}," +
-            "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}";
-
-        new MapperBuilder().build().readObject(new StringReader(str), TestClass.class);
-    }
-
-    private TestClass buildTestClassInstance() {
-        final TestClass tc1 = new TestClass(null);
-        final Map<String, Integer> m = new TreeMap<String, Integer>();
-        m.put("key1", -100);
-        m.put("key2", +100);
-        final Map<String, Integer> m2 = new TreeMap<String, Integer>();
-        m.put("key11", -1002);
-        m.put("key22", +1002);
-        final List<Map<String, Integer>> l = new ArrayList<Map<String, Integer>>();
-        l.add(m);
-        l.add(m2);
-        tc1.sose.add("string1");
-        tc1.sose.add("string2");
-        tc1.map.put(l, 100L);
-
-        final TestClass tc2 = new TestClass(tc1);
-        final Map<String, Integer> m3 = new TreeMap<String, Integer>();
-        m3.put("key1", -100);
-        m3.put("key2", +100);
-        final Map<String, Integer> m4 = new TreeMap<String, Integer>();
-        m4.put("key11", -1002);
-        m4.put("key22", +1002);
-        final List<Map<String, Integer>> l1 = new ArrayList<Map<String, Integer>>();
-        l1.add(m);
-        l1.add(m2);
-        tc2.map.put(l1, 200L);
-        return tc2;
-    }
-
-    public static class QueueClass {
-        private Queue<String> queue = new ArrayBlockingQueue<String>(5);
-
-        public Queue<String> getQueue() {
-            return queue;
-        }
-
-        public void setQueue(Queue<String> queue) {
-            this.queue = queue;
-        }
-    }
-    
-    public static class SoseClass {
-        private SortedSet<String> sose = new TreeSet<String>();
-
-        public SortedSet<String> getSose() {
-            return sose;
-        }
-
-        public void setSose(SortedSet<String> sose) {
-            this.sose = sose;
-        }
-    }
-    
-    public static class SomaClass {
-        private SortedMap<String, String> soma = new TreeMap<String, String>();
-
-        public SortedMap<String, String> getSoma() {
-            return soma;
-        }
-
-        public void setSoma(SortedMap<String, String> soma) {
-            this.soma = soma;
-        }        
-    }
-    
-    public static class CharClass {
-        private char charValue;
-        private char charArr[];
-        
-        public char[] getCharArr() {
-            return charArr;
-        }
-
-        public void setCharArr(char[] charArr) {
-            this.charArr = charArr;
-        }
-
-        public char getCharValue() {
-            return charValue;
-        }
-
-        public void setCharValue(char charValue) {
-            this.charValue = charValue;
-        }           
-    }
-    
-    public static class TestClass {
-        private List<Map<String, Date>> dates = new ArrayList<Map<String, Date>>();
-        private Map<List<Map<String, Integer>>, Long> map = new HashMap<List<Map<String, Integer>>, Long>();
-        private TestClass inner;
-        private String string = "some \t \u0001 unicode: ÖÄÜ \u0070\u0070\u0070ন\udbff\udfff";
-        private BigDecimal bd = new BigDecimal("-456.4567890987654321");
-        private SortedSet<String> sose = new TreeSet<String>();
-
-        public SortedSet<String> getSose() {
-            return sose;
-        }
-
-        public void setSose(SortedSet<String> sose) {
-            this.sose = sose;
-        }
-
-        public TestClass(final TestClass inner) {
-            super();
-            this.inner = inner;
-        }
-
-        public TestClass() {
-            super();
-        }
-
-        public List<Map<String, Date>> getDates() {
-            return dates;
-        }
-
-        public void setDates(final List<Map<String, Date>> dates) {
-            this.dates = dates;
-        }
-
-        public Map<List<Map<String, Integer>>, Long> getMap() {
-            return map;
-        }
-
-        public void setMap(final Map<List<Map<String, Integer>>, Long> map) {
-            this.map = map;
-        }
-
-        public TestClass getInner() {
-            return inner;
-        }
-
-        public void setInner(final TestClass inner) {
-            this.inner = inner;
-        }
-
-        public String getString() {
-            return string;
-        }
-
-        public void setString(final String string) {
-            this.string = string;
-        }
-
-        public BigDecimal getBd() {
-            return bd;
-        }
-
-        public void setBd(final BigDecimal bd) {
-            this.bd = bd;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
deleted file mode 100644
index 6779f0b..0000000
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import junit.framework.AssertionFailedError;
-
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.StringWriter;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-public class MapperTest {
-    private static final String BIG_OBJECT_STR = "{" +
-            "\"name\":\"the string\"," +
-            "\"integer\":56," +
-            "\"longnumber\":118," +
-            "\"bool\":true," +
-            "\"nested\":{" +
-            "\"name\":\"another value\"," +
-            "\"integer\":97," +
-            "\"longnumber\":34" +
-            "}," +
-            "\"array\":[" +
-            "{" +
-            "\"name\":\"a1\"," +
-            "\"integer\":1," +
-            "\"longnumber\":2" +
-            "}," +
-            "{" +
-            "\"name\":\"a2\"," +
-            "\"integer\":3," +
-            "\"longnumber\":4" +
-            "}" +
-            "]," +
-            "\"list\":[" +
-            "{" +
-            "\"name\":\"a3\"," +
-            "\"integer\":5," +
-            "\"longnumber\":6" +
-            "}," +
-            "{" +
-            "\"name\":\"a4\"," +
-            "\"integer\":7," +
-            "\"longnumber\":8" +
-            "}" +
-            "]," +
-            "\"primitives\":[1,2,3,4,5]," +
-            "\"collectionWrapper\":[1,2,3,4,5]," +
-            "\"map\":{\"uno\":true,\"duos\":false}" +
-            "}";
-
-    @Test
-    public void writeEmptyObject() {
-        final StringWriter writer = new StringWriter();
-        new MapperBuilder().build().writeObject(null, writer);
-        assertEquals("{}", writer.toString());
-    }
-
-    @Test
-    public void readEmptyObject() {
-        final TheObject object = new MapperBuilder().build().readObject(new ByteArrayInputStream("{}".getBytes()), TheObject.class);
-        assertNotNull(object);
-        assertNull(object.name);
-    }
-
-    @Test
-    public void readEmptyArray() {
-        final TheObject[] object = new MapperBuilder().build().readArray(new ByteArrayInputStream("[]".getBytes()), TheObject.class);
-        assertNotNull(object);
-        assertEquals(0, object.length);
-    }
-
-    @Test
-    public void writeMap() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        new MapperBuilder().build().writeObject(new LinkedHashMap<String, Integer>() {{
-            put("a", 1);
-            put("b", 2);
-        }}, baos);
-        assertEquals("{\"a\":1,\"b\":2}", new String(baos.toByteArray()));
-    }
-
-    @Test
-    public void writeObject() {
-        final TheObject instance = new MapperBuilder().build()
-                .readObject(new ByteArrayInputStream(BIG_OBJECT_STR.getBytes()), TheObject.class); // suppose reader writes but this is tested
-        final StringWriter writer = new StringWriter();
-        new MapperBuilder().build().writeObject(instance, writer);
-        final String serialized = writer.toString();
-        assertTrue(serialized.contains("\"primitives\":[1,2,3,4,5]"));
-        assertTrue(serialized.contains("\"collectionWrapper\":[1,2,3,4,5]"));
-        assertTrue(serialized.contains("\"bool\":true"));
-        
-        //Assert fail with oracle java 1.7.0_45, works well with apple java 1.6.0_65 
-        //assertTrue(serialized.contains("\"map\":{\"uno\":true,\"duos\":false}"));
-        assertTrue(serialized.contains("\"map\":{"));
-        assertTrue(serialized.contains("\"uno\":true"));
-        assertTrue(serialized.contains("\"duos\":false"));
-        
-        TheObject instance2 = new MapperBuilder().build()
-                .readObject(new ByteArrayInputStream(serialized.getBytes()), TheObject.class); // suppose reader writes but this is tested
-      
-        assertEquals(instance, instance2);
-    }
-    
-    static class Bool{
-        boolean bool;
-
-        public boolean isBool() {
-            return bool;
-        }
-
-        public void setBool(boolean bool) {
-            this.bool = bool;
-        }
-        
-        
-    }
-    
-    static class Bool2{
-        Map<String, Boolean> map;
-
-        public Map<String, Boolean> getMap() {
-            return map;
-        }
-
-        public void setMap(Map<String, Boolean> map) {
-            this.map = map;
-        }
-
-        
-        
-        
-    }
-    
-    @Test
-    public void literal() {
-        
-        
-        
-        final Bool instance = new MapperBuilder().build()
-                .readObject(new ByteArrayInputStream("{\"bool\":true}".getBytes()), Bool.class);
-        
-        assertTrue(instance.bool);
-        
-        final StringWriter writer = new StringWriter();
-        new MapperBuilder().build().writeObject(instance, writer);
-        final String serialized = writer.toString();
-        assertEquals("{\"bool\":true}", serialized);
-        
-    }
-    
-    @Test(expected= MapperException.class)
-    public void literalFail() {
-         
-        final Bool instance = new MapperBuilder().build()
-                .readObject(new ByteArrayInputStream("{\"bool\":\"true\"}".getBytes()), Bool.class);
-        
-        assertTrue(instance.bool);
-        
-    }
-    
-    @Test(expected= MapperException.class)
-    public void literalFail2() {
-         
-        final Bool2 instance = new MapperBuilder().build()
-                .readObject(new ByteArrayInputStream("{\"map\":{\"key\":\"true\"}}".getBytes()), Bool2.class);
-       
-        
-        
-    }
-
-    @Test
-    public void writeArray() {
-        { // integer
-            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            new MapperBuilder().build().writeArray(new Integer[]{1, 2}, baos);
-            assertEquals("[1,2]", new String(baos.toByteArray()));
-        }
-        { // object
-            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()));
-            } 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()));
-            }
-        }
-    }
-
-    @Test
-    public void readObject() {
-        final TheObject object = new MapperBuilder().build().readObject(new ByteArrayInputStream(BIG_OBJECT_STR.getBytes()), TheObject.class);
-
-        assertNotNull(object);
-        assertEquals("the string", object.name);
-        assertEquals(56, object.integer);
-        assertEquals(118, object.longnumber);
-        assertTrue(object.bool);
-        assertEquals("another value", object.nested.name);
-        assertEquals(97, object.nested.integer);
-        assertEquals(34, object.nested.longnumber);
-        assertFalse(object.nested.bool);
-        assertNotNull(object.array);
-        assertEquals(2, object.array.length);
-        assertEquals("a1", object.array[0].name);
-        assertEquals(1, object.array[0].integer);
-        assertEquals(2, object.array[0].longnumber);
-        assertEquals("a2", object.array[1].name);
-        assertEquals(3, object.array[1].integer);
-        assertEquals(4, object.array[1].longnumber);
-        assertEquals("a3", object.list.get(0).name);
-        assertEquals(5, object.list.get(0).integer);
-        assertEquals(6, object.list.get(0).longnumber);
-        assertEquals("a4", object.list.get(1).name);
-        assertEquals(7, object.list.get(1).integer);
-        assertEquals(8, object.list.get(1).longnumber);
-        assertEquals(5, object.primitives.length);
-        for (int i = 0; i < object.primitives.length; i++) {
-            assertEquals(i + 1, object.primitives[i]);
-        }
-        assertNotNull(object.collectionWrapper);
-        assertEquals(5, object.collectionWrapper.size());
-        for (int i = 0; i < object.collectionWrapper.size(); i++) {
-            assertEquals(i + 1, object.collectionWrapper.get(i).intValue());
-        }
-        assertNotNull(object.map);
-        assertEquals(2, object.map.size());
-        assertTrue(object.map.containsKey("uno"));
-        assertTrue(object.map.containsKey("duos"));
-        assertTrue(object.map.get("uno"));
-        assertFalse(object.map.get("duos"));
-    }
-
-    @Test
-    public void readArray() {
-        final TheObject[] object = new MapperBuilder().build().readArray(new ByteArrayInputStream(("[" +
-                "{" +
-                "\"name\":\"a3\"," +
-                "\"integer\":5," +
-                "\"longnumber\":6" +
-                "}," +
-                "{" +
-                "\"name\":\"a4\"," +
-                "\"integer\":7," +
-                "\"longnumber\":8" +
-                "}" +
-                "]").getBytes()), TheObject.class);
-        assertNotNull(object);
-        assertEquals(2, object.length);
-        assertEquals("a3", object[0].name);
-        assertEquals(5, object[0].integer);
-        assertEquals(6, object[0].longnumber);
-        assertEquals("a4", object[1].name);
-        assertEquals(7, object[1].integer);
-        assertEquals(8, object[1].longnumber);
-    }
-
-    @Test
-    public void converters() {
-        final String json = "{\"s\":\"eceelf\"}";
-        final Converted v = new MapperBuilder().build().readObject(new ByteArrayInputStream(json.getBytes()), Converted.class);
-        assertEquals("fleece", v.getS());
-        final StringWriter stream = new StringWriter();
-        new MapperBuilder().build().writeObject(v, stream);
-        assertEquals(json, stream.toString());
-    }
-
-    public static class TheObject {
-        private String name;
-        private int integer;
-        private long longnumber;
-        private boolean bool;
-        private TheObject nested;
-        private TheObject[] array;
-        private List<TheObject> list;
-        private int[] primitives;
-        private List<Integer> collectionWrapper;
-        private Map<String, Boolean> map;
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(final String name) {
-            this.name = name;
-        }
-
-        public int getInteger() {
-            return integer;
-        }
-
-        public void setInteger(final int integer) {
-            this.integer = integer;
-        }
-
-        public long getLongnumber() {
-            return longnumber;
-        }
-
-        public void setLongnumber(final long longnumber) {
-            this.longnumber = longnumber;
-        }
-
-        public boolean isBool() {
-            return bool;
-        }
-
-        public void setBool(final boolean bool) {
-            this.bool = bool;
-        }
-
-        public TheObject getNested() {
-            return nested;
-        }
-
-        public void setNested(final TheObject nested) {
-            this.nested = nested;
-        }
-
-        public TheObject[] getArray() {
-            return array;
-        }
-
-        public void setArray(final TheObject[] array) {
-            this.array = array;
-        }
-
-        public List<TheObject> getList() {
-            return list;
-        }
-
-        public void setList(final List<TheObject> list) {
-            this.list = list;
-        }
-
-        public int[] getPrimitives() {
-            return primitives;
-        }
-
-        public void setPrimitives(final int[] primitives) {
-            this.primitives = primitives;
-        }
-
-        public List<Integer> getCollectionWrapper() {
-            return collectionWrapper;
-        }
-
-        public void setCollectionWrapper(final List<Integer> collectionWrapper) {
-            this.collectionWrapper = collectionWrapper;
-        }
-
-        public Map<String, Boolean> getMap() {
-            return map;
-        }
-
-        public void setMap(final Map<String, Boolean> map) {
-            this.map = map;
-        }
-
-        @Override
-        public String toString() {
-            return "TheObject [name=" + name + ", integer=" + integer + ", longnumber=" + longnumber + ", bool=" + bool + ", nested="
-                    + nested + ", array=" + Arrays.toString(array) + ", list=" + list + ", primitives=" + Arrays.toString(primitives)
-                    + ", collectionWrapper=" + collectionWrapper + ", map=" + map + "]";
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + Arrays.hashCode(array);
-            result = prime * result + (bool ? 1231 : 1237);
-            result = prime * result + ((collectionWrapper == null) ? 0 : collectionWrapper.hashCode());
-            result = prime * result + integer;
-            result = prime * result + ((list == null) ? 0 : list.hashCode());
-            result = prime * result + (int) (longnumber ^ (longnumber >>> 32));
-            result = prime * result + ((map == null) ? 0 : map.hashCode());
-            result = prime * result + ((name == null) ? 0 : name.hashCode());
-            result = prime * result + ((nested == null) ? 0 : nested.hashCode());
-            result = prime * result + Arrays.hashCode(primitives);
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj)
-                return true;
-            if (obj == null)
-                return false;
-            if (getClass() != obj.getClass())
-                return false;
-            TheObject other = (TheObject) obj;
-            if (!Arrays.equals(array, other.array))
-                return false;
-            if (bool != other.bool)
-                return false;
-            if (collectionWrapper == null) {
-                if (other.collectionWrapper != null)
-                    return false;
-            } else if (!collectionWrapper.equals(other.collectionWrapper))
-                return false;
-            if (integer != other.integer)
-                return false;
-            if (list == null) {
-                if (other.list != null)
-                    return false;
-            } else if (!list.equals(other.list))
-                return false;
-            if (longnumber != other.longnumber)
-                return false;
-            if (map == null) {
-                if (other.map != null)
-                    return false;
-            } else if (!map.equals(other.map))
-                return false;
-            if (name == null) {
-                if (other.name != null)
-                    return false;
-            } else if (!name.equals(other.name))
-                return false;
-            if (nested == null) {
-                if (other.nested != null)
-                    return false;
-            } else if (!nested.equals(other.nested))
-                return false;
-            if (!Arrays.equals(primitives, other.primitives))
-                return false;
-            return true;
-        }
-        
-        
-    }
-
-    public static class Pair {
-        private final int i;
-        private final String s;
-
-        public Pair(final int i, final String s) {
-            this.i = i;
-            this.s = s;
-        }
-
-        public int getI() {
-            return i;
-        }
-
-        public String getS() {
-            return s;
-        }
-    }
-
-    public static class Converted {
-        private String s;
-
-        @FleeceConverter(ReverseConverter.class)
-        public String getS() {
-            return s;
-        }
-
-        @FleeceConverter(ReverseConverter.class)
-        public void setS(String v) {
-            s = v;
-        }
-    }
-
-    public static class ReverseConverter implements Converter<String> {
-        @Override
-        public String toString(final String instance) {
-            return new StringBuilder(instance).reverse().toString();
-        }
-
-        @Override
-        public String fromString(final String text) {
-            return toString(text);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperVersionTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperVersionTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperVersionTest.java
deleted file mode 100644
index 05e3ebb..0000000
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperVersionTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import org.junit.Test;
-
-import java.io.StringWriter;
-
-import static org.junit.Assert.assertEquals;
-
-public class MapperVersionTest {
-    @Test
-    public void version() {
-        { // no version
-            final Mapper mapper = new MapperBuilder().build();
-            final Versioned versioned = new Versioned();
-            versioned.name = "foo";
-            final StringWriter writer = new StringWriter();
-            mapper.writeObject(versioned, writer);
-            assertEquals("{\"name\":\"foo\"}", writer.toString());
-        }
-        { // version ko
-            for (int i = 0; i < 2; i++) {
-                final Mapper mapper = new MapperBuilder().setVersion(i).build();
-                final Versioned versioned = new Versioned();
-                versioned.name = "foo";
-                final StringWriter writer = new StringWriter();
-                mapper.writeObject(versioned, writer);
-                assertEquals("{\"name\":\"foo\"}", writer.toString());
-            }
-        }
-        { // version ok
-            for (int i = 2; i < 4; i++) {
-                final Mapper mapper = new MapperBuilder().setVersion(i).build();
-                final Versioned versioned = new Versioned();
-                versioned.name = "foo";
-                final StringWriter writer = new StringWriter();
-                mapper.writeObject(versioned, writer);
-                assertEquals("{}", writer.toString());
-            }
-        }
-    }
-
-    public static class Versioned {
-        private String name;
-
-        @FleeceIgnore(minVersion =  2)
-        public String getName() {
-            return name;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/test/java/org/apache/fleece/mapper/converter/EnumConverterTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/converter/EnumConverterTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/converter/EnumConverterTest.java
deleted file mode 100644
index 501599c..0000000
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/converter/EnumConverterTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class EnumConverterTest {
-    @Test
-    public void fromEnumToString() {
-        assertEquals("B", new EnumConverter<AnEnum>(AnEnum.class).toString(AnEnum.B));
-    }
-
-    @Test
-    public void fromStringToEnum() {
-        assertEquals(AnEnum.B, new EnumConverter<AnEnum>(AnEnum.class).fromString("B"));
-    }
-
-    public enum AnEnum {
-        A, B
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-core/pom.xml b/johnzon-core/pom.xml
new file mode 100644
index 0000000..06fb184
--- /dev/null
+++ b/johnzon-core/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>johnzon</artifactId>
+    <groupId>org.apache.johnzon</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>johnzon-core</artifactId>
+  <name>Johnzon :: Core</name>
+
+  <properties>
+    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
+  </properties>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/BufferStrategy.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/BufferStrategy.java b/johnzon-core/src/main/java/org/apache/johnzon/core/BufferStrategy.java
new file mode 100644
index 0000000..c37ecfb
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/BufferStrategy.java
@@ -0,0 +1,272 @@
+/*
+ * 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 java.io.Serializable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public enum BufferStrategy {
+    BY_INSTANCE {
+        @Override
+        public BufferProvider<char[]> newCharProvider(final int size) {
+            return new CharBufferByInstanceProvider(size);
+        }
+
+        @Override
+        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
+            return new StringBuilderByInstanceProvider(size);
+        }
+    },
+    THREAD_LOCAL {
+        @Override
+        public BufferProvider<char[]> newCharProvider(final int size) {
+            return new CharBufferThreadLocalProvider(size);
+        }
+
+        @Override
+        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
+            return new StringBuilderThreadLocalProvider(size);
+        }
+    },
+    QUEUE {
+        @Override
+        public BufferProvider<char[]> newCharProvider(final int size) {
+            return new CharBufferQueueProvider(size);
+        }
+
+        @Override
+        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
+            return new StringBuilderQueueProvider(size);
+        }
+    },
+    SINGLETON {
+        @Override
+        public BufferProvider<char[]> newCharProvider(final int size) {
+            return new CharBufferSingletonProvider(size);
+        }
+
+        @Override
+        public BufferProvider<StringBuilder> newStringBuilderProvider(final int size) {
+            return new StringBuilderSingletonProvider(size);
+        }
+    };
+
+    public abstract BufferProvider<char[]> newCharProvider(int size);
+    public abstract BufferProvider<StringBuilder> newStringBuilderProvider(int size);
+
+    public static interface BufferProvider<T> extends Serializable {
+        T newBuffer();
+
+        void release(T value);
+    }
+
+    private static class CharBufferSingletonProvider extends SingletonProvider<char[]> {
+        public CharBufferSingletonProvider(final int size) {
+            super(size);
+        }
+
+        @Override
+        protected char[] newInstance(int size) {
+            return new char[size];
+        }
+
+        @Override
+        public void release(final char[] value) {
+            // no-op
+        }
+    }
+
+    private static class StringBuilderSingletonProvider extends SingletonProvider<StringBuilder> {
+        public StringBuilderSingletonProvider(final int size) {
+            super(size);
+        }
+
+        @Override
+        protected StringBuilder newInstance(final int size) {
+            return new StringBuilder(size);
+        }
+
+        @Override
+        public void release(final StringBuilder value) {
+            value.setLength(0);
+        }
+    }
+
+    private static abstract class SingletonProvider<T> implements BufferProvider<T> {
+        protected final T buffer;
+
+        public SingletonProvider(final int size) {
+            buffer = newInstance(size);
+        }
+
+        protected abstract T newInstance(int size);
+
+        @Override
+        public T newBuffer() {
+            return buffer;
+        }
+
+        @Override
+        public void release(final T value) {
+            // no-op
+        }
+    }
+
+    private static abstract class ThreadLocalProvider<T> implements BufferProvider<T> {
+        private final ThreadLocalBufferCache<T> cache;
+
+        public ThreadLocalProvider(final int size) {
+            cache = new ThreadLocalBufferCache<T>(size) {
+                @Override
+                protected T newValue(int defaultSize) {
+                    return newInstance(size);
+                }
+            };
+        }
+
+        protected abstract T newInstance(int size);
+
+        @Override
+        public T newBuffer() {
+            return cache.getCache();
+        }
+
+        @Override
+        public void release(final T value) {
+            cache.release(value);
+        }
+    }
+
+    private static class CharBufferThreadLocalProvider extends ThreadLocalProvider<char[]> {
+        public CharBufferThreadLocalProvider(int size) {
+            super(size);
+        }
+
+        @Override
+        protected char[] newInstance(final int size) {
+            return new char[size];
+        }
+    }
+
+    private static class StringBuilderThreadLocalProvider extends ThreadLocalProvider<StringBuilder> {
+        public StringBuilderThreadLocalProvider(int size) {
+            super(size);
+        }
+
+        @Override
+        protected StringBuilder newInstance(final int size) {
+            return new StringBuilder(size);
+        }
+
+        @Override
+        public void release(final StringBuilder value) {
+            value.setLength(0);
+            super.release(value);
+        }
+    }
+
+    private static class CharBufferByInstanceProvider implements BufferProvider<char[]> {
+        private final int size;
+
+        public CharBufferByInstanceProvider(final int size) {
+            this.size = size;
+        }
+
+        @Override
+        public char[] newBuffer() {
+            return new char[size];
+        }
+
+        @Override
+        public void release(final char[] value) {
+            // no-op
+        }
+    }
+
+    private static class StringBuilderByInstanceProvider implements BufferProvider<StringBuilder> {
+        private final int size;
+
+        public StringBuilderByInstanceProvider(final int size) {
+            this.size = size;
+        }
+
+        @Override
+        public StringBuilder newBuffer() {
+            return new StringBuilder(size);
+        }
+
+        @Override
+        public void release(final StringBuilder value) {
+            // no-op
+        }
+    }
+
+    private static abstract class QueueProvider<T> implements BufferProvider<T> {
+        private final int size;
+        private final ConcurrentLinkedQueue<T> queue = new ConcurrentLinkedQueue<T>();
+
+        public QueueProvider(final int size) {
+            this.size = size;
+        }
+
+        protected abstract T newInstance(int size);
+
+        @Override
+        public T newBuffer() {
+            final T buffer = queue.poll();
+            if (buffer == null) {
+                return newInstance(size);
+            }
+            return buffer;
+        }
+
+        @Override
+        public void release(final T value) {
+            queue.offer(value);
+        }
+    }
+
+    private static class CharBufferQueueProvider extends QueueProvider<char[]> {
+        public CharBufferQueueProvider(final int size) {
+            super(size);
+        }
+
+        @Override
+        protected char[] newInstance(int size) {
+            return new char[size];
+        }
+    }
+
+    private static class StringBuilderQueueProvider extends QueueProvider<StringBuilder> {
+        public StringBuilderQueueProvider(final int size) {
+            super(size);
+        }
+
+        @Override
+        protected StringBuilder newInstance(int size) {
+            return new StringBuilder(size);
+        }
+
+        @Override
+        public void release(final StringBuilder value) {
+            value.setLength(0);
+            super.release(value);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..5dfd839
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayBuilderImpl.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 java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+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;
+
+    @Override
+    public JsonArrayBuilder add(final JsonValue value) {
+        addValue(value);
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final String value) {
+        addValue(new JsonStringImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final BigDecimal value) {
+        addValue(new JsonNumberImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final BigInteger value) {
+        addValue(new JsonNumberImpl(new BigDecimal(value)));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final int value) {
+        addValue(new JsonLongImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final long value) {
+        addValue(new JsonLongImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final double value) {
+        addValue(new JsonDoubleImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final boolean value) {
+        addValue(value ? JsonValue.TRUE : JsonValue.FALSE);
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder addNull() {
+        addValue(JsonValue.NULL);
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final JsonObjectBuilder builder) {
+        addValue(builder.build());
+        return this;
+    }
+
+    @Override
+    public JsonArrayBuilder add(final JsonArrayBuilder builder) {
+        addValue(builder.build());
+        return this;
+    }
+    
+    private void addValue(JsonValue value){
+        if (value == null) {
+            throw npe();
+        }
+        
+        if(tmpList==null){
+            tmpList=new ArrayList<JsonValue>();
+        }
+        
+        tmpList.add(value);
+    }
+
+    @Override
+    public JsonArray build() {
+        
+        if(tmpList == null) {
+            return new JsonArrayImpl(Collections.EMPTY_LIST);
+        } else {
+            List<JsonValue> dump = (Collections.unmodifiableList(tmpList));
+            tmpList=null;
+            return new JsonArrayImpl(dump);
+        }
+        
+    }
+
+    private static NullPointerException npe() {
+        throw new NullPointerException("value/builder must not be null");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..809d709
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java
@@ -0,0 +1,174 @@
+/*
+ * 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 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;
+
+class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serializable {
+    private Integer hashCode = null;
+    private final List<JsonValue> unmodifieableBackingList;
+
+    JsonArrayImpl(List<JsonValue> backingList) {
+        super();
+        this.unmodifieableBackingList = backingList;
+    }
+
+
+
+    private <T> T value(final int idx, final Class<T> type) {
+        if (idx > unmodifieableBackingList.size()) {
+            throw new IndexOutOfBoundsException(idx + "/" + unmodifieableBackingList.size());
+        }
+        return type.cast(unmodifieableBackingList.get(idx));
+    }
+    
+    
+
+    @Override
+    public JsonObject getJsonObject(final int index) {
+        return value(index, JsonObject.class);
+    }
+
+    @Override
+    public JsonArray getJsonArray(final int index) {
+        return value(index, JsonArray.class);
+    }
+
+    @Override
+    public JsonNumber getJsonNumber(final int index) {
+        return value(index, JsonNumber.class);
+    }
+
+    @Override
+    public JsonString getJsonString(final int index) {
+        return value(index, JsonString.class);
+    }
+
+    @Override
+    public <T extends JsonValue> List<T> getValuesAs(final Class<T> clazz) {
+        return (List<T>) unmodifieableBackingList;
+    }
+
+    @Override
+    public String getString(final int index) {
+        return value(index, JsonString.class).getString();
+    }
+
+    @Override
+    public String getString(final int index, final String defaultValue) {
+        try {
+            return getString(index);
+        } catch (final IndexOutOfBoundsException ioobe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public int getInt(final int index) {
+        return value(index, JsonNumber.class).intValue();
+    }
+
+    @Override
+    public int getInt(final int index, final int defaultValue) {
+        try {
+            return getInt(index);
+        } catch (final IndexOutOfBoundsException ioobe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public boolean getBoolean(final int index) {
+        return value(index, JsonValue.class) == JsonValue.TRUE;
+    }
+
+    @Override
+    public boolean getBoolean(final int index, final boolean defaultValue) {
+        try {
+            return getBoolean(index);
+        } catch (final IndexOutOfBoundsException ioobe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public boolean isNull(final int index) {
+        return value(index, JsonValue.class) == JsonValue.NULL;
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.ARRAY;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder builder = new StringBuilder("[");
+        final Iterator<JsonValue> it = unmodifieableBackingList.iterator();
+        boolean hasNext = it.hasNext();
+        while (hasNext) {
+            final JsonValue jsonValue = it.next();
+            if (JsonString.class.isInstance(jsonValue)) {
+                builder.append(jsonValue.toString());
+            } else {
+                builder.append(jsonValue != JsonValue.NULL ? jsonValue.toString() : JsonChars.NULL);
+            }
+            hasNext = it.hasNext();
+            if (hasNext) {
+                builder.append(",");
+            }
+        }
+        return builder.append(']').toString();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonArrayImpl.class.isInstance(obj) && unmodifieableBackingList.equals(JsonArrayImpl.class.cast(obj).unmodifieableBackingList);
+    }
+
+    
+    @Override
+    public int hashCode() {
+        Integer h=hashCode;
+        if (h == null) {
+            h = unmodifieableBackingList.hashCode();
+            h=hashCode;
+        }
+        return h;
+    }
+
+    @Override
+    public JsonValue get(int index) {
+        return unmodifieableBackingList.get(index);
+    }
+
+    @Override
+    public int size() {
+        return unmodifieableBackingList.size();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
new file mode 100644
index 0000000..e84a37d
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonBuilderFactoryImpl.java
@@ -0,0 +1,61 @@
+/*
+ * 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 java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonBuilderFactory;
+import javax.json.JsonObjectBuilder;
+
+class JsonBuilderFactoryImpl implements JsonBuilderFactory {
+    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
+    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
+    //nothing yet
+
+    };
+
+    JsonBuilderFactoryImpl(final Map<String, ?> config) {
+        if (config != null) {
+
+            for (final String configKey : SUPPORTED_CONFIG_KEYS) {
+                if (config.containsKey(configKey)) {
+                    internalConfig.put(configKey, config.get(configKey));
+                }
+            }
+        }
+    }
+
+    @Override
+    public JsonObjectBuilder createObjectBuilder() {
+        return new JsonObjectBuilderImpl();
+    }
+
+    @Override
+    public JsonArrayBuilder createArrayBuilder() {
+        return new JsonArrayBuilderImpl();
+    }
+
+    @Override
+    public Map<String, ?> getConfigInUse() {
+        return Collections.unmodifiableMap(internalConfig);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonChars.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonChars.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonChars.java
new file mode 100644
index 0000000..1e36913
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonChars.java
@@ -0,0 +1,82 @@
+/*
+ * 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.stream.JsonParser.Event;
+
+public interface JsonChars {
+    char EOF = Character.MIN_VALUE;
+
+    char START_OBJECT_CHAR = '{';
+    char END_OBJECT_CHAR = '}';
+    char START_ARRAY_CHAR = '[';
+    char END_ARRAY_CHAR = ']';
+    char QUOTE_CHAR = '"';
+    char COMMA_CHAR = ',';
+    char KEY_SEPARATOR = ':';
+    
+    char EOL = '\n';
+    char SPACE = ' ';
+    
+    char TRUE_T = 't';
+    char TRUE_R = 'r';
+    char TRUE_U = 'u';
+    char TRUE_E = 'e';
+    char FALSE_F = 'f';
+    char FALSE_A = 'a';
+    char FALSE_L = 'l';
+    char FALSE_S = 's';
+    char FALSE_E = 'e';
+    char NULL_N = 'n';
+    char NULL_U = 'u';
+    char NULL_L = 'l';
+ 
+    char ZERO = '0';
+    char NINE = '9';
+    char DOT = '.';
+    char MINUS = '-';
+    char PLUS = '+';
+    char EXP_LOWERCASE = 'e';
+    char EXP_UPPERCASE = 'E';
+    char ESCAPE_CHAR = '\\';
+    
+    char TAB = '\t';
+    char BACKSPACE = '\b';
+    char FORMFEED = '\f';
+    char CR = '\r';
+
+    String NULL = "null".intern();
+    
+    static final byte START_ARRAY = (byte) Event.START_ARRAY.ordinal();
+    static final byte START_OBJECT = (byte) Event.START_OBJECT.ordinal();
+    static final byte KEY_NAME=(byte) Event.KEY_NAME.ordinal();
+    static final byte VALUE_STRING=(byte) Event.VALUE_STRING.ordinal(); 
+    static final byte VALUE_NUMBER=(byte) Event.VALUE_NUMBER.ordinal(); 
+    static final byte VALUE_TRUE=(byte) Event.VALUE_TRUE.ordinal();
+    static final byte VALUE_FALSE=(byte) Event.VALUE_FALSE.ordinal(); 
+    static final byte VALUE_NULL=(byte) Event.VALUE_NULL.ordinal();
+    static final byte END_OBJECT=(byte) Event.END_OBJECT.ordinal();
+    static final byte END_ARRAY=(byte) Event.END_ARRAY.ordinal();
+    
+    static final byte COMMA_EVENT=Byte.MAX_VALUE;
+    static final byte KEY_SEPARATOR_EVENT=Byte.MIN_VALUE;
+    
+    static final Event[] EVT_MAP =Event.values();
+    
+}


[19/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonInMemoryParser.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonInMemoryParser.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonInMemoryParser.java
deleted file mode 100644
index 038f3ae..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonInMemoryParser.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.math.BigDecimal;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.json.JsonArray;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonString;
-import javax.json.JsonValue;
-import javax.json.stream.JsonLocation;
-import javax.json.stream.JsonParser;
-
-// we don't use visitor pattern to ensure we work with other impl of JsonObject and JsonArray
-class JsonInMemoryParser implements JsonParser {
-    private final Iterator<Entry> iterator;
-
-    private Entry next = null;
-
-    JsonInMemoryParser(final JsonObject object) {
-        final List<Entry> events = new LinkedList<Entry>();
-        generateObjectEvents(events, object);
-        iterator = events.iterator();
-    }
-
-    JsonInMemoryParser(final JsonArray array) {
-        final List<Entry> events = new LinkedList<Entry>();
-        generateArrayEvents(events, array);
-        iterator = events.iterator();
-    }
-
-    private static void generateObjectEvents(final List<Entry> events, final JsonObject object) {
-        events.add(Entry.START_OBJECT_ENTRY);
-        for (final Map.Entry<String, JsonValue> entry : object.entrySet()) {
-            events.add(new Entry(Event.KEY_NAME, new JsonStringImpl(entry.getKey())));
-            final JsonValue value = entry.getValue();
-            addValueEvents(events, value);
-        }
-        events.add(Entry.END_OBJECT_ENTRY);
-    }
-
-    private static void generateArrayEvents(final List<Entry> events, final JsonArray array) {
-        events.add(Entry.START_ARRAY_ENTRY);
-        for (final JsonValue value : array) {
-            addValueEvents(events, value);
-        }
-        events.add(Entry.END_ARRAY_ENTRY);
-    }
-
-    private static void addValueEvents(final List<Entry> events, final JsonValue value) {
-        
-        switch(value.getValueType()) {
-            case ARRAY:
-                generateArrayEvents(events, JsonArray.class.cast(value));
-                break;
-            case OBJECT:
-                generateObjectEvents(events, JsonObject.class.cast(value));
-                break;
-            case NUMBER:
-                events.add(new Entry(Event.VALUE_NUMBER, value));
-                break;
-            case STRING:
-                events.add(new Entry(Event.VALUE_STRING, value));
-                break;
-            case FALSE:
-                events.add(Entry.VALUE_FALSE_ENTRY);
-                break;
-            case NULL:
-                events.add(Entry.VALUE_NULL_ENTRY);
-                break;
-            case TRUE:
-                events.add(Entry.VALUE_TRUE_ENTRY);
-                break;
-            default: throw new IllegalArgumentException(value + " not supported");
-                
-        }
-        
-    }
-
-    @Override
-    public boolean hasNext() {
-        return iterator.hasNext();
-    }
-
-    @Override
-    public Event next() {
-        next = iterator.next();
-        return next.event;
-    }
-
-    @Override
-    public String getString() {
-        if (next.event != Event.KEY_NAME && next.event != Event.VALUE_STRING) {
-            throw new IllegalStateException("String is for numbers and strings");
-        }
-        return JsonString.class.cast(next.value).getString();
-    }
-
-    @Override
-    public boolean isIntegralNumber() {
-        if (next.event != Event.VALUE_NUMBER) {
-            throw new IllegalStateException("isIntegralNumber is for numbers");
-        }
-        return JsonNumber.class.cast(next.value).isIntegral();
-    }
-
-    @Override
-    public int getInt() {
-        if (next.event != Event.VALUE_NUMBER) {
-            throw new IllegalStateException("getInt is for numbers");
-        }
-        return JsonNumber.class.cast(next.value).intValue();
-    }
-
-    @Override
-    public long getLong() {
-        if (next.event != Event.VALUE_NUMBER) {
-            throw new IllegalStateException("getLong is for numbers");
-        }
-        return JsonNumber.class.cast(next.value).longValue();
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        if (next.event != Event.VALUE_NUMBER) {
-            throw new IllegalStateException("getBigDecimal is for numbers");
-        }
-        return JsonNumber.class.cast(next.value).bigDecimalValue();
-    }
-
-    @Override
-    public JsonLocation getLocation() { // no location for in memory parsers
-        return JsonLocationImpl.UNKNOW_LOCATION;
-    }
-
-    @Override
-    public void close() {
-        // no-op
-    }
-
-    private static class Entry {
-        
-        static final Entry VALUE_FALSE_ENTRY = new Entry(Event.VALUE_FALSE, null);
-        static final Entry VALUE_TRUE_ENTRY = new Entry(Event.VALUE_TRUE, null);
-        static final Entry VALUE_NULL_ENTRY = new Entry(Event.VALUE_NULL, null);
-        static final Entry START_OBJECT_ENTRY = new Entry(Event.START_OBJECT, null);
-        static final Entry END_OBJECT_ENTRY = new Entry(Event.END_OBJECT, null);
-        static final Entry START_ARRAY_ENTRY = new Entry(Event.START_ARRAY, null);
-        static final Entry END_ARRAY_ENTRY = new Entry(Event.END_ARRAY, null);
-        
-        final Event event;
-        final JsonValue value;
-
-        Entry(final Event event, final JsonValue value) {
-            this.event = event;
-            this.value = value;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonLocationImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonLocationImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonLocationImpl.java
deleted file mode 100644
index 5c36d58..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonLocationImpl.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-
-import javax.json.stream.JsonLocation;
-
-final class JsonLocationImpl implements JsonLocation, Serializable {
-    
-    public static final JsonLocation UNKNOW_LOCATION = new JsonLocationImpl(-1, -1, -1);
-    
-    private final long lineNumber;
-    private final long columnNumber;
-    private final long streamOffset;
-
-    JsonLocationImpl(final long lineNumber, final long columnNumber, final long streamOffset) {
-        this.lineNumber = lineNumber;
-        this.columnNumber = columnNumber;
-        this.streamOffset = streamOffset;
-    }
-
-    @Override
-    public long getLineNumber() {
-        return lineNumber;
-    }
-
-    @Override
-    public long getColumnNumber() {
-        return columnNumber;
-    }
-
-    @Override
-    public long getStreamOffset() {
-        return streamOffset;
-    }
-
-    @Override
-    public boolean equals(final Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        final JsonLocationImpl that = JsonLocationImpl.class.cast(o);
-        return columnNumber == that.columnNumber && lineNumber == that.lineNumber && streamOffset == that.streamOffset;
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (int) (lineNumber ^ (lineNumber >>> 32));
-        result = 31 * result + (int) (columnNumber ^ (columnNumber >>> 32));
-        result = 31 * result + (int) (streamOffset ^ (streamOffset >>> 32));
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "[lineNumber=" + lineNumber + ", columnNumber=" + columnNumber + ", streamOffset=" + streamOffset + "]";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonLongImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonLongImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonLongImpl.java
deleted file mode 100644
index 9928a42..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonLongImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.json.JsonNumber;
-
-final class JsonLongImpl implements JsonNumber {
-    private final long value;
-
-    JsonLongImpl(final long value) {
-        this.value = value;
-    }
-
-    @Override
-    public boolean isIntegral() {
-        return true;
-    }
-
-    @Override
-    public int intValue() {
-        return (int) value;
-    }
-
-    @Override
-    public int intValueExact() {
-        return intValue();
-    }
-
-    @Override
-    public long longValue() {
-        return value;
-    }
-
-    @Override
-    public long longValueExact() {
-        return value;
-    }
-
-    @Override
-    public BigInteger bigIntegerValue() {
-        return new BigInteger(toString());
-    }
-
-    @Override
-    public BigInteger bigIntegerValueExact() {
-        return bigIntegerValue();
-    }
-
-    @Override
-    public double doubleValue() {
-        return value;
-    }
-
-    @Override
-    public BigDecimal bigDecimalValue() {
-        return new BigDecimal(toString());
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.NUMBER;
-    }
-
-    @Override
-    public String toString() {
-        return Long.toString(value);
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) value;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).longValue() == value;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonNumberImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonNumberImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonNumberImpl.java
deleted file mode 100644
index f1b388a..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonNumberImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.json.JsonNumber;
-
-final class JsonNumberImpl implements JsonNumber {
-    private final BigDecimal value;
-    private Integer hashCode = null;
-
-    JsonNumberImpl(final BigDecimal decimal) {
-        if(decimal == null) {
-            throw new NullPointerException("decimal must not be null");
-        }
-        
-        this.value = decimal;
-    }
-
-    @Override
-    public boolean isIntegral() {
-        return value.scale() == 0;
-    }
-
-    @Override
-    public int intValue() {
-        return value.intValue();
-    }
-
-    @Override
-    public int intValueExact() {
-        return value.intValueExact();
-    }
-
-    @Override
-    public long longValue() {
-        return value.longValue();
-    }
-
-    @Override
-    public long longValueExact() {
-        return value.longValueExact();
-    }
-
-    @Override
-    public BigInteger bigIntegerValue() {
-        return value.toBigInteger();
-    }
-
-    @Override
-    public BigInteger bigIntegerValueExact() {
-        return value.toBigIntegerExact();
-    }
-
-    @Override
-    public double doubleValue() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public BigDecimal bigDecimalValue() {
-        return value;
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.NUMBER;
-    }
-
-    @Override
-    public String toString() {
-        return value.toString();
-    }
-
-    @Override
-    public int hashCode() {
-        Integer h=hashCode;
-        if (h == null) {
-            h = value.hashCode();
-            hashCode=h;
-        }
-        return h;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).bigDecimalValue().equals(value);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectBuilderImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectBuilderImpl.java
deleted file mode 100644
index a61c9a3..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectBuilderImpl.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-
-class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
-    private Map<String, JsonValue> tmpMap;
-
-    @Override
-    public JsonObjectBuilder add(final String name, final JsonValue value) {
-        putValue(name, value);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final String value) {
-        putValue(name, new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final BigInteger value) {
-        putValue(name, new JsonNumberImpl(new BigDecimal(value)));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final BigDecimal value) {
-        putValue(name, new JsonNumberImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final int value) {
-        putValue(name, new JsonLongImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final long value) {
-        putValue(name, new JsonLongImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final double value) {
-        putValue(name, new JsonDoubleImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final boolean value) {
-        putValue(name, value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder addNull(final String name) {
-        putValue(name, JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final JsonObjectBuilder builder) {
-        putValue(name, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(final String name, final JsonArrayBuilder builder) {
-        putValue(name, builder.build());
-        return this;
-    }
-    
-    private void putValue(String name, JsonValue value){
-        if(name == null || value == null) {
-            throw npe();
-        }
-        
-        if(tmpMap==null){
-            tmpMap=new LinkedHashMap<String, JsonValue>();
-        }
-        
-        tmpMap.put(name, value);
-    }
-    
-    private static NullPointerException npe() {
-        return new NullPointerException("name or value/builder must not be null");
-    }
-
-    @Override
-    public JsonObject build() {
-        
-        if(tmpMap==null) {
-            return new JsonObjectImpl(Collections.EMPTY_MAP);
-        } else {
-            Map<String, JsonValue> dump = (Collections.unmodifiableMap(tmpMap));
-            tmpMap=null;
-            return new JsonObjectImpl(dump);
-        }
-        
-        
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectImpl.java
deleted file mode 100644
index a71e42c..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonObjectImpl.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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.fleece.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;
-
-public final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject, Serializable {
-    private Integer hashCode = null;
-    private final Map<String, JsonValue> unmodifieableBackingMap;
-
-    private <T> T value(final String name, final Class<T> clazz) {
-        final Object v = unmodifieableBackingMap.get(name);
-        if (v != null) {
-            return clazz.cast(v);
-        }
-        throw new NullPointerException("no mapping for " + name);
-    }
-   
-    public JsonObjectImpl(Map<String, JsonValue> backingMap) {
-        super();
-        this.unmodifieableBackingMap = backingMap;
-    }
-
-
-    @Override
-    public JsonArray getJsonArray(final String name) {
-        return value(name, JsonArray.class);
-    }
-
-    @Override
-    public JsonObject getJsonObject(final String name) {
-        return value(name, JsonObject.class);
-    }
-
-    @Override
-    public JsonNumber getJsonNumber(final String name) {
-        return value(name, JsonNumber.class);
-    }
-
-    @Override
-    public JsonString getJsonString(final String name) {
-        return value(name, JsonString.class);
-    }
-
-    @Override
-    public String getString(final String name) {
-        final JsonString str = getJsonString(name);
-        return str != null ? str.getString() : null;
-    }
-
-    @Override
-    public String getString(final String name, final String defaultValue) {
-        try {
-            return getJsonString(name).getString();
-        } catch (final NullPointerException npe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public int getInt(final String name) {
-        return getJsonNumber(name).intValue();
-    }
-
-    @Override
-    public int getInt(final String name, final int defaultValue) {
-        try {
-            return getJsonNumber(name).intValue();
-        } catch (final NullPointerException npe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public boolean getBoolean(final String name) {
-        return value(name, JsonValue.class) == JsonValue.TRUE;
-    }
-
-    @Override
-    public boolean getBoolean(final String name, final boolean defaultValue) {
-        try {
-            return getBoolean(name);
-        } catch (final NullPointerException npe) {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public boolean isNull(final String name) {
-        return value(name, JsonValue.class) == JsonValue.NULL;
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.OBJECT;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder builder = new StringBuilder("{");
-        final Iterator<Map.Entry<String, JsonValue>> it = unmodifieableBackingMap.entrySet().iterator();
-        boolean hasNext = it.hasNext();
-        while (hasNext) {
-            final Map.Entry<String, JsonValue> entry = it.next();
-
-            builder.append('"').append(entry.getKey()).append("\":");
-
-            final JsonValue value = entry.getValue();
-            if (JsonString.class.isInstance(value)) {
-                builder.append(value.toString());
-            } else {
-                builder.append(value != JsonValue.NULL ? value.toString() : JsonChars.NULL);
-            }
-
-            hasNext = it.hasNext();
-            if (hasNext) {
-                builder.append(",");
-            }
-        }
-        return builder.append('}').toString();
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonObjectImpl.class.isInstance(obj) && unmodifieableBackingMap.equals(JsonObjectImpl.class.cast(obj).unmodifieableBackingMap);
-    }
-
-
-    @Override
-    public int hashCode() {
-        if (hashCode == null) {
-            hashCode = unmodifieableBackingMap.hashCode();
-        }
-        return hashCode;
-    }
-
-    @Override
-    public Set<java.util.Map.Entry<String, JsonValue>> entrySet() {
-        return unmodifieableBackingMap.entrySet();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonParserFactoryImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonParserFactoryImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonParserFactoryImpl.java
deleted file mode 100644
index f43ceee..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonParserFactoryImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.Serializable;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParserFactory;
-
-class JsonParserFactoryImpl implements JsonParserFactory, Serializable {
-    public static final String BUFFER_STRATEGY = "org.apache.fleece.buffer-strategy";
-    public static final String MAX_STRING_LENGTH = "org.apache.fleece.max-string-length";
-    public static final String BUFFER_LENGTH = "org.apache.fleece.default-char-buffer";
-    public static final int DEFAULT_MAX_SIZE = Integer.getInteger(MAX_STRING_LENGTH, 8192*32); //TODO check default string length/buffer size
-
-    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
-    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-        
-        BUFFER_STRATEGY, MAX_STRING_LENGTH, BUFFER_LENGTH
-        
-    };
-      
-    private final int maxSize;
-    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
-    private final BufferStrategy.BufferProvider<char[]> valueBufferProvider;
-
-    JsonParserFactoryImpl(final Map<String, ?> config) {
-        
-
-        if(config != null) {
-            
-            for (String configKey : SUPPORTED_CONFIG_KEYS) {
-                if(config.containsKey(configKey)) {
-                    internalConfig.put(configKey, config.get(configKey));
-                }
-            }
-        } 
-        
-
-        final int bufferSize = getInt(BUFFER_LENGTH);
-        if (bufferSize <= 0) {
-            throw new IllegalArgumentException("buffer length must be greater than zero");
-        }
-
-        this.maxSize = getInt(MAX_STRING_LENGTH);
-        this.bufferProvider = getBufferProvider().newCharProvider(bufferSize);
-        this.valueBufferProvider = getBufferProvider().newCharProvider(maxSize);
-    }
-
-    private BufferStrategy getBufferProvider() {
-        final Object name = internalConfig.get(BUFFER_STRATEGY);
-        if (name != null) {
-            return BufferStrategy.valueOf(name.toString().toUpperCase(Locale.ENGLISH));
-        }
-        return BufferStrategy.QUEUE;
-    }
-
-    private int getInt(final String key) {
-        final Object maxStringSize = internalConfig.get(key);
-        if (maxStringSize == null) {
-            return DEFAULT_MAX_SIZE;
-        } else if (Number.class.isInstance(maxStringSize)) {
-            return Number.class.cast(maxStringSize).intValue();
-        }
-        return Integer.parseInt(maxStringSize.toString());
-    }
-
-    private JsonParser getDefaultJsonParserImpl(final InputStream in) {
-        //UTF Auto detection RFC 4627
-        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider);
-    }
-
-    private JsonParser getDefaultJsonParserImpl(final InputStream in, final Charset charset) {
-        //use provided charset
-        return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider);
-    }
-
-    private JsonParser getDefaultJsonParserImpl(final Reader in) {
-        //no charset necessary
-        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider);
-    }
-
-    @Override
-    public JsonParser createParser(final Reader reader) {
-        return getDefaultJsonParserImpl(reader);
-    }
-
-    @Override
-    public JsonParser createParser(final InputStream in) {
-        return getDefaultJsonParserImpl(in);
-    }
-
-    @Override
-    public JsonParser createParser(final InputStream in, final Charset charset) {
-        return getDefaultJsonParserImpl(in, charset);
-    }
-
-    @Override
-    public JsonParser createParser(final JsonObject obj) {
-        return new JsonInMemoryParser(obj);
-    }
-
-    @Override
-    public JsonParser createParser(final JsonArray array) {
-        return new JsonInMemoryParser(array);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return Collections.unmodifiableMap(internalConfig);
-    }
-
-    public JsonParser createInternalParser(final InputStream in) {
-        return getDefaultJsonParserImpl(in);
-    }
-    
-    public JsonParser createInternalParser(final InputStream in, final Charset charset) {
-        return getDefaultJsonParserImpl(in, charset);
-    }
-
-    public JsonParser createInternalParser(final Reader reader) {
-        return getDefaultJsonParserImpl(reader);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonPrettyGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonPrettyGeneratorImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonPrettyGeneratorImpl.java
deleted file mode 100644
index 2e72f20..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonPrettyGeneratorImpl.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.OutputStream;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.charset.Charset;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.json.JsonValue;
-import javax.json.stream.JsonGenerator;
-
-final class JsonPrettyGeneratorImpl extends JsonGeneratorImpl {
-    private static final String DEFAULT_INDENTATION = "  ";
-    private final String indent;
-
-    public JsonPrettyGeneratorImpl(final Writer writer, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache) {
-        super(writer, bufferProvider, cache);
-        indent = DEFAULT_INDENTATION;
-    }
-
-    public JsonPrettyGeneratorImpl(final OutputStream out, final Charset encoding,
-            final BufferStrategy.BufferProvider<char[]> bufferProvider, final ConcurrentMap<String, String> cache) {
-        super(out, encoding, bufferProvider, cache);
-        indent = DEFAULT_INDENTATION;
-    }
-
-    public JsonPrettyGeneratorImpl(final OutputStream out, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final ConcurrentMap<String, String> cache) {
-        super(out, bufferProvider, cache);
-        indent = DEFAULT_INDENTATION;
-    }
-
-    private void writeEOL() {
-        justWrite(EOL);
-    }
-
-    private void writeIndent(final int correctionOffset) {
-        for (int i = 0; i < depth + correctionOffset; i++) {
-            justWrite(indent);
-        }
-    }
-
-    @Override
-    protected void addCommaIfNeeded() {
-        if (needComma) {
-            justWrite(COMMA_CHAR);
-            writeEOL();
-            writeIndent(0);
-            needComma = false;
-        }
-
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        if (depth > 0 && !needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeStartObject();
-
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(final String name) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeStartObject(name);
-
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        if (depth > 0 && !needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeStartArray();
-
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(final String name) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeStartArray(name);
-
-    }
-
-    //end
-
-    @Override
-    public JsonGenerator writeEnd() {
-        writeEOL();
-        writeIndent(-1);
-        return super.writeEnd();
-
-    }
-
-    //normal
-
-    @Override
-    public JsonGenerator write(final String name, final JsonValue value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final String value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final BigInteger value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final BigDecimal value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final int value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final long value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final double value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String name, final boolean value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(name, value);
-
-    }
-
-    @Override
-    public JsonGenerator writeNull(final String name) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeNull(name);
-
-    }
-
-    @Override
-    public JsonGenerator write(final JsonValue value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final String value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final BigDecimal value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final BigInteger value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final int value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final long value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final double value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator write(final boolean value) {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.write(value);
-
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        if (!needComma) {
-            writeEOL();
-            writeIndent(0);
-        }
-        return super.writeNull();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonProviderImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonProviderImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonProviderImpl.java
deleted file mode 100644
index 6245030..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonProviderImpl.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Serializable;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.Map;
-
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonBuilderFactory;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-import javax.json.JsonWriter;
-import javax.json.JsonWriterFactory;
-import javax.json.spi.JsonProvider;
-import javax.json.stream.JsonGenerator;
-import javax.json.stream.JsonGeneratorFactory;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParserFactory;
-
-public class JsonProviderImpl extends JsonProvider implements Serializable {
-    private static final JsonProvider DELEGATE = new JsonProviderDelegate();
-    
-
-    @Override
-    public JsonParser createParser(final Reader reader) {
-        return DELEGATE.createParser(reader);
-    }
-
-    @Override
-    public JsonParser createParser(final InputStream inputStream) {
-        return DELEGATE.createParser(inputStream);
-    }
-
-    @Override
-    public JsonParserFactory createParserFactory(final Map<String, ?> stringMap) {
-        return DELEGATE.createParserFactory(stringMap);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(final Writer writer) {
-        return DELEGATE.createGenerator(writer);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(final OutputStream outputStream) {
-        return DELEGATE.createGenerator(outputStream);
-    }
-
-    @Override
-    public JsonGeneratorFactory createGeneratorFactory(final Map<String, ?> stringMap) {
-        return DELEGATE.createGeneratorFactory(stringMap);
-    }
-
-    @Override
-    public JsonReader createReader(final Reader reader) {
-        return DELEGATE.createReader(reader);
-    }
-
-    @Override
-    public JsonReader createReader(final InputStream inputStream) {
-        return DELEGATE.createReader(inputStream);
-    }
-
-    @Override
-    public JsonWriter createWriter(final Writer writer) {
-        return DELEGATE.createWriter(writer);
-    }
-
-    @Override
-    public JsonWriter createWriter(final OutputStream outputStream) {
-        return DELEGATE.createWriter(outputStream);
-    }
-
-    @Override
-    public JsonWriterFactory createWriterFactory(final Map<String, ?> stringMap) {
-        return DELEGATE.createWriterFactory(stringMap);
-    }
-
-    @Override
-    public JsonReaderFactory createReaderFactory(final Map<String, ?> stringMap) {
-        return DELEGATE.createReaderFactory(stringMap);
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return DELEGATE.createObjectBuilder();
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return DELEGATE.createArrayBuilder();
-    }
-
-    @Override
-    public JsonBuilderFactory createBuilderFactory(Map<String, ?> stringMap) {
-        return DELEGATE.createBuilderFactory(stringMap);
-    }
-
-    static class JsonProviderDelegate extends JsonProvider {
-        private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(Collections.<String, Object>emptyMap());
-        private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(Collections.<String, Object>emptyMap());
-        private final JsonGeneratorFactory generatorFactory = new JsonGeneratorFactoryImpl(Collections.<String, Object>emptyMap());
-        private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
-
-        @Override
-        public JsonParser createParser(final InputStream in) {
-            return parserFactory.createParser(in);
-        }
-
-        @Override
-        public JsonParser createParser(final Reader reader) {
-            return parserFactory.createParser(reader);
-        }
-
-        @Override
-        public JsonReader createReader(final InputStream in) {
-            return readerFactory.createReader(in);
-        }
-
-        @Override
-        public JsonReader createReader(final Reader reader) {
-            return readerFactory.createReader(reader);
-        }
-
-        @Override
-        public JsonParserFactory createParserFactory(final Map<String, ?> config) {
-            return new JsonParserFactoryImpl(config);
-        }
-
-        @Override
-        public JsonReaderFactory createReaderFactory(final Map<String, ?> config) {
-            return new JsonReaderFactoryImpl(config);
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public JsonGenerator createGenerator(final Writer writer) {
-            return generatorFactory.createGenerator(writer);
-        }
-
-        @Override
-        public JsonGenerator createGenerator(final OutputStream out) {
-            return generatorFactory.createGenerator(out);
-        }
-
-        @Override
-        public JsonGeneratorFactory createGeneratorFactory(final Map<String, ?> config) {
-            return new JsonGeneratorFactoryImpl(config);
-        }
-
-        @Override
-        public JsonWriter createWriter(final Writer writer) {
-            return new JsonWriterImpl(createGenerator(writer));
-        }
-
-        @Override
-        public JsonWriter createWriter(final OutputStream out) {
-            return createWriter(new OutputStreamWriter(out, UTF8_CHARSET));
-        }
-
-        @Override
-        public JsonWriterFactory createWriterFactory(final Map<String, ?> config) {
-            return new JsonWriterFactoryImpl(config);
-        }
-
-        @Override
-        public JsonObjectBuilder createObjectBuilder() {
-            return new JsonObjectBuilderImpl();
-        }
-
-        @Override
-        public JsonArrayBuilder createArrayBuilder() {
-            return new JsonArrayBuilderImpl();
-        }
-
-        @Override
-        public JsonBuilderFactory createBuilderFactory(final Map<String, ?> config) {
-            return new JsonBuilderFactoryImpl(config);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderFactoryImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderFactoryImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderFactoryImpl.java
deleted file mode 100644
index 6f0e063..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderFactoryImpl.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.Serializable;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-
-class JsonReaderFactoryImpl implements JsonReaderFactory, Serializable {
-    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
-    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-        JsonParserFactoryImpl.BUFFER_STRATEGY, JsonParserFactoryImpl.MAX_STRING_LENGTH, JsonParserFactoryImpl.BUFFER_LENGTH
-    };
-    private final JsonParserFactoryImpl parserFactory;
-
-    JsonReaderFactoryImpl(final Map<String, ?> config) {
-
-        if(config != null) {
-            
-            for (String configKey : SUPPORTED_CONFIG_KEYS) {
-                if(config.containsKey(configKey)) {
-                    internalConfig.put(configKey, config.get(configKey));
-                }
-            }
-        } 
-        
-        this.parserFactory = new JsonParserFactoryImpl(internalConfig);
-    }
-
-    @Override
-    public JsonReader createReader(final Reader reader) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(reader));
-    }
-
-    @Override
-    public JsonReader createReader(final InputStream in) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in));
-    }
-
-    @Override
-    public JsonReader createReader(final InputStream in, final Charset charset) {
-        return new JsonReaderImpl(parserFactory.createInternalParser(in, charset));
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return Collections.unmodifiableMap(internalConfig);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderImpl.java
deleted file mode 100644
index 3586bc5..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonReaderImpl.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * 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.fleece.core;
-
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObject;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonReader;
-import javax.json.JsonStructure;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParsingException;
-
-class JsonReaderImpl implements JsonReader {
-    private final JsonParser parser;
-    private boolean closed = false;
-
-    JsonReaderImpl(final JsonParser parser) {
-        this.parser = parser;
-    }
-
-    @Override
-    public JsonStructure read() {
-
-        checkClosed();
-
-        if (!parser.hasNext()) {
-            throw new IllegalStateException("Nothing to read");
-        }
-        switch (parser.next()) {
-            case START_OBJECT:
-                final JsonObjectBuilder objectBuilder = new JsonObjectBuilderImpl();
-                parseObject(objectBuilder);
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
-                close();
-                return objectBuilder.build();
-            case START_ARRAY:
-                final JsonArrayBuilder arrayBuilder = new JsonArrayBuilderImpl();
-                parseArray(arrayBuilder);
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
-                close();
-                return arrayBuilder.build();
-            default:
-                close();
-                throw new JsonParsingException("Unknown structure: " + parser.next(), parser.getLocation());
-        }
-
-    }
-
-    @Override
-    public JsonObject readObject() {
-        return JsonObject.class.cast(read());
-    }
-
-    @Override
-    public JsonArray readArray() {
-        return JsonArray.class.cast(read());
-    }
-
-    @Override
-    public void close() {
-
-        if (!closed) {
-            closed = true;
-            parser.close();
-        }
-
-    }
-
-    private void parseObject(final JsonObjectBuilder builder) {
-        String key = null;
-        while (parser.hasNext()) {
-            final JsonParser.Event next = parser.next();
-            switch (next) {
-                case KEY_NAME:
-                    key = parser.getString();
-                    break;
-
-                case VALUE_STRING:
-                    builder.add(key, new JsonStringImpl(parser.getString()));
-                    break;
-
-                case START_OBJECT:
-                    JsonObjectBuilder subObject = null;
-                    parseObject(subObject = new JsonObjectBuilderImpl());
-                    builder.add(key, subObject);
-                    break;
-
-                case START_ARRAY:
-                    JsonArrayBuilder subArray = null;
-                    parseArray(subArray = new JsonArrayBuilderImpl());
-                    builder.add(key, subArray);
-                    break;
-
-                case VALUE_NUMBER:
-                    if (parser.isIntegralNumber()) {
-                        builder.add(key, new JsonLongImpl(parser.getLong()));
-                    } else {
-                        builder.add(key, new JsonNumberImpl(parser.getBigDecimal()));
-                    }
-                    break;
-
-                case VALUE_NULL:
-                    builder.addNull(key);
-                    break;
-
-                case VALUE_TRUE:
-                    builder.add(key, true);
-                    break;
-
-                case VALUE_FALSE:
-                    builder.add(key, false);
-                    break;
-
-                case END_OBJECT:
-                    return;
-
-                case END_ARRAY:
-                    throw new JsonParsingException("']', shouldn't occur", parser.getLocation());
-
-                default:
-                    throw new JsonParsingException(next.name() + ", shouldn't occur", parser.getLocation());
-            }
-        }
-    }
-
-    private void parseArray(final JsonArrayBuilder builder) {
-        while (parser.hasNext()) {
-            final JsonParser.Event next = parser.next();
-            switch (next) {
-                case VALUE_STRING:
-                    builder.add(new JsonStringImpl(parser.getString()));
-                    break;
-
-                case VALUE_NUMBER:
-                    if (parser.isIntegralNumber()) {
-                        builder.add(new JsonLongImpl(parser.getLong()));
-                    } else {
-                        builder.add(new JsonNumberImpl(parser.getBigDecimal()));
-                    }
-                    break;
-
-                case START_OBJECT:
-                    JsonObjectBuilder subObject = null;
-                    parseObject(subObject = new JsonObjectBuilderImpl());
-                    builder.add(subObject);
-                    break;
-
-                case START_ARRAY:
-                    JsonArrayBuilder subArray = null;
-                    parseArray(subArray = new JsonArrayBuilderImpl());
-                    builder.add(subArray);
-                    break;
-
-                case END_ARRAY:
-                    return;
-
-                case VALUE_NULL:
-                    builder.addNull();
-                    break;
-
-                case VALUE_TRUE:
-                    builder.add(true);
-                    break;
-
-                case VALUE_FALSE:
-                    builder.add(false);
-                    break;
-
-                case KEY_NAME:
-                    throw new JsonParsingException("array doesn't have keys", parser.getLocation());
-
-                case END_OBJECT:
-                    throw new JsonParsingException("'}', shouldn't occur", parser.getLocation());
-
-                default:
-                    throw new JsonParsingException(next.name() + ", shouldn't occur", parser.getLocation());
-            }
-        }
-    }
-
-    private void checkClosed() {
-        if (closed) {
-            throw new IllegalStateException("read(), readObject(), readArray() or close() method was already called");
-        }
-
-    }
-}


[16/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/big_600kb.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/big_600kb.json b/fleece-core/src/test/resources/bench/big_600kb.json
deleted file mode 100644
index 794933d..0000000
--- a/fleece-core/src/test/resources/bench/big_600kb.json
+++ /dev/null
@@ -1,21170 +0,0 @@
-[
-  {
-    "id": 0,
-    "guid": "90909455-75ff-47b7-869c-05c24b21b29c",
-    "isActive": false,
-    "balance": "$3,117.06",
-    "picture": "http://placehold.it/32x32",
-    "age": 37,
-    "eyeColor": "brown",
-    "name": "Gill Alvarado",
-    "gender": "male",
-    "company": "ZENSUS",
-    "address": "606 Holmes Lane, Hardyville, Louisiana, 2829",
-    "about": "Voluptate minim ad pariatur qui commodo elit veniam deserunt ex proident ad veniam. Consectetur consectetur consequat tempor dolore id consequat officia. Do ullamco dolore sint est deserunt reprehenderit esse. Est consectetur excepteur eiusmod enim eu ad sunt. Veniam aliqua id cupidatat reprehenderit et ullamco culpa magna culpa deserunt nisi dolor consequat duis. Dolore commodo nisi sit in velit pariatur consequat commodo. Nisi do enim sint consectetur amet dolore laborum labore ullamco.\r\n",
-    "registered": "2014-05-01T05:52:56 -02:00",
-    "latitude": -24.379027,
-    "longitude": 21.69924,
-    "tags": [
-      "velit",
-      "incididunt",
-      "duis",
-      "quis",
-      "elit",
-      "laboris",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lora Middleton"
-      },
-      {
-        "id": 1,
-        "name": "Mccall Mckay"
-      },
-      {
-        "id": 2,
-        "name": "Nash Brennan"
-      }
-    ],
-    "greeting": "Hello, Gill Alvarado! You have 9 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 1,
-    "guid": "627b8274-05d7-4f33-a316-835d57cba4fe",
-    "isActive": true,
-    "balance": "$3,477.42",
-    "picture": "http://placehold.it/32x32",
-    "age": 23,
-    "eyeColor": "brown",
-    "name": "Elvira Maddox",
-    "gender": "female",
-    "company": "UNDERTAP",
-    "address": "154 Locust Street, Chapin, Missouri, 4712",
-    "about": "Occaecat pariatur do minim mollit aute do nostrud id sunt. Dolore enim irure est ad adipisicing labore est. Adipisicing officia consectetur Lorem pariatur adipisicing qui ad officia aute. Est id laborum aliqua minim aliquip eiusmod officia.\r\n",
-    "registered": "2014-06-04T01:19:55 -02:00",
-    "latitude": -26.425596,
-    "longitude": 139.328657,
-    "tags": [
-      "nisi",
-      "laborum",
-      "sunt",
-      "minim",
-      "in",
-      "elit",
-      "ut"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Obrien Harris"
-      },
-      {
-        "id": 1,
-        "name": "Muriel Finch"
-      },
-      {
-        "id": 2,
-        "name": "Jeanie Hobbs"
-      }
-    ],
-    "greeting": "Hello, Elvira Maddox! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 2,
-    "guid": "f6ac5b23-67f6-40c5-a8fd-c3f0e18c0dc4",
-    "isActive": false,
-    "balance": "$2,987.75",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "blue",
-    "name": "Miranda Bowen",
-    "gender": "male",
-    "company": "PORTICO",
-    "address": "960 Harbor Court, Bluetown, Arkansas, 6598",
-    "about": "Commodo consectetur dolore aute laboris veniam et. Anim nulla aute voluptate pariatur occaecat dolor laborum exercitation irure magna exercitation officia fugiat magna. Amet anim exercitation voluptate veniam. Cupidatat incididunt nostrud Lorem irure laboris duis irure labore ad amet aliqua ex pariatur et. Cillum pariatur ipsum anim culpa esse non qui fugiat irure ipsum Lorem adipisicing. Labore excepteur aliqua nostrud ad sunt officia. Pariatur nisi dolore quis cillum consequat qui excepteur minim pariatur magna nisi commodo.\r\n",
-    "registered": "2014-05-28T00:14:04 -02:00",
-    "latitude": -74.237441,
-    "longitude": -140.084515,
-    "tags": [
-      "velit",
-      "culpa",
-      "incididunt",
-      "dolore",
-      "nulla",
-      "Lorem",
-      "et"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Kelly Flowers"
-      },
-      {
-        "id": 1,
-        "name": "Farmer Sanchez"
-      },
-      {
-        "id": 2,
-        "name": "Branch Tanner"
-      }
-    ],
-    "greeting": "Hello, Miranda Bowen! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 3,
-    "guid": "191c141e-2b21-4fed-8287-6ec8b3e5cc71",
-    "isActive": true,
-    "balance": "$1,002.25",
-    "picture": "http://placehold.it/32x32",
-    "age": 37,
-    "eyeColor": "green",
-    "name": "Dee Freeman",
-    "gender": "female",
-    "company": "HAWKSTER",
-    "address": "356 Amity Street, Trail, California, 3332",
-    "about": "Labore ipsum exercitation ipsum ipsum voluptate commodo fugiat est id et mollit veniam. Irure ipsum ut aliqua et id eiusmod in eiusmod labore excepteur sit eu aliquip. Labore nostrud consectetur enim mollit fugiat ex exercitation quis irure cillum duis pariatur qui ipsum. Aliqua culpa et amet ea incididunt consequat. Cillum reprehenderit enim cillum proident eiusmod. Exercitation Lorem do nulla veniam aliqua enim. Ipsum minim veniam deserunt quis anim cupidatat.\r\n",
-    "registered": "2014-06-13T08:25:12 -02:00",
-    "latitude": -40.507152,
-    "longitude": -46.43242,
-    "tags": [
-      "nisi",
-      "proident",
-      "anim",
-      "do",
-      "consectetur",
-      "dolore",
-      "qui"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Langley Osborn"
-      },
-      {
-        "id": 1,
-        "name": "Tammy Mckenzie"
-      },
-      {
-        "id": 2,
-        "name": "Lidia Adkins"
-      }
-    ],
-    "greeting": "Hello, Dee Freeman! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 4,
-    "guid": "62552a32-d411-43be-8ece-ff083a31cf8f",
-    "isActive": true,
-    "balance": "$3,722.18",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "blue",
-    "name": "Mcfadden Terrell",
-    "gender": "male",
-    "company": "VALREDA",
-    "address": "175 Auburn Place, Welda, Kansas, 6118",
-    "about": "Non exercitation deserunt minim ipsum qui elit occaecat magna fugiat veniam eiusmod anim. Ad aute esse proident id consectetur cillum adipisicing sint Lorem enim ex laboris laborum deserunt. Qui ea proident nulla eu dolore. Cillum excepteur nulla ad incididunt aliqua esse incididunt magna laboris dolore culpa consectetur dolor id. Aliqua labore elit sit sint enim veniam. Consequat do enim laborum reprehenderit cupidatat laborum fugiat ullamco deserunt.\r\n",
-    "registered": "2014-01-22T22:48:37 -01:00",
-    "latitude": 2.71901,
-    "longitude": -75.747338,
-    "tags": [
-      "mollit",
-      "et",
-      "dolore",
-      "pariatur",
-      "minim",
-      "magna",
-      "ex"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Parks Bauer"
-      },
-      {
-        "id": 1,
-        "name": "Head Rollins"
-      },
-      {
-        "id": 2,
-        "name": "Hopkins Singleton"
-      }
-    ],
-    "greeting": "Hello, Mcfadden Terrell! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 5,
-    "guid": "aead779c-2a36-4342-994a-4974eb929a7c",
-    "isActive": false,
-    "balance": "$3,984.58",
-    "picture": "http://placehold.it/32x32",
-    "age": 20,
-    "eyeColor": "green",
-    "name": "Little Hurley",
-    "gender": "male",
-    "company": "SATIANCE",
-    "address": "301 Flatbush Avenue, Statenville, Maine, 8754",
-    "about": "Duis excepteur laboris ex adipisicing. Et dolor officia velit duis laborum consequat Lorem anim in. Sunt velit amet ad cillum magna. Reprehenderit excepteur ipsum in nisi ad pariatur nostrud ullamco in laborum consectetur eiusmod adipisicing consectetur.\r\n",
-    "registered": "2014-05-05T15:54:25 -02:00",
-    "latitude": 69.423196,
-    "longitude": -94.350728,
-    "tags": [
-      "et",
-      "quis",
-      "tempor",
-      "aute",
-      "aliqua",
-      "sit",
-      "aute"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Carolina Jimenez"
-      },
-      {
-        "id": 1,
-        "name": "Amanda Mathis"
-      },
-      {
-        "id": 2,
-        "name": "Annie Fuller"
-      }
-    ],
-    "greeting": "Hello, Little Hurley! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 6,
-    "guid": "7ca92bd5-e732-407f-ad24-ad143d9b9ec1",
-    "isActive": false,
-    "balance": "$3,707.35",
-    "picture": "http://placehold.it/32x32",
-    "age": 25,
-    "eyeColor": "blue",
-    "name": "Faye Olson",
-    "gender": "female",
-    "company": "COMTREK",
-    "address": "902 Bradford Street, Holcombe, Northern Mariana Islands, 5003",
-    "about": "Et non ullamco consectetur voluptate sint anim incididunt. Minim sunt minim reprehenderit exercitation consectetur. Sit mollit excepteur qui cillum esse laboris consequat nisi. Amet ea et ut tempor aliqua qui do culpa sit dolore. Est mollit ex cupidatat pariatur eiusmod culpa fugiat laborum ut incididunt dolore nostrud ipsum.\r\n",
-    "registered": "2014-01-18T01:31:34 -01:00",
-    "latitude": -64.058845,
-    "longitude": -94.333028,
-    "tags": [
-      "ea",
-      "duis",
-      "esse",
-      "magna",
-      "dolore",
-      "aliqua",
-      "cillum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sheppard Butler"
-      },
-      {
-        "id": 1,
-        "name": "Stokes Woodward"
-      },
-      {
-        "id": 2,
-        "name": "Hendrix Baxter"
-      }
-    ],
-    "greeting": "Hello, Faye Olson! You have 6 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 7,
-    "guid": "bb6e0a12-c5b9-4817-8aee-27b43649cbc7",
-    "isActive": true,
-    "balance": "$1,164.27",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "green",
-    "name": "Kelley Trevino",
-    "gender": "male",
-    "company": "GENMOM",
-    "address": "387 Stuart Street, Bodega, Guam, 1672",
-    "about": "Fugiat laboris cupidatat reprehenderit velit excepteur sunt aliquip Lorem. Sunt sit laboris veniam mollit. Ea consectetur labore aute commodo qui ullamco reprehenderit amet. Duis pariatur culpa nostrud adipisicing commodo pariatur. Anim pariatur magna aute ea magna do ea excepteur sint ad officia nisi.\r\n",
-    "registered": "2014-02-22T14:06:37 -01:00",
-    "latitude": 52.294677,
-    "longitude": -141.875032,
-    "tags": [
-      "dolor",
-      "ipsum",
-      "sunt",
-      "deserunt",
-      "qui",
-      "adipisicing",
-      "irure"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Queen Ferrell"
-      },
-      {
-        "id": 1,
-        "name": "Alfreda Lane"
-      },
-      {
-        "id": 2,
-        "name": "Anderson Benson"
-      }
-    ],
-    "greeting": "Hello, Kelley Trevino! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 8,
-    "guid": "8ba230e6-055c-46d4-989a-9ed765941d67",
-    "isActive": true,
-    "balance": "$2,213.32",
-    "picture": "http://placehold.it/32x32",
-    "age": 30,
-    "eyeColor": "green",
-    "name": "Marietta Stout",
-    "gender": "female",
-    "company": "KROG",
-    "address": "251 Court Square, Emerald, North Carolina, 2349",
-    "about": "Aliquip sint laboris ut Lorem ipsum amet dolor esse. Excepteur est officia consectetur et. Incididunt pariatur dolor magna culpa labore deserunt duis. Cupidatat consequat occaecat ad esse pariatur ex anim proident. Tempor consequat laboris tempor enim occaecat. Labore ex deserunt est sunt sunt mollit laboris ex in.\r\n",
-    "registered": "2014-05-17T04:06:24 -02:00",
-    "latitude": 37.56671,
-    "longitude": -116.19298,
-    "tags": [
-      "nulla",
-      "quis",
-      "aliquip",
-      "magna",
-      "ad",
-      "exercitation",
-      "pariatur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Hallie Vargas"
-      },
-      {
-        "id": 1,
-        "name": "Desiree Maxwell"
-      },
-      {
-        "id": 2,
-        "name": "Mayer Arnold"
-      }
-    ],
-    "greeting": "Hello, Marietta Stout! You have 1 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 9,
-    "guid": "7e4aee63-9a75-4aa8-af6b-01bcd5e16a20",
-    "isActive": false,
-    "balance": "$3,286.68",
-    "picture": "http://placehold.it/32x32",
-    "age": 21,
-    "eyeColor": "blue",
-    "name": "Viola Rivers",
-    "gender": "female",
-    "company": "HELIXO",
-    "address": "807 Amber Street, Aberdeen, West Virginia, 562",
-    "about": "Magna eiusmod commodo est do duis do. Ullamco ad do dolor reprehenderit ipsum irure. Ex nostrud officia laborum duis proident cillum est fugiat. Consectetur labore tempor dolor duis nisi proident amet incididunt sunt ad ea non. Laboris dolor magna adipisicing eiusmod.\r\n",
-    "registered": "2014-02-13T22:44:55 -01:00",
-    "latitude": 41.971903,
-    "longitude": -81.734388,
-    "tags": [
-      "proident",
-      "tempor",
-      "duis",
-      "excepteur",
-      "aute",
-      "laboris",
-      "minim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Mcdonald Mcguire"
-      },
-      {
-        "id": 1,
-        "name": "Adrienne Hinton"
-      },
-      {
-        "id": 2,
-        "name": "Dorothea Santos"
-      }
-    ],
-    "greeting": "Hello, Viola Rivers! You have 3 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 10,
-    "guid": "c5b167f5-823f-4889-9b8e-4594c4082cff",
-    "isActive": false,
-    "balance": "$3,547.76",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "blue",
-    "name": "Ollie Hyde",
-    "gender": "female",
-    "company": "INTERFIND",
-    "address": "627 Bevy Court, Nadine, Connecticut, 3643",
-    "about": "Dolore in qui veniam qui do labore enim proident reprehenderit. Pariatur fugiat non id aliquip non reprehenderit. Amet sint in cillum irure laborum dolore culpa aliquip deserunt. Duis deserunt pariatur non exercitation minim non cupidatat sunt labore mollit. Exercitation ea sit incididunt est nostrud esse consectetur et commodo deserunt nostrud minim ullamco in.\r\n",
-    "registered": "2014-04-06T23:34:04 -02:00",
-    "latitude": -69.599214,
-    "longitude": 168.519498,
-    "tags": [
-      "duis",
-      "labore",
-      "voluptate",
-      "quis",
-      "non",
-      "magna",
-      "officia"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Dolly Jarvis"
-      },
-      {
-        "id": 1,
-        "name": "Leon Burns"
-      },
-      {
-        "id": 2,
-        "name": "Underwood Livingston"
-      }
-    ],
-    "greeting": "Hello, Ollie Hyde! You have 3 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 11,
-    "guid": "2e7590d5-7e93-4d26-9155-520d5cf29a4b",
-    "isActive": false,
-    "balance": "$1,448.29",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "brown",
-    "name": "Kim Fox",
-    "gender": "female",
-    "company": "GEEKMOSIS",
-    "address": "854 Monroe Street, Bethpage, Michigan, 2679",
-    "about": "Aliqua in laborum sit adipisicing elit mollit ex eiusmod est. Culpa veniam dolor elit nostrud anim deserunt exercitation eiusmod amet. Consequat magna dolore proident aute nostrud nostrud. Veniam incididunt nisi cillum anim sit sint est proident commodo reprehenderit eiusmod ullamco. Non quis elit laboris minim fugiat in labore eiusmod pariatur labore magna do enim dolor. Aliquip reprehenderit qui enim quis velit adipisicing. Quis in eiusmod ipsum enim aliquip non deserunt nisi anim ex.\r\n",
-    "registered": "2014-01-28T18:39:52 -01:00",
-    "latitude": -81.998284,
-    "longitude": -88.055618,
-    "tags": [
-      "nisi",
-      "exercitation",
-      "reprehenderit",
-      "tempor",
-      "anim",
-      "eu",
-      "amet"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lara Salas"
-      },
-      {
-        "id": 1,
-        "name": "Erin Jones"
-      },
-      {
-        "id": 2,
-        "name": "Rivera Perkins"
-      }
-    ],
-    "greeting": "Hello, Kim Fox! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 12,
-    "guid": "5c675780-defd-49e9-9cab-bd2a2622b3f1",
-    "isActive": true,
-    "balance": "$1,028.15",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "green",
-    "name": "Brenda Merritt",
-    "gender": "female",
-    "company": "DANCERITY",
-    "address": "289 Royce Street, Interlochen, Nevada, 7469",
-    "about": "Eiusmod deserunt aliquip aliquip laboris non. Laborum occaecat aute et anim sit sunt proident Lorem incididunt nisi. Ut consectetur id est eiusmod dolore voluptate deserunt officia aliqua duis adipisicing consequat quis. Velit Lorem dolor nisi ex.\r\n",
-    "registered": "2014-03-23T14:31:05 -01:00",
-    "latitude": -1.992419,
-    "longitude": -109.503804,
-    "tags": [
-      "duis",
-      "aliquip",
-      "mollit",
-      "fugiat",
-      "magna",
-      "ipsum",
-      "culpa"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Page Marsh"
-      },
-      {
-        "id": 1,
-        "name": "Katie Callahan"
-      },
-      {
-        "id": 2,
-        "name": "Ruth Francis"
-      }
-    ],
-    "greeting": "Hello, Brenda Merritt! You have 3 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 13,
-    "guid": "437e75d6-2ac5-4ea6-8063-88708c2b8227",
-    "isActive": false,
-    "balance": "$1,374.74",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "blue",
-    "name": "Deirdre Keller",
-    "gender": "female",
-    "company": "GREEKER",
-    "address": "438 Onderdonk Avenue, Glenbrook, Wisconsin, 9551",
-    "about": "Non do cupidatat proident id minim. Velit est officia cupidatat dolor aliquip non et nulla quis et eiusmod eiusmod ullamco ipsum. Dolor ex excepteur sunt non quis anim. Voluptate cillum cupidatat consectetur ipsum amet.\r\n",
-    "registered": "2014-06-14T22:20:04 -02:00",
-    "latitude": 87.768462,
-    "longitude": 22.530136,
-    "tags": [
-      "do",
-      "cillum",
-      "nulla",
-      "veniam",
-      "proident",
-      "adipisicing",
-      "Lorem"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Quinn Rutledge"
-      },
-      {
-        "id": 1,
-        "name": "Eva Cervantes"
-      },
-      {
-        "id": 2,
-        "name": "Sylvia Tillman"
-      }
-    ],
-    "greeting": "Hello, Deirdre Keller! You have 4 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 14,
-    "guid": "96a02585-1723-4515-935d-0cede27c0846",
-    "isActive": false,
-    "balance": "$1,779.14",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "green",
-    "name": "Shanna Baker",
-    "gender": "female",
-    "company": "AVIT",
-    "address": "788 Nostrand Avenue, Saranap, District Of Columbia, 5974",
-    "about": "In commodo in aute esse occaecat eu sit esse. Exercitation qui id proident officia aute aliquip aliqua reprehenderit nulla adipisicing occaecat elit. Cupidatat exercitation duis nulla minim id eu veniam ut pariatur consectetur veniam non labore aliquip. Consectetur velit ipsum id quis labore eiusmod. Lorem proident eiusmod ea ullamco mollit laborum esse anim mollit. Aute dolore est anim qui proident elit incididunt. Ad labore esse amet voluptate qui aute quis ipsum aute duis adipisicing.\r\n",
-    "registered": "2014-04-10T03:51:29 -02:00",
-    "latitude": -13.861562,
-    "longitude": -27.313199,
-    "tags": [
-      "adipisicing",
-      "velit",
-      "Lorem",
-      "quis",
-      "sint",
-      "qui",
-      "adipisicing"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Carla Hopper"
-      },
-      {
-        "id": 1,
-        "name": "Richards Noel"
-      },
-      {
-        "id": 2,
-        "name": "Snider Cotton"
-      }
-    ],
-    "greeting": "Hello, Shanna Baker! You have 7 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 15,
-    "guid": "ec8191f7-6f03-4cf7-91da-3024fb9ea38a",
-    "isActive": true,
-    "balance": "$3,633.64",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "blue",
-    "name": "Imogene Britt",
-    "gender": "female",
-    "company": "COMVEY",
-    "address": "436 Stillwell Place, Tyhee, Arizona, 4963",
-    "about": "Velit ex ea non consectetur Lorem eu voluptate aliqua est voluptate. Irure nostrud nisi incididunt tempor proident officia id nisi duis enim. Non aliquip magna sint exercitation incididunt reprehenderit cillum commodo Lorem reprehenderit enim sunt eiusmod.\r\n",
-    "registered": "2014-05-09T16:14:08 -02:00",
-    "latitude": 52.374659,
-    "longitude": 30.332988,
-    "tags": [
-      "aute",
-      "quis",
-      "quis",
-      "dolore",
-      "deserunt",
-      "fugiat",
-      "aliquip"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Chan Whitney"
-      },
-      {
-        "id": 1,
-        "name": "Minnie Randolph"
-      },
-      {
-        "id": 2,
-        "name": "Beard Christensen"
-      }
-    ],
-    "greeting": "Hello, Imogene Britt! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 16,
-    "guid": "63b67c06-e945-42a0-85e8-8e15ad1a732d",
-    "isActive": true,
-    "balance": "$1,006.45",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "green",
-    "name": "Sheryl Cochran",
-    "gender": "female",
-    "company": "COMVOY",
-    "address": "770 Stryker Street, Hollins, Vermont, 3360",
-    "about": "Ad sint esse laborum exercitation eu id irure veniam aliquip dolore voluptate est. Cupidatat irure ut exercitation ipsum nulla laborum enim proident sunt laboris magna in. Incididunt eu magna cupidatat ut sit deserunt deserunt.\r\n",
-    "registered": "2014-05-07T00:50:42 -02:00",
-    "latitude": -37.208466,
-    "longitude": -114.220095,
-    "tags": [
-      "nostrud",
-      "non",
-      "cupidatat",
-      "irure",
-      "ullamco",
-      "cillum",
-      "commodo"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Cook Rowe"
-      },
-      {
-        "id": 1,
-        "name": "Marla Cooke"
-      },
-      {
-        "id": 2,
-        "name": "Brandi Mccray"
-      }
-    ],
-    "greeting": "Hello, Sheryl Cochran! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 17,
-    "guid": "41ac5392-ca10-475e-a1c6-c8d11aaa8fe6",
-    "isActive": true,
-    "balance": "$3,784.16",
-    "picture": "http://placehold.it/32x32",
-    "age": 25,
-    "eyeColor": "blue",
-    "name": "Christine Flynn",
-    "gender": "female",
-    "company": "PETICULAR",
-    "address": "842 Nova Court, Hegins, Colorado, 1207",
-    "about": "Ullamco est amet id anim ut velit. Commodo laboris duis amet occaecat irure mollit cillum aliquip cillum occaecat dolore ea excepteur aliquip. Irure consequat enim eu laboris ut mollit exercitation enim quis laboris est incididunt tempor. Eiusmod enim ad irure exercitation id deserunt eiusmod nostrud officia pariatur consectetur exercitation anim incididunt. Nisi aliqua incididunt duis est. Commodo cillum enim elit enim voluptate qui sint cillum eiusmod. Eu ea dolor est irure proident deserunt fugiat duis cillum.\r\n",
-    "registered": "2014-06-03T15:42:25 -02:00",
-    "latitude": 65.061089,
-    "longitude": 3.219881,
-    "tags": [
-      "commodo",
-      "duis",
-      "voluptate",
-      "veniam",
-      "ipsum",
-      "ipsum",
-      "labore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Jefferson Berry"
-      },
-      {
-        "id": 1,
-        "name": "Alston Weiss"
-      },
-      {
-        "id": 2,
-        "name": "Marina Boone"
-      }
-    ],
-    "greeting": "Hello, Christine Flynn! You have 1 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 18,
-    "guid": "a89d01d0-37d5-41a1-be54-25d6bf98e092",
-    "isActive": false,
-    "balance": "$2,946.08",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "brown",
-    "name": "Sheena Hill",
-    "gender": "female",
-    "company": "RECRISYS",
-    "address": "358 Billings Place, Villarreal, Mississippi, 1510",
-    "about": "Aute sint consectetur dolor elit do cillum aute cupidatat. Id nisi commodo dolor labore culpa aliqua labore. Amet reprehenderit tempor ut nulla minim. Laborum amet dolore sunt laboris laboris do aute. Dolor amet cupidatat aliqua duis consectetur nostrud velit veniam. Amet sunt exercitation aute cupidatat consequat cillum commodo.\r\n",
-    "registered": "2014-06-07T17:24:39 -02:00",
-    "latitude": 15.059534,
-    "longitude": 9.648239,
-    "tags": [
-      "duis",
-      "excepteur",
-      "ea",
-      "aute",
-      "mollit",
-      "labore",
-      "ad"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Katheryn Sims"
-      },
-      {
-        "id": 1,
-        "name": "Williamson Collier"
-      },
-      {
-        "id": 2,
-        "name": "Kathy Paul"
-      }
-    ],
-    "greeting": "Hello, Sheena Hill! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 19,
-    "guid": "7f6333ba-03d9-45e8-b1ac-4dd50bc466e0",
-    "isActive": true,
-    "balance": "$2,323.89",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "brown",
-    "name": "Maryellen Bryan",
-    "gender": "female",
-    "company": "GLUID",
-    "address": "826 Portland Avenue, Bordelonville, American Samoa, 8848",
-    "about": "Aliquip nostrud do minim ut qui commodo enim cillum enim. Incididunt non mollit reprehenderit laborum officia adipisicing in id consectetur eu eiusmod in irure. Nulla esse dolore incididunt cillum eu mollit nulla. Elit qui ea voluptate consectetur.\r\n",
-    "registered": "2014-06-21T15:30:13 -02:00",
-    "latitude": 45.789266,
-    "longitude": -169.609702,
-    "tags": [
-      "exercitation",
-      "occaecat",
-      "adipisicing",
-      "enim",
-      "sunt",
-      "fugiat",
-      "nostrud"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Hodge Gates"
-      },
-      {
-        "id": 1,
-        "name": "Beatriz Gallegos"
-      },
-      {
-        "id": 2,
-        "name": "Marks Byrd"
-      }
-    ],
-    "greeting": "Hello, Maryellen Bryan! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 20,
-    "guid": "c5f6beae-5920-4cb5-b8b8-d737c6776d3a",
-    "isActive": true,
-    "balance": "$3,270.86",
-    "picture": "http://placehold.it/32x32",
-    "age": 37,
-    "eyeColor": "blue",
-    "name": "Ursula Rich",
-    "gender": "female",
-    "company": "TERASCAPE",
-    "address": "779 Duffield Street, Waterloo, Alaska, 7054",
-    "about": "Proident veniam enim qui nisi minim commodo voluptate dolor Lorem. Quis sunt id ipsum est laboris aliquip eiusmod quis. Nisi eu id culpa ullamco mollit nulla mollit sint esse velit irure. Velit eiusmod sit sint ut incididunt nisi eiusmod aliqua.\r\n",
-    "registered": "2014-01-14T01:08:24 -01:00",
-    "latitude": 14.985632,
-    "longitude": 101.677198,
-    "tags": [
-      "eu",
-      "excepteur",
-      "velit",
-      "duis",
-      "commodo",
-      "quis",
-      "adipisicing"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bernadine Holland"
-      },
-      {
-        "id": 1,
-        "name": "Walters Park"
-      },
-      {
-        "id": 2,
-        "name": "Vance Parsons"
-      }
-    ],
-    "greeting": "Hello, Ursula Rich! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 21,
-    "guid": "d1cf2bcd-22a0-4611-b4a9-77aedd830181",
-    "isActive": false,
-    "balance": "$1,641.39",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "blue",
-    "name": "Nguyen Bush",
-    "gender": "male",
-    "company": "ELENTRIX",
-    "address": "244 Front Street, Roulette, Maryland, 1741",
-    "about": "Proident sint esse cillum ullamco irure sint deserunt ipsum. Sit laboris ullamco non exercitation incididunt incididunt commodo irure consectetur. Velit aute voluptate dolore mollit aliquip sit.\r\n",
-    "registered": "2014-05-16T09:42:47 -02:00",
-    "latitude": 56.019327,
-    "longitude": 33.678678,
-    "tags": [
-      "cupidatat",
-      "excepteur",
-      "culpa",
-      "sit",
-      "voluptate",
-      "laborum",
-      "eiusmod"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Carole Gregory"
-      },
-      {
-        "id": 1,
-        "name": "Clark Green"
-      },
-      {
-        "id": 2,
-        "name": "Christensen Holloway"
-      }
-    ],
-    "greeting": "Hello, Nguyen Bush! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 22,
-    "guid": "a2bb311f-c76f-451a-afa6-6089011aad51",
-    "isActive": true,
-    "balance": "$3,456.55",
-    "picture": "http://placehold.it/32x32",
-    "age": 20,
-    "eyeColor": "blue",
-    "name": "Misty Baird",
-    "gender": "female",
-    "company": "BIFLEX",
-    "address": "275 Liberty Avenue, Sabillasville, Nebraska, 2219",
-    "about": "Dolor tempor nulla dolore id laboris dolor labore voluptate mollit dolore aliquip. Minim esse adipisicing aliquip voluptate minim reprehenderit consequat et nisi proident tempor magna. Anim quis enim culpa mollit quis enim. Proident eiusmod reprehenderit et commodo ex est voluptate aliqua sint duis cillum anim ea amet.\r\n",
-    "registered": "2014-04-22T15:08:23 -02:00",
-    "latitude": 32.986275,
-    "longitude": -157.543912,
-    "tags": [
-      "adipisicing",
-      "laborum",
-      "sint",
-      "ut",
-      "minim",
-      "enim",
-      "non"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Meadows White"
-      },
-      {
-        "id": 1,
-        "name": "Velma Carr"
-      },
-      {
-        "id": 2,
-        "name": "Shepard Mcdonald"
-      }
-    ],
-    "greeting": "Hello, Misty Baird! You have 6 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 23,
-    "guid": "d7a25c26-3cd8-48fe-946c-259932c19c71",
-    "isActive": false,
-    "balance": "$3,304.19",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "blue",
-    "name": "Pena Hodges",
-    "gender": "male",
-    "company": "MARQET",
-    "address": "233 Battery Avenue, Fairacres, Tennessee, 5113",
-    "about": "Laborum nulla nisi occaecat consectetur velit sit proident ea tempor nulla eiusmod. Est irure dolor duis non ea in labore dolore ad eiusmod Lorem velit. Aliqua laborum ut sit excepteur duis ad duis do minim sunt pariatur. Ut qui elit velit adipisicing est. Aliquip excepteur sit velit nisi sunt sit aliquip nisi do reprehenderit. Lorem voluptate sunt reprehenderit aliqua. Exercitation ipsum consectetur mollit et aliqua sint.\r\n",
-    "registered": "2014-01-21T00:55:28 -01:00",
-    "latitude": -32.041115,
-    "longitude": 97.517042,
-    "tags": [
-      "dolore",
-      "in",
-      "eiusmod",
-      "voluptate",
-      "sit",
-      "eu",
-      "irure"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Benita Huber"
-      },
-      {
-        "id": 1,
-        "name": "Wolfe Mckinney"
-      },
-      {
-        "id": 2,
-        "name": "Morrow England"
-      }
-    ],
-    "greeting": "Hello, Pena Hodges! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 24,
-    "guid": "4f09a217-f861-4f92-9696-f24f02ab091e",
-    "isActive": true,
-    "balance": "$1,603.10",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "green",
-    "name": "Allie Dickson",
-    "gender": "female",
-    "company": "KONGENE",
-    "address": "351 Imlay Street, Enlow, Minnesota, 2988",
-    "about": "Veniam qui magna Lorem aliqua deserunt elit sint reprehenderit. Ex proident officia enim sit reprehenderit elit cillum exercitation est laborum et. Reprehenderit nisi irure nulla ad dolor.\r\n",
-    "registered": "2014-01-25T01:14:31 -01:00",
-    "latitude": -36.986396,
-    "longitude": 41.443775,
-    "tags": [
-      "adipisicing",
-      "mollit",
-      "proident",
-      "ut",
-      "culpa",
-      "aliquip",
-      "sint"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Reese Pacheco"
-      },
-      {
-        "id": 1,
-        "name": "Helen Boyd"
-      },
-      {
-        "id": 2,
-        "name": "Schroeder Robles"
-      }
-    ],
-    "greeting": "Hello, Allie Dickson! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 25,
-    "guid": "7d0ab9aa-83b6-4abe-9f0f-656bf9edd597",
-    "isActive": false,
-    "balance": "$3,674.50",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "blue",
-    "name": "Fern Mosley",
-    "gender": "female",
-    "company": "RODEOLOGY",
-    "address": "851 Hoyts Lane, Crucible, Delaware, 9435",
-    "about": "Cupidatat ipsum excepteur occaecat irure et in non mollit. Ex magna quis cupidatat ea dolore enim reprehenderit dolor. Deserunt in fugiat enim non id est velit laborum velit eu. Consectetur et ullamco magna ea esse. Consectetur do fugiat cillum magna mollit quis non cupidatat ut fugiat est nulla.\r\n",
-    "registered": "2014-01-17T08:45:48 -01:00",
-    "latitude": 18.755477,
-    "longitude": -59.863641,
-    "tags": [
-      "aliqua",
-      "non",
-      "tempor",
-      "labore",
-      "do",
-      "elit",
-      "ipsum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Torres Farrell"
-      },
-      {
-        "id": 1,
-        "name": "Hollie Harding"
-      },
-      {
-        "id": 2,
-        "name": "Maldonado Valencia"
-      }
-    ],
-    "greeting": "Hello, Fern Mosley! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 26,
-    "guid": "634a5ee8-5eef-40da-aae5-1f0bb69791be",
-    "isActive": true,
-    "balance": "$3,338.34",
-    "picture": "http://placehold.it/32x32",
-    "age": 38,
-    "eyeColor": "blue",
-    "name": "Adkins Norris",
-    "gender": "male",
-    "company": "EGYPTO",
-    "address": "673 Interborough Parkway, Williams, Washington, 938",
-    "about": "Exercitation ipsum voluptate ex qui aliquip excepteur deserunt deserunt eu. Anim cupidatat anim ea in laborum aute minim elit. Reprehenderit et minim id reprehenderit quis ea in mollit minim ex consequat. Id sunt laborum consequat anim. Nulla nostrud ad est irure non ad ad veniam sint nostrud.\r\n",
-    "registered": "2014-01-13T04:01:53 -01:00",
-    "latitude": 20.973319,
-    "longitude": 42.160184,
-    "tags": [
-      "magna",
-      "id",
-      "commodo",
-      "commodo",
-      "mollit",
-      "eu",
-      "labore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Glenn Lucas"
-      },
-      {
-        "id": 1,
-        "name": "Ferguson Bruce"
-      },
-      {
-        "id": 2,
-        "name": "Shaw Bryant"
-      }
-    ],
-    "greeting": "Hello, Adkins Norris! You have 7 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 27,
-    "guid": "0f4f9679-5bec-401e-9214-0c58ddaec860",
-    "isActive": true,
-    "balance": "$3,256.24",
-    "picture": "http://placehold.it/32x32",
-    "age": 37,
-    "eyeColor": "green",
-    "name": "Lucas Witt",
-    "gender": "male",
-    "company": "DEMINIMUM",
-    "address": "263 Blake Court, Lemoyne, Marshall Islands, 7505",
-    "about": "Ad non id aliquip esse exercitation adipisicing et fugiat ea exercitation labore occaecat ea. Esse ad veniam tempor incididunt Lorem. Magna deserunt est commodo quis dolor nulla tempor. Fugiat do enim Lorem commodo. Cupidatat veniam aliqua aliqua eiusmod do deserunt tempor est eu. Nostrud reprehenderit aute occaecat ipsum eu eu reprehenderit incididunt commodo excepteur excepteur id sint. Nulla pariatur officia quis occaecat ad nulla aute.\r\n",
-    "registered": "2014-07-03T05:32:05 -02:00",
-    "latitude": -39.775538,
-    "longitude": 124.81375,
-    "tags": [
-      "nulla",
-      "ipsum",
-      "aliquip",
-      "reprehenderit",
-      "amet",
-      "excepteur",
-      "anim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Harmon Chase"
-      },
-      {
-        "id": 1,
-        "name": "Benjamin Castillo"
-      },
-      {
-        "id": 2,
-        "name": "Kate Campos"
-      }
-    ],
-    "greeting": "Hello, Lucas Witt! You have 6 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 28,
-    "guid": "0d21d082-aaf4-43a0-a291-2b1fc30a4d07",
-    "isActive": true,
-    "balance": "$2,729.57",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "green",
-    "name": "Leanna Forbes",
-    "gender": "female",
-    "company": "ACCRUEX",
-    "address": "100 Madoc Avenue, Whitmer, Palau, 6963",
-    "about": "Irure nisi proident pariatur qui exercitation. Duis pariatur consectetur ullamco eiusmod adipisicing veniam laborum reprehenderit aliquip fugiat veniam. Labore commodo officia dolor labore veniam reprehenderit laborum labore magna. Sit magna velit duis Lorem cillum ad.\r\n",
-    "registered": "2014-06-10T06:18:18 -02:00",
-    "latitude": 85.683019,
-    "longitude": 154.192477,
-    "tags": [
-      "amet",
-      "ut",
-      "esse",
-      "incididunt",
-      "incididunt",
-      "est",
-      "adipisicing"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Anne Whitaker"
-      },
-      {
-        "id": 1,
-        "name": "Campos Frye"
-      },
-      {
-        "id": 2,
-        "name": "Solomon Davis"
-      }
-    ],
-    "greeting": "Hello, Leanna Forbes! You have 9 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 29,
-    "guid": "1e6777a9-629b-4963-8aa9-a534be3ac70e",
-    "isActive": false,
-    "balance": "$3,500.71",
-    "picture": "http://placehold.it/32x32",
-    "age": 32,
-    "eyeColor": "brown",
-    "name": "Bonita May",
-    "gender": "female",
-    "company": "CUIZINE",
-    "address": "565 Lawn Court, Dexter, Pennsylvania, 6254",
-    "about": "Do aliquip tempor irure Lorem. Lorem aute exercitation Lorem elit occaecat est eu laborum laborum esse incididunt proident nisi elit. Dolor id amet ut fugiat minim Lorem ut eu consectetur ea incididunt.\r\n",
-    "registered": "2014-01-13T20:58:15 -01:00",
-    "latitude": 37.25374,
-    "longitude": -105.427169,
-    "tags": [
-      "do",
-      "id",
-      "et",
-      "voluptate",
-      "non",
-      "reprehenderit",
-      "et"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Best Gutierrez"
-      },
-      {
-        "id": 1,
-        "name": "Ebony Guzman"
-      },
-      {
-        "id": 2,
-        "name": "Helena Olsen"
-      }
-    ],
-    "greeting": "Hello, Bonita May! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 30,
-    "guid": "5976c515-a8ae-49d0-b77a-414864e1e424",
-    "isActive": true,
-    "balance": "$2,032.21",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "green",
-    "name": "Goff Wagner",
-    "gender": "male",
-    "company": "GOLISTIC",
-    "address": "309 Fillmore Place, Ilchester, Federated States Of Micronesia, 3517",
-    "about": "Incididunt aute aliqua aliqua anim elit excepteur cupidatat velit consectetur consequat enim magna. Mollit exercitation commodo ullamco elit nisi elit occaecat cupidatat tempor eu incididunt officia. Enim incididunt commodo duis exercitation amet pariatur id occaecat ad esse adipisicing amet amet. Fugiat quis proident ut do ex voluptate quis eiusmod duis magna adipisicing minim incididunt in. Adipisicing ut sint occaecat in amet excepteur esse elit. Elit deserunt sint id pariatur qui ullamco nisi qui mollit consectetur enim.\r\n",
-    "registered": "2014-04-06T08:43:16 -02:00",
-    "latitude": 11.274751,
-    "longitude": -102.837198,
-    "tags": [
-      "proident",
-      "qui",
-      "excepteur",
-      "consectetur",
-      "ex",
-      "enim",
-      "esse"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Blair Slater"
-      },
-      {
-        "id": 1,
-        "name": "Barron Clarke"
-      },
-      {
-        "id": 2,
-        "name": "Carlene Downs"
-      }
-    ],
-    "greeting": "Hello, Goff Wagner! You have 6 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 31,
-    "guid": "7c37f193-6655-40d6-b177-ba422cca5cf8",
-    "isActive": true,
-    "balance": "$1,525.95",
-    "picture": "http://placehold.it/32x32",
-    "age": 33,
-    "eyeColor": "brown",
-    "name": "Beck Wheeler",
-    "gender": "male",
-    "company": "TALKOLA",
-    "address": "508 Fleet Walk, Lynn, Ohio, 1714",
-    "about": "Anim do Lorem nostrud nostrud mollit exercitation ea eu dolor nostrud eu id aute officia. Cupidatat nulla elit labore dolor aliquip voluptate commodo officia laborum officia elit. Aute aute dolor aliquip voluptate aliquip veniam aliqua laboris sint labore enim ullamco amet. Nisi pariatur veniam nostrud dolore culpa velit amet adipisicing. Veniam duis culpa consectetur nostrud Lorem in deserunt non aliqua magna. Ullamco sunt esse ullamco nisi aliquip.\r\n",
-    "registered": "2014-03-03T20:19:26 -01:00",
-    "latitude": -27.251054,
-    "longitude": -143.224074,
-    "tags": [
-      "ipsum",
-      "officia",
-      "in",
-      "veniam",
-      "enim",
-      "dolor",
-      "dolore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Faith Dudley"
-      },
-      {
-        "id": 1,
-        "name": "Mccullough Moreno"
-      },
-      {
-        "id": 2,
-        "name": "Kendra Vinson"
-      }
-    ],
-    "greeting": "Hello, Beck Wheeler! You have 5 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 32,
-    "guid": "8bb5839f-0288-406e-81a1-cf56dff4a240",
-    "isActive": false,
-    "balance": "$2,084.46",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "green",
-    "name": "Sweeney Price",
-    "gender": "male",
-    "company": "INTERODEO",
-    "address": "752 Ruby Street, Carrizo, Puerto Rico, 9271",
-    "about": "Consectetur minim amet consectetur officia aliquip do minim aliquip enim non. Eiusmod velit laboris quis excepteur pariatur Lorem. Consectetur ut veniam laboris cillum sit mollit labore anim. Cupidatat incididunt reprehenderit aliqua aliqua dolore consectetur labore ut irure ea cupidatat. Occaecat aliqua commodo anim nostrud Lorem aute laborum. Dolor nulla in velit ut sint nostrud est aliquip reprehenderit. Laborum deserunt adipisicing ut do mollit eiusmod amet aliquip commodo sit eiusmod in sit.\r\n",
-    "registered": "2014-03-03T13:45:28 -01:00",
-    "latitude": 55.869764,
-    "longitude": -126.724059,
-    "tags": [
-      "dolore",
-      "amet",
-      "exercitation",
-      "minim",
-      "est",
-      "pariatur",
-      "minim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Guzman Obrien"
-      },
-      {
-        "id": 1,
-        "name": "Klein Hull"
-      },
-      {
-        "id": 2,
-        "name": "Carolyn Cote"
-      }
-    ],
-    "greeting": "Hello, Sweeney Price! You have 5 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 33,
-    "guid": "6c1285f6-8004-4095-adb1-d7c037ed9dbb",
-    "isActive": true,
-    "balance": "$1,767.71",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "blue",
-    "name": "Hester Hudson",
-    "gender": "female",
-    "company": "SCHOOLIO",
-    "address": "242 Stockton Street, Osage, North Dakota, 2563",
-    "about": "Velit laboris consequat occaecat nisi in dolor anim. Officia reprehenderit adipisicing veniam aliqua eu incididunt ea dolor fugiat. Incididunt enim fugiat cupidatat ex in pariatur commodo laboris eiusmod. Ea Lorem nisi ullamco anim irure voluptate sit quis mollit laborum culpa est nostrud ad.\r\n",
-    "registered": "2014-01-29T06:32:49 -01:00",
-    "latitude": -10.142657,
-    "longitude": 124.469651,
-    "tags": [
-      "id",
-      "excepteur",
-      "anim",
-      "fugiat",
-      "laboris",
-      "cillum",
-      "quis"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Ashley Ingram"
-      },
-      {
-        "id": 1,
-        "name": "Sanford Burch"
-      },
-      {
-        "id": 2,
-        "name": "Alissa Patton"
-      }
-    ],
-    "greeting": "Hello, Hester Hudson! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 34,
-    "guid": "4bbe270a-9c1f-4ade-bb8a-66f9fe8c749e",
-    "isActive": false,
-    "balance": "$3,319.98",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "blue",
-    "name": "Olivia Crawford",
-    "gender": "female",
-    "company": "GENMEX",
-    "address": "991 Sackman Street, Loomis, Alabama, 3695",
-    "about": "Nisi duis exercitation magna irure eu labore excepteur laborum eiusmod officia. Consectetur voluptate fugiat Lorem esse aute et voluptate est Lorem et consectetur ad officia in. Dolor cillum ut quis velit ex aliqua. Consectetur culpa et ea est ea aute minim aute dolore voluptate reprehenderit culpa et.\r\n",
-    "registered": "2014-05-22T00:50:41 -02:00",
-    "latitude": -56.429158,
-    "longitude": 178.492244,
-    "tags": [
-      "est",
-      "exercitation",
-      "in",
-      "velit",
-      "reprehenderit",
-      "aute",
-      "elit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Isabella Blake"
-      },
-      {
-        "id": 1,
-        "name": "Vang Joyce"
-      },
-      {
-        "id": 2,
-        "name": "Summer Decker"
-      }
-    ],
-    "greeting": "Hello, Olivia Crawford! You have 10 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 35,
-    "guid": "0ab363bf-4c03-48db-adb0-faad366c20e4",
-    "isActive": true,
-    "balance": "$2,149.37",
-    "picture": "http://placehold.it/32x32",
-    "age": 38,
-    "eyeColor": "green",
-    "name": "Mckenzie Webster",
-    "gender": "male",
-    "company": "MEDESIGN",
-    "address": "683 Rogers Avenue, Konterra, Illinois, 1618",
-    "about": "Proident ex deserunt magna proident et. Aliquip proident quis commodo dolore id. Anim magna aliqua ex exercitation aute ea veniam cillum. Proident ea mollit quis elit veniam ea eiusmod magna adipisicing deserunt laboris.\r\n",
-    "registered": "2014-06-04T06:19:10 -02:00",
-    "latitude": 28.679162,
-    "longitude": 154.902294,
-    "tags": [
-      "do",
-      "mollit",
-      "velit",
-      "pariatur",
-      "sint",
-      "enim",
-      "eu"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Singleton Beard"
-      },
-      {
-        "id": 1,
-        "name": "Alyssa Campbell"
-      },
-      {
-        "id": 2,
-        "name": "Silva Bradley"
-      }
-    ],
-    "greeting": "Hello, Mckenzie Webster! You have 3 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 36,
-    "guid": "d4808d32-dd3f-4b0a-8d26-2fb407b3be89",
-    "isActive": false,
-    "balance": "$2,093.99",
-    "picture": "http://placehold.it/32x32",
-    "age": 27,
-    "eyeColor": "brown",
-    "name": "Medina Allison",
-    "gender": "male",
-    "company": "GOGOL",
-    "address": "908 Meeker Avenue, Staples, Kentucky, 2317",
-    "about": "Et exercitation quis proident cillum exercitation ea pariatur reprehenderit fugiat. Excepteur nisi sit ex commodo consectetur aliqua laborum. Reprehenderit veniam elit duis quis anim incididunt sit incididunt cillum incididunt nisi laborum. Culpa et voluptate reprehenderit sint. Nostrud magna sint nisi deserunt aliqua. Do ex sit commodo pariatur esse magna ex laborum minim cupidatat esse ex enim.\r\n",
-    "registered": "2014-04-25T11:32:23 -02:00",
-    "latitude": 15.540005,
-    "longitude": 171.912163,
-    "tags": [
-      "exercitation",
-      "incididunt",
-      "eu",
-      "duis",
-      "ad",
-      "nisi",
-      "anim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bright Brewer"
-      },
-      {
-        "id": 1,
-        "name": "Ford Morales"
-      },
-      {
-        "id": 2,
-        "name": "Mcneil Jennings"
-      }
-    ],
-    "greeting": "Hello, Medina Allison! You have 6 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 37,
-    "guid": "3f27b5bd-fa52-4f74-a6b0-e661c76f36c5",
-    "isActive": true,
-    "balance": "$3,583.38",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "green",
-    "name": "Marie Hart",
-    "gender": "female",
-    "company": "ACCEL",
-    "address": "706 College Place, Hamilton, Virgin Islands, 427",
-    "about": "Consequat amet non ut sint reprehenderit est qui et incididunt pariatur reprehenderit. Incididunt in tempor reprehenderit labore ut cupidatat amet esse excepteur tempor. Nostrud anim incididunt anim aliquip minim non nisi nulla enim sint dolor mollit labore ut. Ea ut ipsum ea esse.\r\n",
-    "registered": "2014-04-20T04:58:55 -02:00",
-    "latitude": -52.403073,
-    "longitude": 73.448216,
-    "tags": [
-      "ex",
-      "sunt",
-      "consectetur",
-      "ea",
-      "aliqua",
-      "Lorem",
-      "magna"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Juliette Dotson"
-      },
-      {
-        "id": 1,
-        "name": "Candy Hubbard"
-      },
-      {
-        "id": 2,
-        "name": "Rene Mccullough"
-      }
-    ],
-    "greeting": "Hello, Marie Hart! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 38,
-    "guid": "6f54ed72-d1fe-48ec-87c8-2e6ad8b4616f",
-    "isActive": false,
-    "balance": "$2,713.41",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "brown",
-    "name": "Rivers Shaw",
-    "gender": "male",
-    "company": "BLEEKO",
-    "address": "185 Hyman Court, Helen, South Carolina, 4565",
-    "about": "Ex deserunt et aliquip fugiat ex proident. Enim cillum excepteur cillum nisi mollit dolor nisi sit quis duis fugiat sunt. Nostrud ullamco sunt et commodo incididunt ea aliquip ipsum. Proident pariatur laboris id quis aliquip duis eu amet aliqua.\r\n",
-    "registered": "2014-06-01T22:08:38 -02:00",
-    "latitude": -34.060426,
-    "longitude": 91.269928,
-    "tags": [
-      "dolor",
-      "consequat",
-      "labore",
-      "Lorem",
-      "reprehenderit",
-      "magna",
-      "laboris"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Alisa Bender"
-      },
-      {
-        "id": 1,
-        "name": "Audrey Nolan"
-      },
-      {
-        "id": 2,
-        "name": "Schwartz Best"
-      }
-    ],
-    "greeting": "Hello, Rivers Shaw! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 39,
-    "guid": "e6c275c7-2f38-4e88-aa71-bb160a2dab86",
-    "isActive": false,
-    "balance": "$3,228.16",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Carroll Skinner",
-    "gender": "male",
-    "company": "HATOLOGY",
-    "address": "166 Seigel Court, Movico, Hawaii, 4303",
-    "about": "Nostrud veniam pariatur id nostrud do amet qui magna non eu nulla voluptate dolore. Laborum nulla id minim dolore occaecat consequat eiusmod veniam sit quis mollit. Ullamco cillum voluptate duis sit qui ea anim sint velit et reprehenderit culpa occaecat. Dolore aute ullamco mollit laborum fugiat proident mollit irure minim incididunt esse anim. Laboris non consectetur adipisicing nisi aliquip nulla labore magna elit elit laborum quis fugiat. Dolore labore do proident aute dolore. Occaecat amet quis eiusmod in pariatur adipisicing esse.\r\n",
-    "registered": "2014-06-28T17:06:42 -02:00",
-    "latitude": 63.608522,
-    "longitude": -162.514038,
-    "tags": [
-      "nulla",
-      "ea",
-      "Lorem",
-      "reprehenderit",
-      "aliquip",
-      "esse",
-      "labore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Huber Stark"
-      },
-      {
-        "id": 1,
-        "name": "Joann Roach"
-      },
-      {
-        "id": 2,
-        "name": "Dena Frederick"
-      }
-    ],
-    "greeting": "Hello, Carroll Skinner! You have 3 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 40,
-    "guid": "896c4bcf-5c37-4383-9d24-fc6a0514d740",
-    "isActive": false,
-    "balance": "$1,460.13",
-    "picture": "http://placehold.it/32x32",
-    "age": 29,
-    "eyeColor": "brown",
-    "name": "Margo Hodge",
-    "gender": "female",
-    "company": "STUCCO",
-    "address": "875 Woodhull Street, Wolcott, Virginia, 5819",
-    "about": "Occaecat incididunt culpa commodo pariatur sint adipisicing labore dolor nisi id tempor. Et non aliqua minim amet nostrud Lorem. Duis id eiusmod dolore anim in incididunt sit enim. Labore ex Lorem laborum incididunt adipisicing dolore eu ad reprehenderit. Aliquip do sint mollit sunt. Amet sit cupidatat reprehenderit do ipsum consectetur occaecat enim aliquip labore.\r\n",
-    "registered": "2014-01-20T03:30:44 -01:00",
-    "latitude": 84.862021,
-    "longitude": -54.299052,
-    "tags": [
-      "laborum",
-      "fugiat",
-      "est",
-      "et",
-      "quis",
-      "qui",
-      "consectetur"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Bond Black"
-      },
-      {
-        "id": 1,
-        "name": "Madeline Calderon"
-      },
-      {
-        "id": 2,
-        "name": "Rosalinda Mcintyre"
-      }
-    ],
-    "greeting": "Hello, Margo Hodge! You have 3 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 41,
-    "guid": "6d8e9b06-15fe-4079-b04c-2c1db244b689",
-    "isActive": false,
-    "balance": "$1,392.09",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "green",
-    "name": "Karin Valentine",
-    "gender": "female",
-    "company": "SULTRAX",
-    "address": "237 Sedgwick Place, Greenbackville, Texas, 9939",
-    "about": "Sint quis ullamco aute ullamco pariatur non ea fugiat. Magna dolore est eiusmod culpa sit id magna occaecat. Do sit ad eu sit fugiat exercitation elit mollit cupidatat anim cupidatat deserunt. Dolor in officia do exercitation. Enim ut id ad fugiat deserunt amet nisi deserunt enim.\r\n",
-    "registered": "2014-03-30T05:25:09 -02:00",
-    "latitude": 9.262507,
-    "longitude": 117.286584,
-    "tags": [
-      "qui",
-      "eu",
-      "laborum",
-      "sint",
-      "do",
-      "nulla",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lorraine Blair"
-      },
-      {
-        "id": 1,
-        "name": "Evangeline Larsen"
-      },
-      {
-        "id": 2,
-        "name": "Lorena Clemons"
-      }
-    ],
-    "greeting": "Hello, Karin Valentine! You have 9 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 42,
-    "guid": "38619f1c-a756-4421-97e4-036135479015",
-    "isActive": false,
-    "balance": "$1,693.29",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "brown",
-    "name": "Cassie Wall",
-    "gender": "female",
-    "company": "GEEKUS",
-    "address": "354 Vanderveer Street, Caledonia, Florida, 3586",
-    "about": "Dolore deserunt irure incididunt sunt exercitation sunt veniam eu sit dolore amet qui proident. Non ex occaecat occaecat id consectetur ad. Quis non reprehenderit proident velit consequat esse ex ut.\r\n",
-    "registered": "2014-03-26T00:58:41 -01:00",
-    "latitude": -84.908385,
-    "longitude": 103.025855,
-    "tags": [
-      "reprehenderit",
-      "consectetur",
-      "qui",
-      "sit",
-      "id",
-      "cupidatat",
-      "cillum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Eleanor Levy"
-      },
-      {
-        "id": 1,
-        "name": "Lilia Hernandez"
-      },
-      {
-        "id": 2,
-        "name": "Blankenship Whitley"
-      }
-    ],
-    "greeting": "Hello, Cassie Wall! You have 2 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 43,
-    "guid": "422015df-cf61-4eb1-9f64-c879a807c99a",
-    "isActive": true,
-    "balance": "$2,961.09",
-    "picture": "http://placehold.it/32x32",
-    "age": 21,
-    "eyeColor": "brown",
-    "name": "Ethel Blankenship",
-    "gender": "female",
-    "company": "ZOARERE",
-    "address": "293 McClancy Place, Connerton, Massachusetts, 1148",
-    "about": "Qui veniam aliquip nulla sit id incididunt. Occaecat cillum et officia elit Lorem deserunt ad adipisicing. Amet ad nulla nisi proident nisi consequat et tempor ipsum est elit adipisicing duis.\r\n",
-    "registered": "2014-06-08T01:34:19 -02:00",
-    "latitude": 54.689311,
-    "longitude": -36.775522,
-    "tags": [
-      "voluptate",
-      "et",
-      "est",
-      "id",
-      "duis",
-      "pariatur",
-      "officia"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Russell Austin"
-      },
-      {
-        "id": 1,
-        "name": "Cindy Newman"
-      },
-      {
-        "id": 2,
-        "name": "Austin Rodriguez"
-      }
-    ],
-    "greeting": "Hello, Ethel Blankenship! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 44,
-    "guid": "879eaa87-d6d0-401d-93da-0dcc491dec20",
-    "isActive": false,
-    "balance": "$1,007.45",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "blue",
-    "name": "Dianne Holden",
-    "gender": "female",
-    "company": "ZILLACON",
-    "address": "159 Schenck Court, Rivers, New Jersey, 1139",
-    "about": "Nostrud excepteur velit dolor non fugiat minim veniam do amet id. Duis in velit commodo dolor eu ipsum velit. Dolore magna quis est labore dolore et magna nisi excepteur adipisicing consequat adipisicing commodo amet. Nisi nulla irure culpa proident consequat in eiusmod. Quis do laboris magna cillum ullamco velit consectetur pariatur.\r\n",
-    "registered": "2014-06-15T13:11:26 -02:00",
-    "latitude": 84.321706,
-    "longitude": 50.249891,
-    "tags": [
-      "consequat",
-      "exercitation",
-      "anim",
-      "officia",
-      "sunt",
-      "veniam",
-      "dolor"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Rosetta Dunn"
-      },
-      {
-        "id": 1,
-        "name": "Elena Mendoza"
-      },
-      {
-        "id": 2,
-        "name": "Hawkins Hunt"
-      }
-    ],
-    "greeting": "Hello, Dianne Holden! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 45,
-    "guid": "1ccb20cc-9c68-4e16-9718-1b0545da9627",
-    "isActive": false,
-    "balance": "$2,734.76",
-    "picture": "http://placehold.it/32x32",
-    "age": 28,
-    "eyeColor": "green",
-    "name": "Sue Dunlap",
-    "gender": "female",
-    "company": "ENDIPINE",
-    "address": "598 Homecrest Avenue, Cassel, Rhode Island, 472",
-    "about": "Deserunt excepteur commodo cupidatat enim. Pariatur culpa amet fugiat esse adipisicing ea velit officia dolore dolore aliquip fugiat. Nostrud culpa duis ea dolor cupidatat ex pariatur aliquip labore aute.\r\n",
-    "registered": "2014-04-16T17:03:05 -02:00",
-    "latitude": 43.41206,
-    "longitude": -11.203221,
-    "tags": [
-      "tempor",
-      "ea",
-      "nostrud",
-      "voluptate",
-      "enim",
-      "deserunt",
-      "occaecat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Tricia Acosta"
-      },
-      {
-        "id": 1,
-        "name": "Delores Carson"
-      },
-      {
-        "id": 2,
-        "name": "Cooper Lloyd"
-      }
-    ],
-    "greeting": "Hello, Sue Dunlap! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 46,
-    "guid": "c10ebebb-0fde-4db5-ae42-ba033def4496",
-    "isActive": true,
-    "balance": "$2,543.38",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "blue",
-    "name": "Lisa Noble",
-    "gender": "female",
-    "company": "ZEAM",
-    "address": "828 Preston Court, Jacumba, Utah, 2163",
-    "about": "Laborum laborum occaecat ipsum quis eiusmod laborum ex incididunt eiusmod aute deserunt. Lorem exercitation reprehenderit dolore minim cillum veniam. Ex deserunt eiusmod adipisicing sit anim ex incididunt amet. Lorem labore cupidatat voluptate elit non ullamco veniam ad anim fugiat duis. Est esse nisi labore nisi nulla non elit enim qui eu veniam cillum. Lorem sit veniam laboris magna velit. Ut id nisi eu occaecat excepteur ullamco sint in aliquip excepteur deserunt ullamco do proident.\r\n",
-    "registered": "2014-02-26T22:35:07 -01:00",
-    "latitude": -64.554206,
-    "longitude": -140.668077,
-    "tags": [
-      "eu",
-      "occaecat",
-      "ipsum",
-      "reprehenderit",
-      "occaecat",
-      "officia",
-      "culpa"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Nelda Petersen"
-      },
-      {
-        "id": 1,
-        "name": "Roseann Dominguez"
-      },
-      {
-        "id": 2,
-        "name": "Estelle Duffy"
-      }
-    ],
-    "greeting": "Hello, Lisa Noble! You have 10 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 47,
-    "guid": "98bf2a04-1d75-476e-bb11-8678ca8dfd60",
-    "isActive": true,
-    "balance": "$2,386.50",
-    "picture": "http://placehold.it/32x32",
-    "age": 24,
-    "eyeColor": "green",
-    "name": "Lorna Pace",
-    "gender": "female",
-    "company": "KOZGENE",
-    "address": "263 Wyona Street, Mathews, Indiana, 1038",
-    "about": "Minim dolore in elit nostrud officia fugiat ipsum non. Adipisicing voluptate non dolor ea Lorem exercitation minim pariatur ad veniam voluptate laborum. Id in cillum adipisicing eiusmod ad non nisi officia amet proident aliquip. Cillum labore duis labore elit commodo reprehenderit id fugiat do. Eu non consectetur mollit minim et tempor enim consequat amet aliqua.\r\n",
-    "registered": "2014-05-19T09:58:30 -02:00",
-    "latitude": 12.905025,
-    "longitude": 43.642016,
-    "tags": [
-      "magna",
-      "deserunt",
-      "consequat",
-      "consequat",
-      "ea",
-      "nostrud",
-      "reprehenderit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lorie Potter"
-      },
-      {
-        "id": 1,
-        "name": "Felecia Lowe"
-      },
-      {
-        "id": 2,
-        "name": "Johnnie Barron"
-      }
-    ],
-    "greeting": "Hello, Lorna Pace! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 48,
-    "guid": "917a9831-47f3-42b9-a4f2-dfbe65b58138",
-    "isActive": true,
-    "balance": "$2,192.35",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "blue",
-    "name": "June Thomas",
-    "gender": "female",
-    "company": "REMOLD",
-    "address": "522 Wakeman Place, Diaperville, Wyoming, 2277",
-    "about": "Nostrud eiusmod veniam do esse ullamco officia excepteur eiusmod excepteur cupidatat non consectetur aute anim. Eu reprehenderit ullamco sint eiusmod ipsum ut mollit nisi consequat id cillum. Sunt nisi ullamco nulla est. Sit non velit esse ullamco ex laboris cupidatat mollit. Commodo nostrud est fugiat duis veniam nulla adipisicing cupidatat nostrud. Consectetur do culpa deserunt excepteur culpa irure eiusmod qui deserunt minim duis qui. Dolor nostrud cupidatat ullamco minim nostrud irure ad nostrud.\r\n",
-    "registered": "2014-07-03T14:39:07 -02:00",
-    "latitude": 5.921333,
-    "longitude": 50.290757,
-    "tags": [
-      "duis",
-      "sit",
-      "labore",
-      "occaecat",
-      "occaecat",
-      "officia",
-      "est"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Salazar Miles"
-      },
-      {
-        "id": 1,
-        "name": "Gilmore Sanford"
-      },
-      {
-        "id": 2,
-        "name": "Kidd Winters"
-      }
-    ],
-    "greeting": "Hello, June Thomas! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 49,
-    "guid": "38eb16a4-a22d-4c91-964c-1e837f9f93e0",
-    "isActive": false,
-    "balance": "$1,832.55",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "brown",
-    "name": "Karina Farmer",
-    "gender": "female",
-    "company": "HIVEDOM",
-    "address": "960 Seeley Street, Chilton, Oklahoma, 8105",
-    "about": "Reprehenderit nostrud ipsum ut minim nostrud nostrud. Officia labore ex dolor aute Lorem reprehenderit quis ut adipisicing do. Commodo nostrud est esse aute cupidatat sunt do. Qui nulla fugiat laboris sunt irure nostrud do. Aliqua aliquip velit reprehenderit duis dolor id amet adipisicing amet laborum culpa. Incididunt pariatur eu cillum deserunt. Esse qui aliqua labore magna.\r\n",
-    "registered": "2014-05-28T19:56:58 -02:00",
-    "latitude": 55.339619,
-    "longitude": -13.026128,
-    "tags": [
-      "esse",
-      "commodo",
-      "id",
-      "eu",
-      "sint",
-      "eiusmod",
-      "Lorem"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Leanne Blanchard"
-      },
-      {
-        "id": 1,
-        "name": "Hewitt Pope"
-      },
-      {
-        "id": 2,
-        "name": "Tania Whitehead"
-      }
-    ],
-    "greeting": "Hello, Karina Farmer! You have 3 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 50,
-    "guid": "727c20b3-f9e2-42e2-870c-68690e08faf9",
-    "isActive": false,
-    "balance": "$3,492.61",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "brown",
-    "name": "Lowe Oconnor",
-    "gender": "male",
-    "company": "EXTREMO",
-    "address": "314 Hornell Loop, Fivepointville, New Mexico, 5677",
-    "about": "Labore duis nostrud culpa anim minim proident culpa adipisicing nostrud laboris. Sunt fugiat incididunt cillum veniam reprehenderit do sunt cillum culpa velit dolore aute. Eu est nisi do ullamco ut laborum culpa ut.\r\n",
-    "registered": "2014-06-29T12:30:34 -02:00",
-    "latitude": -53.458212,
-    "longitude": 86.662897,
-    "tags": [
-      "duis",
-      "labore",
-      "nulla",
-      "velit",
-      "consequat",
-      "duis",
-      "culpa"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Miriam Barrett"
-      },
-      {
-        "id": 1,
-        "name": "Mariana Foster"
-      },
-      {
-        "id": 2,
-        "name": "Bell Boyle"
-      }
-    ],
-    "greeting": "Hello, Lowe Oconnor! You have 9 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 51,
-    "guid": "104a877b-ca13-4a61-b37b-7a6c71c8ccf2",
-    "isActive": true,
-    "balance": "$3,195.23",
-    "picture": "http://placehold.it/32x32",
-    "age": 25,
-    "eyeColor": "brown",
-    "name": "Dawson Huff",
-    "gender": "male",
-    "company": "PIGZART",
-    "address": "594 Bainbridge Street, Lutsen, Idaho, 8565",
-    "about": "Ad occaecat anim mollit officia veniam. Et labore occaecat commodo ullamco occaecat ea irure veniam. Sunt non tempor cillum eiusmod nulla aliquip sunt cillum cillum magna ex in sunt. Ipsum proident laboris occaecat sunt ullamco incididunt esse sint cupidatat sit aliquip magna enim duis.\r\n",
-    "registered": "2014-01-16T01:43:16 -01:00",
-    "latitude": 70.453632,
-    "longitude": 47.933963,
-    "tags": [
-      "officia",
-      "minim",
-      "cupidatat",
-      "mollit",
-      "sit",
-      "aliquip",
-      "laborum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Sherrie Burton"
-      },
-      {
-        "id": 1,
-        "name": "Catherine Heath"
-      },
-      {
-        "id": 2,
-        "name": "Wiggins Simon"
-      }
-    ],
-    "greeting": "Hello, Dawson Huff! You have 4 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 52,
-    "guid": "dabbe950-4329-4d0d-8b4a-6347c6c78819",
-    "isActive": true,
-    "balance": "$2,642.41",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Stanley Battle",
-    "gender": "male",
-    "company": "KNOWLYSIS",
-    "address": "387 Seigel Street, Soudan, New Hampshire, 3260",
-    "about": "Laboris ad velit Lorem consectetur. Dolor commodo qui excepteur consectetur ullamco ex eiusmod fugiat sit voluptate. Consectetur voluptate tempor irure veniam exercitation. Reprehenderit consequat consequat elit magna duis mollit ea aute velit ut Lorem. Officia nulla in eu esse.\r\n",
-    "registered": "2014-04-10T22:58:50 -02:00",
-    "latitude": 15.553241,
-    "longitude": -54.014355,
-    "tags": [
-      "nostrud",
-      "adipisicing",
-      "ea",
-      "ipsum",
-      "non",
-      "sit",
-      "qui"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Foley Browning"
-      },
-      {
-        "id": 1,
-        "name": "Tanya Carter"
-      },
-      {
-        "id": 2,
-        "name": "Cristina Franks"
-      }
-    ],
-    "greeting": "Hello, Stanley Battle! You have 3 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 53,
-    "guid": "ce404d5c-c220-4f5f-a24b-5c7e2f977695",
-    "isActive": false,
-    "balance": "$1,170.32",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "blue",
-    "name": "Simon Dejesus",
-    "gender": "male",
-    "company": "ZORROMOP",
-    "address": "313 Vandalia Avenue, Riegelwood, Montana, 6891",
-    "about": "Nulla officia reprehenderit aute commodo aliqua consequat. Lorem sunt labore minim enim non velit ut veniam pariatur. Sunt laboris culpa quis nostrud consectetur elit non. Adipisicing sunt nulla id sint excepteur. Sit non velit irure anim ipsum ipsum sit id aliquip do dolor est.\r\n",
-    "registered": "2014-03-15T20:38:08 -01:00",
-    "latitude": 53.159309,
-    "longitude": 168.193975,
-    "tags": [
-      "occaecat",
-      "est",
-      "aliquip",
-      "consequat",
-      "ullamco",
-      "commodo",
-      "fugiat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Fuller Vega"
-      },
-      {
-        "id": 1,
-        "name": "Murphy Cline"
-      },
-      {
-        "id": 2,
-        "name": "Valenzuela Gibson"
-      }
-    ],
-    "greeting": "Hello, Simon Dejesus! You have 5 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 54,
-    "guid": "6a89ea8d-e467-4f86-b969-1d60dfc910ad",
-    "isActive": true,
-    "balance": "$2,274.00",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "blue",
-    "name": "Kathie Buchanan",
-    "gender": "female",
-    "company": "CAPSCREEN",
-    "address": "421 Erasmus Street, Terlingua, South Dakota, 1633",
-    "about": "Quis laborum elit Lorem velit mollit quis laborum ex minim incididunt ut voluptate. Et proident ullamco sit fugiat voluptate incididunt incididunt aute ullamco eu amet veniam velit. Consectetur ad veniam laboris ipsum sunt dolor. Et esse amet consectetur laborum ullamco ad. Eu sunt mollit et Lorem officia incididunt occaecat dolore eiusmod ullamco quis ex pariatur. Exercitation exercitation amet tempor do labore aliqua aliqua cillum voluptate aliquip consequat pariatur commodo.\r\n",
-    "registered": "2014-05-27T07:01:26 -02:00",
-    "latitude": 58.409325,
-    "longitude": -112.833935,
-    "tags": [
-      "eu",
-      "consectetur",
-      "dolor",
-      "Lorem",
-      "sunt",
-      "velit",
-      "adipisicing"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Stephens Hardy"
-      },
-      {
-        "id": 1,
-        "name": "Ernestine Garza"
-      },
-      {
-        "id": 2,
-        "name": "Byrd Tate"
-      }
-    ],
-    "greeting": "Hello, Kathie Buchanan! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 55,
-    "guid": "5211dbae-79fe-47fa-afc9-9e8d9bffa363",
-    "isActive": false,
-    "balance": "$2,061.63",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "brown",
-    "name": "Terrell Moon",
-    "gender": "male",
-    "company": "JUNIPOOR",
-    "address": "177 Waldorf Court, Munjor, New York, 2032",
-    "about": "Non sit eu eiusmod occaecat anim ipsum incididunt dolor. Lorem enim dolore id ut est pariatur sit commodo minim exercitation qui sint. Deserunt exercitation do non sit veniam commodo anim sit enim dolore dolore laborum labore. Fugiat excepteur nisi excepteur nostrud aliquip eu exercitation eiusmod laboris sunt.\r\n",
-    "registered": "2014-07-04T17:41:24 -02:00",
-    "latitude": 88.790349,
-    "longitude": -66.724457,
-    "tags": [
-      "tempor",
-      "occaecat",
-      "amet",
-      "est",
-      "non",
-      "pariatur",
-      "occaecat"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Shari Howe"
-      },
-      {
-        "id": 1,
-        "name": "Kristina Pugh"
-      },
-      {
-        "id": 2,
-        "name": "Bonnie Dodson"
-      }
-    ],
-    "greeting": "Hello, Terrell Moon! You have 2 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 56,
-    "guid": "4d58f552-95bb-470b-b496-0c8d85ffee3d",
-    "isActive": true,
-    "balance": "$1,681.61",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "blue",
-    "name": "Madge Powers",
-    "gender": "female",
-    "company": "GEOLOGIX",
-    "address": "221 Columbia Street, Gilmore, Georgia, 1451",
-    "about": "Lorem mollit consectetur dolore cillum sunt minim fugiat aliqua ex irure commodo ad. Culpa incididunt deserunt enim cupidatat sunt fugiat quis velit proident. Occaecat sit aliqua est incididunt velit laborum duis consequat est. Dolor aliquip quis et dolor cillum deserunt quis nisi exercitation aute incididunt adipisicing. Adipisicing nisi dolore adipisicing culpa dolor amet adipisicing fugiat anim. Voluptate nostrud laboris consequat cupidatat irure sunt. Et reprehenderit et officia reprehenderit.\r\n",
-    "registered": "2014-04-30T21:19:21 -02:00",
-    "latitude": -1.944055,
-    "longitude": -82.153837,
-    "tags": [
-      "ipsum",
-      "reprehenderit",
-      "et",
-      "quis",
-      "mollit",
-      "deserunt",
-      "dolore"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Carter Mcgowan"
-      },
-      {
-        "id": 1,
-        "name": "Hunter Kirk"
-      },
-      {
-        "id": 2,
-        "name": "Eloise Henson"
-      }
-    ],
-    "greeting": "Hello, Madge Powers! You have 4 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 57,
-    "guid": "f92640b6-4c03-43ba-9c4e-3ecb93074f0a",
-    "isActive": true,
-    "balance": "$3,872.97",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "green",
-    "name": "Franklin Haynes",
-    "gender": "male",
-    "company": "COMTRACT",
-    "address": "826 Belvidere Street, Kansas, Oregon, 1864",
-    "about": "Deserunt voluptate eu do minim. Laboris duis incididunt nostrud laboris in nisi aute. In eiusmod irure consectetur in culpa Lorem labore nulla dolore nisi voluptate deserunt pariatur. Duis ullamco ad mollit voluptate magna nulla Lorem ullamco incididunt. Laboris velit exercitation tempor commodo officia dolore est nulla fugiat occaecat. Nostrud deserunt consectetur Lorem fugiat Lorem irure.\r\n",
-    "registered": "2014-06-14T14:34:37 -02:00",
-    "latitude": 20.753273,
-    "longitude": 14.015592,
-    "tags": [
-      "ut",
-      "fugiat",
-      "eiusmod",
-      "dolore",
-      "sit",
-      "in",
-      "esse"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Fowler Sweeney"
-      },
-      {
-        "id": 1,
-        "name": "Cherry Drake"
-      },
-      {
-        "id": 2,
-        "name": "Reilly Valenzuela"
-      }
-    ],
-    "greeting": "Hello, Franklin Haynes! You have 1 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 58,
-    "guid": "9d4cc0cb-1ab7-42c6-88ad-47343d92373e",
-    "isActive": true,
-    "balance": "$3,619.36",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Wilma Hancock",
-    "gender": "female",
-    "company": "AMTAP",
-    "address": "722 Hutchinson Court, Logan, Louisiana, 2832",
-    "about": "Consequat enim occaecat eu ad deserunt elit irure nulla velit deserunt do. Consectetur ut ea esse Lorem eiusmod deserunt id amet sit cillum anim. Do laborum enim incididunt quis duis occaecat aliqua elit anim labore irure tempor eu. Consequat proident nisi do ullamco officia officia mollit officia minim. Consequat cillum sunt est consectetur in incididunt cillum elit eu et.\r\n",
-    "registered": "2014-05-18T03:52:17 -02:00",
-    "latitude": 37.850872,
-    "longitude": -116.495446,
-    "tags": [
-      "et",
-      "officia",
-      "elit",
-      "officia",
-      "pariatur",
-      "fugiat",
-      "ipsum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Rogers Wise"
-      },
-      {
-        "id": 1,
-        "name": "Mclean Russell"
-      },
-      {
-        "id": 2,
-        "name": "Jodi Hayes"
-      }
-    ],
-    "greeting": "Hello, Wilma Hancock! You have 2 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 59,
-    "guid": "d0d76369-0bb1-4abf-8bb2-55e8e883d022",
-    "isActive": false,
-    "balance": "$1,980.73",
-    "picture": "http://placehold.it/32x32",
-    "age": 31,
-    "eyeColor": "green",
-    "name": "Julia Mcneil",
-    "gender": "female",
-    "company": "ZILLIDIUM",
-    "address": "840 Roebling Street, Shawmut, Missouri, 5915",
-    "about": "Est consequat velit sint incididunt ullamco labore eu sint laborum nisi commodo. Proident nostrud aliqua minim in officia dolore. Exercitation cillum mollit aute nostrud aliqua quis eiusmod commodo est veniam. In cillum mollit amet nisi velit deserunt nostrud consectetur.\r\n",
-    "registered": "2014-05-23T05:45:31 -02:00",
-    "latitude": -78.799731,
-    "longitude": 171.839554,
-    "tags": [
-      "nisi",
-      "tempor",
-      "duis",
-      "ullamco",
-      "commodo",
-      "ea",
-      "elit"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Cheri Finley"
-      },
-      {
-        "id": 1,
-        "name": "Tracey Reid"
-      },
-      {
-        "id": 2,
-        "name": "Johanna Holmes"
-      }
-    ],
-    "greeting": "Hello, Julia Mcneil! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 60,
-    "guid": "46796ff9-ba41-4112-84d9-8ede6c16b0e0",
-    "isActive": false,
-    "balance": "$3,807.45",
-    "picture": "http://placehold.it/32x32",
-    "age": 20,
-    "eyeColor": "blue",
-    "name": "Petersen Little",
-    "gender": "male",
-    "company": "ISOLOGICS",
-    "address": "529 Crawford Avenue, Talpa, Arkansas, 8482",
-    "about": "Ipsum sint laborum do ad laboris duis. Et nisi non dolor sunt minim ut irure ad deserunt sunt. Veniam commodo aliquip esse laborum est culpa laboris proident sint labore Lorem do. Aliqua minim consectetur duis occaecat.\r\n",
-    "registered": "2014-04-29T07:18:35 -02:00",
-    "latitude": -61.488678,
-    "longitude": -47.406844,
-    "tags": [
-      "ad",
-      "aute",
-      "veniam",
-      "minim",
-      "aliquip",
-      "nostrud",
-      "enim"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Shannon Mcmillan"
-      },
-      {
-        "id": 1,
-        "name": "Weber Molina"
-      },
-      {
-        "id": 2,
-        "name": "Coleen Harrell"
-      }
-    ],
-    "greeting": "Hello, Petersen Little! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 61,
-    "guid": "3b4ec54b-578a-4365-9b20-afd4889e790c",
-    "isActive": false,
-    "balance": "$3,426.02",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Vasquez Conway",
-    "gender": "male",
-    "company": "APEX",
-    "address": "893 Conway Street, Maplewood, California, 2073",
-    "about": "Cillum occaecat ullamco proident qui irure est eu excepteur adipisicing. Duis exercitation veniam officia in nostrud adipisicing nisi quis officia. Anim ex qui Lorem ipsum consequat consequat. Voluptate nisi cupidatat commodo non incididunt cillum irure ea nulla reprehenderit occaecat do pariatur. Officia commodo adipisicing esse sint officia eu deserunt adipisicing enim sint duis pariatur. Mollit fugiat esse aliqua Lorem ipsum do elit adipisicing sunt qui elit ullamco. Mollit sunt tempor sit commodo Lorem nisi sit.\r\n",
-    "registered": "2014-06-12T17:53:51 -02:00",
-    "latitude": -26.144058,
-    "longitude": 42.793761,
-    "tags": [
-      "magna",
-      "ullamco",
-      "ad",
-      "ad",
-      "duis",
-      "elit",
-      "aute"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Alexander Cantrell"
-      },
-      {
-        "id": 1,
-        "name": "Roberson Jenkins"
-      },
-      {
-        "id": 2,
-        "name": "Mckay Simpson"
-      }
-    ],
-    "greeting": "Hello, Vasquez Conway! You have 8 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 62,
-    "guid": "bb44a2c9-f738-40f0-9735-d2e54e5c1bd8",
-    "isActive": false,
-    "balance": "$1,646.99",
-    "picture": "http://placehold.it/32x32",
-    "age": 35,
-    "eyeColor": "green",
-    "name": "Corina Dawson",
-    "gender": "female",
-    "company": "ORBALIX",
-    "address": "373 Sumpter Street, Osmond, Kansas, 2807",
-    "about": "Eiusmod nulla cillum excepteur quis cupidatat dolor non et et proident veniam. Tempor quis labore do veniam culpa id. Do commodo exercitation tempor nulla sit adipisicing veniam pariatur sit elit consectetur minim dolor. Excepteur ullamco fugiat Lorem eiusmod velit ipsum elit. Consequat amet sit reprehenderit minim tempor et pariatur nulla aliqua aliquip eiusmod.\r\n",
-    "registered": "2014-03-05T14:11:03 -01:00",
-    "latitude": -29.003709,
-    "longitude": -102.5479,
-    "tags": [
-      "do",
-      "adipisicing",
-      "fugiat",
-      "fugiat",
-      "tempor",
-      "deserunt",
-      "magna"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Berger Weaver"
-      },
-      {
-        "id": 1,
-        "name": "Sherman Donaldson"
-      },
-      {
-        "id": 2,
-        "name": "Marlene Fletcher"
-      }
-    ],
-    "greeting": "Hello, Corina Dawson! You have 5 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 63,
-    "guid": "02f59ed2-478c-462d-ae39-4c2dc54302bf",
-    "isActive": true,
-    "balance": "$1,643.57",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "blue",
-    "name": "Santiago Watkins",
-    "gender": "male",
-    "company": "EARTHPURE",
-    "address": "669 Marconi Place, Martinez, Maine, 4435",
-    "about": "Irure excepteur adipisicing velit et nostrud id. Amet in do eiusmod nisi. Mollit non do et commodo aute commodo tempor.\r\n",
-    "registered": "2014-01-23T23:05:14 -01:00",
-    "latitude": 33.768471,
-    "longitude": -37.890824,
-    "tags": [
-      "esse",
-      "mollit",
-      "ea",
-      "commodo",
-      "proident",
-      "est",
-      "irure"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Frances Mcdaniel"
-      },
-      {
-        "id": 1,
-        "name": "Travis Kennedy"
-      },
-      {
-        "id": 2,
-        "name": "Wolf Hicks"
-      }
-    ],
-    "greeting": "Hello, Santiago Watkins! You have 3 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 64,
-    "guid": "ee9814aa-b2fd-48ab-80f3-8ecb50dccd6a",
-    "isActive": false,
-    "balance": "$1,623.55",
-    "picture": "http://placehold.it/32x32",
-    "age": 39,
-    "eyeColor": "green",
-    "name": "Sophia Perez",
-    "gender": "female",
-    "company": "COMSTRUCT",
-    "address": "147 Lott Avenue, Lisco, Northern Mariana Islands, 7673",
-    "about": "Lorem occaecat non cillum ea consectetur occaecat. Id officia elit sit aliquip ad consectetur. Labore officia amet do mollit amet exercitation nostrud veniam consectetur amet et deserunt voluptate. Qui anim amet deserunt fugiat nulla nulla exercitation ad enim duis. In proident sit ullamco aliqua ullamco nostrud amet labore cillum eu ex.\r\n",
-    "registered": "2014-05-24T01:37:33 -02:00",
-    "latitude": -39.951198,
-    "longitude": 159.105686,
-    "tags": [
-      "ex",
-      "incididunt",
-      "occaecat",
-      "labore",
-      "tempor",
-      "deserunt",
-      "sunt"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Suzette Schroeder"
-      },
-      {
-        "id": 1,
-        "name": "Dawn Mcpherson"
-      },
-      {
-        "id": 2,
-        "name": "Holloway Shields"
-      }
-    ],
-    "greeting": "Hello, Sophia Perez! You have 1 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 65,
-    "guid": "d6e8b50e-1795-4cf6-92a5-60f109d9357c",
-    "isActive": false,
-    "balance": "$3,260.19",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "brown",
-    "name": "Hoffman Petty",
-    "gender": "male",
-    "company": "EQUITOX",
-    "address": "913 Harden Street, Nogal, Guam, 9010",
-    "about": "Culpa ea deserunt quis minim mollit esse do amet elit. Culpa dolor commodo nostrud in pariatur exercitation aliqua commodo. Magna laborum ea deserunt consectetur occaecat adipisicing eiusmod. Reprehenderit laboris sit id anim minim duis id ullamco et tempor ullamco eu ex. Eu minim dolor qui ipsum culpa ullamco dolor eu cillum.\r\n",
-    "registered": "2014-04-14T03:03:39 -02:00",
-    "latitude": 62.974089,
-    "longitude": 9.8346,
-    "tags": [
-      "quis",
-      "sit",
-      "labore",
-      "exercitation",
-      "eu",
-      "est",
-      "cillum"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lydia Rosario"
-      },
-      {
-        "id": 1,
-        "name": "Kristen Smith"
-      },
-      {
-        "id": 2,
-        "name": "Leonor Kelley"
-      }
-    ],
-    "greeting": "Hello, Hoffman Petty! You have 3 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 66,
-    "guid": "533759a6-e7ca-4ce4-aa26-1c4da8ff04b4",
-    "isActive": false,
-    "balance": "$2,221.61",
-    "picture": "http://placehold.it/32x32",
-    "age": 34,
-    "eyeColor": "blue",
-    "name": "Flossie Hess",
-    "gender": "female",
-    "company": "FUTURIZE",
-    "address": "742 Glenwood Road, Salix, North Carolina, 3521",
-    "about": "Velit eu consectetur laborum do labore aute anim. Sunt excepteur mollit incididunt fugiat. Quis eiusmod magna ex ut ipsum. Veniam ea sunt exercitation dolore duis excepteur enim reprehenderit. Enim mollit laboris aute aute duis Lorem incididunt sint aute ex. Voluptate cupidatat exercitation laborum velit cillum culpa cupidatat ea eu adipisicing dolore cillum eu.\r\n",
-    "registered": "2014-01-25T12:21:02 -01:00",
-    "latitude": 1.79303,
-    "longitude": -61.276386,
-    "tags": [
-      "anim",
-      "tempor",
-      "proident",
-      "ullamco",
-      "velit",
-      "elit",
-      "ea"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Cruz Small"
-      },
-      {
-        "id": 1,
-        "name": "Josephine Sloan"
-      },
-      {
-        "id": 2,
-        "name": "Hill Garner"
-      }
-    ],
-    "greeting": "Hello, Flossie Hess! You have 6 unread messages.",
-    "favoriteFruit": "strawberry"
-  },
-  {
-    "id": 67,
-    "guid": "d27ff68d-841f-467b-bd82-6b336a0ff88a",
-    "isActive": false,
-    "balance": "$1,982.67",
-    "picture": "http://placehold.it/32x32",
-    "age": 26,
-    "eyeColor": "green",
-    "name": "Freida Ellis",
-    "gender": "female",
-    "company": "ETERNIS",
-    "address": "789 Henderson Walk, Trona, West Virginia, 6599",
-    "about": "In culpa sint cillum aliqua fugiat irure ad id. Nisi non anim cupidatat culpa exercitation qui amet occaecat dolor. Ipsum culpa laboris cillum labore culpa in non et occaecat veniam anim nostrud laborum.\r\n",
-    "registered": "2014-05-28T06:12:59 -02:00",
-    "latitude": 46.401584,
-    "longitude": -118.750813,
-    "tags": [
-      "aute",
-      "voluptate",
-      "commodo",
-      "aute",
-      "aute",
-      "laborum",
-      "dolor"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Lucia Leach"
-      },
-      {
-        "id": 1,
-        "name": "Howard Armstrong"
-      },
-      {
-        "id": 2,
-        "name": "Stout Silva"
-      }
-    ],
-    "greeting": "Hello, Freida Ellis! You have 7 unread messages.",
-    "favoriteFruit": "apple"
-  },
-  {
-    "id": 68,
-    "guid": "0865b52c-f419-42f4-ba28-e90ce766bb5f",
-    "isActive": true,
-    "balance": "$2,041.38",
-    "picture": "http://placehold.it/32x32",
-    "age": 22,
-    "eyeColor": "green",
-    "name": "Slater Pate",
-    "gender": "male",
-    "company": "EVENTIX",
-    "address": "129 He

<TRUNCATED>

[12/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrProvider.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrProvider.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrProvider.java
deleted file mode 100644
index 22a2996..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import javax.json.JsonStructure;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.ext.Provider;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-
-@Provider
-@Produces(WILDCARD)
-@Consumes(WILDCARD)
-public class JsrProvider extends DelegateProvider<JsonStructure> {
-    public JsrProvider() {
-        super(new JsrMessageBodyReader(), new JsrMessageBodyWriter());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/WadlDocumentMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/WadlDocumentMessageBodyWriter.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/WadlDocumentMessageBodyWriter.java
deleted file mode 100644
index 55f1dd3..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/WadlDocumentMessageBodyWriter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.fleece.jaxrs.xml.WadlDocumentToJson;
-import org.w3c.dom.Document;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.xml.stream.XMLStreamException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import static org.apache.fleece.jaxrs.Jsons.isJson;
-
-public class WadlDocumentMessageBodyWriter implements MessageBodyWriter<Document> {
-    private final WadlDocumentToJson converter = new WadlDocumentToJson();
-
-    @Override
-    public boolean isWriteable(final Class<?> aClass, final Type type,
-                               final Annotation[] annotations, final MediaType mediaType) {
-        return isJson(mediaType) && Document.class.isAssignableFrom(aClass);
-    }
-
-    @Override
-    public long getSize(final Document document, final Class<?> aClass,
-                        final Type type, final Annotation[] annotations,
-                        final MediaType mediaType) {
-        return -1;
-    }
-
-    @Override
-    public void writeTo(final Document document, final Class<?> aClass,
-                        final Type type, final Annotation[] annotations,
-                        final MediaType mediaType, final MultivaluedMap<String, Object> stringObjectMultivaluedMap,
-                        final OutputStream outputStream) throws IOException, WebApplicationException {
-        try {
-            outputStream.write(converter.convert(document).getBytes());
-        } catch (final XMLStreamException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJson.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJson.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJson.java
deleted file mode 100644
index 74d70d6..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJson.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.fleece.jaxrs.xml;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import javax.json.Json;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonBuilderFactory;
-import javax.json.JsonObjectBuilder;
-import javax.xml.stream.XMLStreamException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.Map;
-
-public class WadlDocumentToJson {
-    private final JsonBuilderFactory builderFactory = Json.createBuilderFactory(Collections.<String, Object>emptyMap());
-
-    public String convert(final Document doc) throws XMLStreamException {
-        final JsonObjectBuilder builder = builderFactory.createObjectBuilder();
-        if (doc.getChildNodes().getLength() != 1) {
-            return "{}";
-        }
-        final Node item = doc.getChildNodes().item(0);
-        return builder.add(item.getNodeName(), createNode(item)).build().toString();
-    }
-
-    private void addChildrens(/*final String nodeName, */final JsonObjectBuilder builder, final NodeList children) {
-        final Map<String, Collection<Node>> nodesByName = new LinkedHashMap<String, Collection<Node>>();
-        for (int i = 0; i < children.getLength(); i++) {
-            final Node node = children.item(i);
-            if ("#text".equals(node.getNodeName())) {
-                continue;
-            }
-
-            final String name = node.getNodeName();
-            Collection<Node> nodes = nodesByName.get(name);
-            if (nodes == null) {
-                nodes = new LinkedList<Node>();
-                nodesByName.put(name, nodes);
-            }
-            nodes.add(node);
-        }
-
-        for (final Map.Entry<String, Collection<Node>> entry : nodesByName.entrySet()) {
-            final JsonArrayBuilder arrayBuilder = builderFactory.createArrayBuilder();
-            for (final Node n : entry.getValue()) {
-                final JsonObjectBuilder jsonObjectBuilder = createNode(n);
-                if (jsonObjectBuilder != null) {
-                    arrayBuilder.add(jsonObjectBuilder);
-                }
-            }
-            builder.add(entry.getKey(), arrayBuilder);
-        }
-    }
-
-    private JsonObjectBuilder createNode(final Node node) {
-        JsonObjectBuilder childBuilder = null;
-
-        if (node.hasAttributes()) {
-            childBuilder = builderFactory.createObjectBuilder();
-            final NamedNodeMap attributes = node.getAttributes();
-            for (int j = 0; j < attributes.getLength(); j++) {
-                final Node namedItem = attributes.item(j);
-                childBuilder.add(namedItem.getNodeName(), namedItem.getNodeValue());
-            }
-        }
-
-        if (node.hasChildNodes()) {
-            if (childBuilder == null) {
-                childBuilder = builderFactory.createObjectBuilder();
-            }
-            addChildrens(/*node.getNodeName(),*/ childBuilder, node.getChildNodes());
-        }
-        return childBuilder;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/FleeceProviderTest.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/FleeceProviderTest.java b/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/FleeceProviderTest.java
deleted file mode 100644
index 4493b91..0000000
--- a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/FleeceProviderTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.cxf.endpoint.Server;
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.cxf.transport.local.LocalConduit;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.List;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class FleeceProviderTest {
-    private final static String ENDPOINT_ADDRESS = "local://fleece";
-    private static Server server;
-
-    @BeforeClass
-    public static void bindEndpoint() throws Exception {
-        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
-        sf.setResourceClasses(FleeceResource.class);
-        sf.setProviders(asList(new FleeceProvider<Object>()));
-        sf.setResourceProvider(FleeceResource.class, new SingletonResourceProvider(new FleeceResource(), false));
-        sf.setAddress(ENDPOINT_ADDRESS);
-        server = sf.create();
-    }
-
-    @AfterClass
-    public static void unbind() throws Exception {
-        server.stop();
-        server.destroy();
-    }
-
-    @Test
-    public void asParam() {
-        final String result = client().path("fleece").type(MediaType.APPLICATION_JSON_TYPE).post(new Fleece("client")).readEntity(String.class);
-        assertTrue(Boolean.parseBoolean(result));
-    }
-
-    @Test
-    public void object() {
-        final Fleece fleece = client().path("fleece").get(Fleece.class);
-        assertEquals("fleece", fleece.getName());
-    }
-
-    @Test
-    public void array() {
-        final Fleece[] fleece = client().path("fleece/all1").get(Fleece[].class);
-        assertEquals(2, fleece.length);
-        for (int i = 0; i < fleece.length; i++) {
-            assertEquals("fleece" + (i + 1), fleece[i].getName());
-        }
-    }
-
-    @Test
-    public void list() {
-        final ParameterizedType list = new ParameterizedType() {
-            @Override
-            public Type[] getActualTypeArguments() {
-                return new Type[]{Fleece.class};
-            }
-
-            @Override
-            public Type getRawType() {
-                return List.class;
-            }
-
-            @Override
-            public Type getOwnerType() {
-                return null;
-            }
-        };
-        final List<Fleece> fleeces = client().path("fleece/all2").get(new GenericType<List<Fleece>>(list));
-        assertEquals(2, fleeces.size());
-        int i = 1;
-        for (final Fleece f : fleeces) {
-            assertEquals("fleece" + i, f.getName());
-            i++;
-        }
-    }
-
-    private static WebClient client() {
-        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, asList(new FleeceProvider<Object>())).accept(MediaType.APPLICATION_JSON_TYPE);
-        WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
-        return client;
-    }
-
-    public static class Fleece {
-        private String name;
-
-        public Fleece(final String name) {
-            this.name = name;
-        }
-
-        public Fleece() {
-            // no-op
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(final String name) {
-            this.name = name;
-        }
-    }
-
-    @Path("fleece")
-    public static class FleeceResource {
-        @GET
-        public Fleece fleece() {
-            return new Fleece("fleece");
-        }
-
-        @GET
-        @Path("all1")
-        public Fleece[] fleeces1() {
-            return new Fleece[] { new Fleece("fleece1"), new Fleece("fleece2") };
-        }
-
-        @GET
-        @Path("all2")
-        public List<Fleece> fleeces2() {
-            return asList(fleeces1());
-        }
-
-        @POST
-        public String asParam(final Fleece f) {
-            return Boolean.toString("client".equals(f.getName()));
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/JsrProviderTest.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/JsrProviderTest.java b/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/JsrProviderTest.java
deleted file mode 100644
index 04419a4..0000000
--- a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/JsrProviderTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.cxf.endpoint.Server;
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.cxf.transport.local.LocalConduit;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.MediaType;
-import java.util.Iterator;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-
-public class JsrProviderTest {
-    private final static String ENDPOINT_ADDRESS = "local://fleece";
-    private static Server server;
-
-    @BeforeClass
-    public static void bindEndpoint() throws Exception {
-        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
-        sf.setResourceClasses(FleeceResource.class);
-        sf.setProviders(asList(new JsrProvider()));
-        sf.setResourceProvider(FleeceResource.class, new SingletonResourceProvider(new FleeceResource(), false));
-        sf.setAddress(ENDPOINT_ADDRESS);
-        server = sf.create();
-    }
-
-    @AfterClass
-    public static void unbind() throws Exception {
-        server.stop();
-        server.destroy();
-    }
-
-    @Test
-    public void object() {
-        final JsonObject object = client().path("fleece/object").get(JsonObject.class);
-        assertEquals(2, object.size());
-        for (int i = 1; i <= 2; i++) {
-            assertEquals(i, object.getInt(Character.toString((char) ('a' + i - 1))));
-        }
-    }
-
-    @Test
-    public void array() {
-        final JsonArray array = client().path("fleece/array").get(JsonArray.class);
-        assertEquals(2, array.size());
-        final Iterator<JsonValue> ints = array.iterator();
-        for (int i = 1; i <= 2; i++) {
-            final JsonValue next = ints.next();
-            assertEquals(JsonValue.ValueType.NUMBER, next.getValueType());
-            assertEquals(i, JsonNumber.class.cast(next).intValue());
-        }
-    }
-
-    private static WebClient client() {
-        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, asList(new JsrProvider())).accept(MediaType.APPLICATION_JSON_TYPE);
-        WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
-        return client;
-    }
-
-    @Path("fleece")
-    public static class FleeceResource {
-        @GET
-        @Path("array")
-        public JsonArray array() {
-            return Json.createArrayBuilder().add(1).add(2).build();
-        }
-
-        @GET
-        @Path("object")
-        public JsonObject object() {
-            return Json.createObjectBuilder().add("a", 1).add("b", 2).build();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJsonTest.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJsonTest.java b/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJsonTest.java
deleted file mode 100644
index efab474..0000000
--- a/fleece-jaxrs/src/test/java/org/apache/fleece/jaxrs/xml/WadlDocumentToJsonTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.fleece.jaxrs.xml;
-
-import org.junit.Test;
-import org.w3c.dom.Document;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.ByteArrayInputStream;
-
-import static org.junit.Assert.assertEquals;
-
-public class WadlDocumentToJsonTest {
-    @Test
-    public void xmlToJson() throws Exception {
-        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
-            .parse(new ByteArrayInputStream(("" +
-                    "<application xmlns=\"http://wadl.dev.java.net/2009/02\">\n" +
-                    "    <resources base=\"http://example.com/api\">\n" +
-                    "        <resource path=\"books\">\n" +
-                    "            <method name=\"GET\"/>\n" +
-                    "            <resource path=\"{bookId}\">\n" +
-                    "                <param required=\"true\" style=\"template\" name=\"bookId\"/>\n" +
-                    "                <method name=\"GET\"/>\n" +
-                    "                <method name=\"DELETE\"/>\n" +
-                    "                <resource path=\"reviews\">\n" +
-                    "                    <method name=\"GET\">\n" +
-                    "                        <request>\n" +
-                    "                            <param name=\"page\" required=\"false\" default=\"1\" style=\"query\"/>\n" +
-                    "                            <param name=\"size\" required=\"false\" default=\"20\" style=\"query\"/>\n" +
-                    "                        </request>\n" +
-                    "                    </method>\n" +
-                    "                </resource>\n" +
-                    "            </resource>\n" +
-                    "        </resource>\n" +
-                    "        <resource path=\"readers\">\n" +
-                    "            <method name=\"GET\"/>\n" +
-                    "        </resource>\n" +
-                    "    </resources>\n" +
-                    "</application>").getBytes()));
-
-        final String json = new WadlDocumentToJson().convert(doc);
-        assertEquals("{\"application\":{\"xmlns\":\"http://wadl.dev.java.net/2009/02\",\"resources\":[{\"base\":\"http://example.com/api\",\"resource\":[{\"path\":\"books\",\"method\":[{\"name\":\"GET\"}],\"resource\":[{\"path\":\"{bookId}\",\"param\":[{\"name\":\"bookId\",\"required\":\"true\",\"style\":\"template\"}],\"method\":[{\"name\":\"GET\"},{\"name\":\"DELETE\"}],\"resource\":[{\"path\":\"reviews\",\"method\":[{\"name\":\"GET\",\"request\":[{\"param\":[{\"default\":\"1\",\"name\":\"page\",\"required\":\"false\",\"style\":\"query\"},{\"default\":\"20\",\"name\":\"size\",\"required\":\"false\",\"style\":\"query\"}]}]}]}]}]},{\"path\":\"readers\",\"method\":[{\"name\":\"GET\"}]}]}]}}", json);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/pom.xml
----------------------------------------------------------------------
diff --git a/fleece-mapper/pom.xml b/fleece-mapper/pom.xml
deleted file mode 100644
index d7e4789..0000000
--- a/fleece-mapper/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>fleece</artifactId>
-    <groupId>org.apache.fleece</groupId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>fleece-mapper</artifactId>
-  <name>Fleece :: Mapper</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.fleece</groupId>
-      <artifactId>fleece-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
-
-  <properties>
-    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-  </properties>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/Converter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Converter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/Converter.java
deleted file mode 100644
index fbed98c..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Converter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-public interface Converter<T> {
-    String toString(T instance);
-    T fromString(String text);
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceConverter.java
deleted file mode 100644
index 726afa1..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceConverter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Target(METHOD)
-@Retention(RUNTIME)
-public @interface FleeceConverter {
-    Class<? extends Converter<?>> value();
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceIgnore.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceIgnore.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceIgnore.java
deleted file mode 100644
index 6f8e545..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/FleeceIgnore.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-@Target(METHOD)
-@Retention(RUNTIME)
-public @interface FleeceIgnore {
-    /**
-     * Example: @FleeceIgnore(minVersion = 2) will ignore the value until version is set to 2, 3, ...
-     *
-     * @return the first version the decorated field is not ignored.
-     */
-    int minVersion() default -1;
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
deleted file mode 100644
index 2186b4d..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import org.apache.fleece.mapper.converter.EnumConverter;
-import org.apache.fleece.mapper.reflection.Mappings;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonNumber;
-import javax.json.JsonObject;
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-import javax.json.JsonString;
-import javax.json.JsonValue;
-import javax.json.JsonValue.ValueType;
-import javax.json.stream.JsonGenerator;
-import javax.json.stream.JsonGeneratorFactory;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import static java.util.Arrays.asList;
-
-public class Mapper {
-    protected static final JsonObject EMPTY_OBJECT = Json.createObjectBuilder().build();
-    private static final Converter<Object> FALLBACK_CONVERTER = new FallbackConverter();
-
-    protected final Mappings mappings;
-    protected final JsonReaderFactory readerFactory;
-    protected final JsonGeneratorFactory generatorFactory;
-    protected final boolean close;
-    protected final ConcurrentMap<Type, Converter<?>> converters;
-    protected final int version;
-
-    public Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory,
-                  final boolean doClose, final Map<Class<?>, Converter<?>> converters,
-                  final int version, final Comparator<String> attributeOrder) {
-        this.readerFactory = readerFactory;
-        this.generatorFactory = generatorFactory;
-        this.close = doClose;
-        this.converters = new ConcurrentHashMap<Type, Converter<?>>(converters);
-        this.version = version;
-        this.mappings = new Mappings(attributeOrder);
-    }
-
-    private static JsonGenerator writePrimitives(final JsonGenerator generator, final Object value) {
-        if (value == null) {
-            return null; // fake a write
-        }
-
-        final Class<?> type = value.getClass();
-        if (type == String.class) {
-            return generator.write(value.toString());
-        } else if (type == long.class || type == Long.class) {
-            return generator.write(Long.class.cast(value).longValue());
-        } else if (type == int.class || type == Integer.class) {
-            return generator.write(Integer.class.cast(value).intValue());
-        } else if (type == double.class || type == Double.class
-                || type == float.class || type == Float.class) {
-            return generator.write(Number.class.cast(value).doubleValue());
-        } else if (type == boolean.class || type == Boolean.class) {
-            return generator.write(Boolean.class.cast(value).booleanValue());
-        } else if (type == BigDecimal.class) {
-            return generator.write(BigDecimal.class.cast(value));
-        } else if (type == BigInteger.class) {
-            return generator.write(BigInteger.class.cast(value));
-        } else if (type == short.class || type == Short.class) {
-            return generator.write(Short.class.cast(value).shortValue());
-        } else if (type == char.class || type == Character.class) {
-            return generator.write(Character.class.cast(value).toString());
-        } else if (type == byte.class || type == Byte.class) {
-            return generator.write(Byte.class.cast(value).byteValue());
-        }        
-        return null;
-    }
-
-    private static JsonGenerator writePrimitives(final JsonGenerator generator, final String key, final Class<?> type, final Object value) {
-        if (type == String.class) {
-            return generator.write(key, value.toString());
-        } else if (type == long.class || type == Long.class) {
-            return generator.write(key, Long.class.cast(value).longValue());
-        } else if (type == int.class || type == Integer.class
-                    || type == byte.class || type == Byte.class
-                    || type == short.class || type == Short.class) {
-            return generator.write(key, Number.class.cast(value).intValue());
-        } else if (type == double.class || type == Double.class
-                || type == float.class || type == Float.class) {
-            return generator.write(key, Number.class.cast(value).doubleValue());
-        } else if (type == boolean.class || type == Boolean.class) {
-            return generator.write(key, Boolean.class.cast(value).booleanValue());
-        } else if (type == BigDecimal.class) {
-            return generator.write(key, BigDecimal.class.cast(value));
-        } else if (type == BigInteger.class) {
-            return generator.write(key, BigInteger.class.cast(value));
-        } else if (type == char.class || type == Character.class) {
-            return generator.write(key, Character.class.cast(value).toString());
-        } 
-        return generator;
-    }
-
-    /*private <T> String convertFrom(final Class<T> aClass, final T value) {
-        final Converter<T> converter = (Converter<T>) findConverter(aClass);
-        return doConverFrom(value, converter);
-    }*/
-
-    private static <T> String doConverFrom(final T value, final Converter<T> converter) {
-        if (converter == null) {
-            throw new MapperException("can't convert " + value + " to String");
-        }
-        return converter.toString(value);
-    }
-
-    private <T> Converter<T> findConverter(final Type aClass) {
-        final Converter<T> converter = (Converter<T>) converters.get(aClass);
-        if (converter != null) {
-            return converter;
-        }
-        if (Class.class.isInstance(aClass)) {
-            final Class<?> clazz = Class.class.cast(aClass);
-            if (clazz.isEnum()) {
-                final Converter<T> enumConverter = new EnumConverter(clazz);
-                converters.putIfAbsent(clazz, enumConverter);
-                return enumConverter;
-            }
-        }
-        return null;
-    }
-
-    private Object convertTo(final Type aClass, final String text) {
-        final Converter<?> converter = findConverter(aClass);
-        if (converter == null) {
-            converters.putIfAbsent(aClass, FALLBACK_CONVERTER);
-            return FALLBACK_CONVERTER;
-        }
-        return converter.fromString(text);
-    }
-
-    public <T> void writeArray(final Object object, final OutputStream stream) {
-        writeArray(asList((T[]) object), stream);
-    }
-
-    public <T> void writeArray(final T[] object, final OutputStream stream) {
-        writeArray(asList(object), stream);
-    }
-
-    public <T> void writeArray(final T[] object, final Writer stream) {
-        writeArray(asList(object), stream);
-    }
-
-    public <T> void writeArray(final Collection<T> object, final OutputStream stream) {
-        writeArray(object, new OutputStreamWriter(stream));
-    }
-
-    public <T> void writeArray(final Collection<T> object, final Writer stream) {
-        JsonGenerator generator = generatorFactory.createGenerator(stream);
-        try {
-            if (object == null) {
-                generator = generator.writeStartArray().writeEnd();
-            } else {
-                generator = generator.writeStartArray();
-                for (final T t : object) {
-                    generator = writeItem(generator, t);
-                }
-                generator = generator.writeEnd();
-            }
-        } finally {
-            doCloseOrFlush(generator);
-        }
-    }
-
-    private void doCloseOrFlush(JsonGenerator generator) {
-        if (close) {
-            generator.close();
-        } else {
-            generator.flush();
-        }
-    }
-
-    public <T> void writeIterable(final Iterable<T> object, final OutputStream stream) {
-        writeIterable(object, new OutputStreamWriter(stream));
-    }
-
-    public <T> void writeIterable(final Iterable<T> object, final Writer stream) {
-        JsonGenerator generator = generatorFactory.createGenerator(stream);
-        try {
-            if (object == null) {
-                generator = generator.writeStartArray().writeEnd();
-            } else {
-                generator.writeStartArray();
-                for (final T t : object) {
-                    generator = writeItem(generator, t);
-                }
-                generator.writeEnd();
-            }
-        } finally {
-            doCloseOrFlush(generator);
-        }
-    }
-
-    public void writeObject(final Object object, final Writer stream) {
-        final JsonGenerator generator = generatorFactory.createGenerator(stream);
-        doWriteHandlingNullObject(object, generator);
-    }
-
-    public void writeObject(final Object object, final OutputStream stream) {
-        final JsonGenerator generator = generatorFactory.createGenerator(stream);
-        doWriteHandlingNullObject(object, generator);
-    }
-
-    private void doWriteHandlingNullObject(final Object object, final JsonGenerator generator) {
-        if (object == null) {
-            generator.writeStartObject().writeEnd().close();
-            return;
-        }
-
-        //JsonGenerator gen = null;
-        try {
-            /*gen = */doWriteObject(generator, object);
-        } finally {
-            doCloseOrFlush(generator);
-        }
-    }
-
-    private JsonGenerator doWriteObject(final JsonGenerator generator, final Object object) {
-        try {
-            JsonGenerator gen = generator;
-            if (object == null) {
-                return generator;
-            }
-
-            if (Map.class.isInstance(object)) {
-                gen = gen.writeStartObject();
-                gen = writeMapBody((Map<?, ?>) object, gen);
-                gen = gen.writeEnd();
-                return gen;
-            }
-
-            gen = gen.writeStartObject();
-            gen = doWriteObjectBody(gen, object);
-            return gen.writeEnd();
-        } catch (final InvocationTargetException e) {
-            throw new MapperException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MapperException(e);
-        }
-    }
-
-    private JsonGenerator doWriteObjectBody(final JsonGenerator gen, final Object object) throws IllegalAccessException, InvocationTargetException {
-        final Class<?> objectClass = object.getClass();
-        final Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(objectClass);
-        if (classMapping == null) {
-            throw new MapperException("No mapping for " + objectClass.getName());
-        }
-
-        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)) {
-                continue;
-            }
-
-            generator = writeValue(generator, value.getClass(),
-                                    getter.primitive, getter.array,
-                                    getter.collection, getter.map,
-                                    getterEntry.getKey(),
-                                    getter.converter == null ? value : getter.converter.toString(value));
-        }
-        return generator;
-    }
-
-    private JsonGenerator writeMapBody(final Map<?, ?> object, final JsonGenerator gen) throws InvocationTargetException, IllegalAccessException {
-        JsonGenerator generator = gen;
-        for (final Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
-            final Object value = entry.getValue();
-            if (value == null) {
-                continue;
-            }
-
-            final Object key = entry.getKey();
-            final Class<?> valueClass = value.getClass();
-            final boolean primitive = Mappings.isPrimitive(valueClass);
-            final boolean clazz = mappings.getClassMapping(valueClass) != null;
-            final boolean array = clazz || primitive ? false : valueClass.isArray();
-            final boolean collection = clazz || primitive || array ? false : Collection.class.isAssignableFrom(valueClass);
-            final boolean map = clazz || primitive || array || collection ? false : Map.class.isAssignableFrom(valueClass);
-            generator = writeValue(generator, valueClass,
-                                    primitive, array, collection, map,
-                                    key == null ? "null" : key.toString(), value);
-        }
-        return generator;
-    }
-
-    private JsonGenerator writeValue(final JsonGenerator generator, final Class<?> type,
-                                     final boolean primitive, final boolean array,
-                                     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);
-            for (int i = 0; i < length; i++) {
-                gen = writeItem(gen, Array.get(value, i));
-            }
-            return gen.writeEnd();
-        } else if (collection) {
-            JsonGenerator gen = generator.writeStartArray(key);
-            for (final Object o : Collection.class.cast(value)) {
-                gen = writeItem(gen, o);
-            }
-            return gen.writeEnd();
-        } else if (map) {
-            JsonGenerator gen = generator.writeStartObject(key);
-            gen = writeMapBody((Map<?, ?>) value, gen);
-            return gen.writeEnd();
-        } else if (primitive) {
-            return writePrimitives(generator, key, type, value);
-        } else {
-            final Converter<?> converter = findConverter(type);
-            if (converter != null) {
-                return writeValue(generator, String.class, true, false, false, false, key,
-                                    doConverFrom(value, (Converter<Object>) converter));
-            }
-            return doWriteObjectBody(generator.writeStartObject(key), value).writeEnd();
-        }
-    }
-
-    private JsonGenerator writeItem(final JsonGenerator generator, final Object o) {
-        final JsonGenerator newGen = writePrimitives(generator, o);
-        if (newGen == null) {
-            return doWriteObject(generator, o);
-        }
-        return newGen;
-    }
-
-    public <T> T readObject(final Reader stream, final Type clazz) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        return mapObject(clazz, reader);
-    }
-
-    public <T> T readObject(final InputStream stream, final Type clazz) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        return mapObject(clazz, reader);
-    }
-
-    private <T> T mapObject(final Type clazz, final JsonReader reader) {
-        try {
-            return (T) buildObject(clazz, reader.readObject());
-        } catch (final InstantiationException e) {
-            throw new MapperException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MapperException(e);
-        } finally {
-            if (close) {
-                reader.close();
-            }
-        }
-    }
-
-    public <C extends Collection<T>, T> C readCollection(final InputStream stream, final ParameterizedType genericType, final Class<T> raw) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(genericType, raw);
-        if (mapping == null) {
-            throw new UnsupportedOperationException("type " + genericType + " not supported");
-        }
-        try {
-            return (C) mapCollection(mapping, reader.readArray());
-        } catch (final InstantiationException e) {
-            throw new MapperException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MapperException(e);
-        } finally {
-            if (close) {
-                reader.close();
-            }
-        }
-    }
-
-    public <C extends Collection<T>, T> C readCollection(final Reader stream, final ParameterizedType genericType, final Class<T> raw) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(genericType, raw);
-        if (mapping == null) {
-            throw new UnsupportedOperationException("type " + genericType + " not supported");
-        }
-        try {
-            return (C) mapCollection(mapping, reader.readArray());
-        } catch (final InstantiationException e) {
-            throw new MapperException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MapperException(e);
-        } finally {
-            if (close) {
-                reader.close();
-            }
-        }
-    }
-
-    public <T> T[] readArray(final Reader stream, final Class<T> clazz) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        return mapArray(clazz, reader);
-    }
-
-    public <T> T[] readArray(final InputStream stream, final Class<T> clazz) {
-        final JsonReader reader = readerFactory.createReader(stream);
-        return mapArray(clazz, reader);
-    }
-
-    private <T> T[] mapArray(final Class<T> clazz, final JsonReader reader) {
-        try {
-            return (T[]) buildArrayWithComponentType(reader.readArray(), clazz);
-        } catch (final InstantiationException e) {
-            throw new MapperException(e);
-        } catch (final IllegalAccessException e) {
-            throw new MapperException(e);
-        } finally {
-            if (close) {
-                reader.close();
-            }
-        }
-    }
-
-    private Object buildObject(final Type type, final JsonObject object) throws InstantiationException, IllegalAccessException {
-        final Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(type);
-
-        if (classMapping == null) {
-            if (ParameterizedType.class.isInstance(type)) {
-                final ParameterizedType aType = ParameterizedType.class.cast(type);
-                final Type[] fieldArgTypes = aType.getActualTypeArguments();
-                if (fieldArgTypes.length >= 2) {
-                    final Class<?> raw = Class.class.cast(aType.getRawType());
-                    
-                    final Map map;
-                    if (SortedMap.class.isAssignableFrom(raw)) {
-                        map = new TreeMap();
-                    } else if (ConcurrentMap.class.isAssignableFrom(raw)) {
-                        map = new ConcurrentHashMap(object.size());
-                    } else if (Map.class.isAssignableFrom(raw)) {
-                        map = new HashMap(object.size());
-                    } else {
-                        map = null;
-                    }
-
-                    if (map != null) {
-                        
-                        Type keyType;
-                        if (ParameterizedType.class.isInstance(fieldArgTypes[0])) {
-                            keyType = fieldArgTypes[0];
-                        } else {
-                            keyType = fieldArgTypes[0];
-                        }
-                         
-                        for (final Map.Entry<String, JsonValue> value : object.entrySet()) {
-                            map.put(convertTo(keyType, value.getKey()), toObject(value.getValue(), fieldArgTypes[1]));
-                        }
-                        return map;
-                    }
-                } else {
-                    throw new MapperException("Can't map " + type + ", not a map and no Mapping found");
-                }
-            } else {
-                throw new MapperException("Can't map " + type);
-            }
-        }
-
-        final Object t = classMapping.clazz.newInstance();
-        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 Object convertedValue = value.converter == null?
-                    toObject(jsonValue, value.paramType) : jsonValue.getValueType() == ValueType.STRING ?
-                                                            value.converter.fromString(JsonString.class.cast(jsonValue).getString()):
-                                                                value.converter.fromString(jsonValue.toString());
-                
-            if (convertedValue != null) {
-                try {
-                    setterMethod.invoke(t, convertedValue);
-                } catch (final InvocationTargetException e) {
-                    throw new MapperException(e.getCause());
-                }
-            }
-        }
-
-        return t;
-    }
-
-    private Object toObject(final JsonValue jsonValue, final Type type) throws InstantiationException, IllegalAccessException {
-      
-        if(jsonValue == null || jsonValue == JsonValue.NULL) {           
-            return null;
-        }
-        
-        if (type == Boolean.class || type == boolean.class) {
-            
-            //if this would be commented out than the json string value "true" would pe parsed to a bool literal
-            //but this is according to json spec invalid
-            /*if (JsonString.class.isInstance(jsonValue)) {
-                return Boolean.valueOf(JsonString.class.cast(jsonValue).getString());
-            }*/
-            
-            if(jsonValue == JsonValue.FALSE) {
-                return Boolean.FALSE;
-            }
-            
-            if(jsonValue == JsonValue.TRUE) {
-                return Boolean.TRUE;
-            }
-            
-            throw new MapperException("Unable to parse "+jsonValue+" to boolean");
-        }
-        
-        if (type == Character.class || type == char.class) {
-            
-            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
-        }
-        
-        if (JsonObject.class.isInstance(jsonValue)) {
-            return buildObject(type, JsonObject.class.cast(jsonValue));
-        } else if (JsonArray.class.isInstance(jsonValue)) {
-            return buildArray(type, JsonArray.class.cast(jsonValue));
-        } else if (JsonNumber.class.isInstance(jsonValue)) {
-                
-                final JsonNumber number = JsonNumber.class.cast(jsonValue);
-                
-                if (type == Long.class || type == long.class) {
-                    return number.longValue();
-                }
-                
-                if (type == Integer.class || type == int.class) {
-                    return number.intValue();
-                }
-                                
-                if (type == Short.class || type == short.class) {
-                    return (short) number.intValue();
-                }
-                
-                if (type == Byte.class || type == byte.class) {
-                    return (byte) number.intValue();
-                }
-                
-                if (type == Float.class || type == float.class) {
-                    return (float) number.doubleValue();
-                }
-                
-                if (type == Double.class || type == double.class) {
-                    return number.doubleValue();
-                }
-                
-                if (type == BigInteger.class) {
-                    return number.bigIntegerValue();
-                }
-                if (type == BigDecimal.class) {
-                    return number.bigDecimalValue();
-                }
-           
-        } else if (JsonString.class.isInstance(jsonValue)) {
-            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
-        }
-
-        
-        throw new MapperException("Unable to parse "+jsonValue+" to "+type);
-    }
-
-    private Object buildArray(final Type type, final JsonArray jsonArray) throws IllegalAccessException, InstantiationException {
-        if (Class.class.isInstance(type)) {
-            final Class clazz = Class.class.cast(type);
-            if (clazz.isArray()) {
-                final Class<?> componentType = clazz.getComponentType();
-                return buildArrayWithComponentType(jsonArray, componentType);
-            }
-        }
-
-        if (ParameterizedType.class.isInstance(type)) {
-            final Mappings.CollectionMapping mapping = mappings.findCollectionMapping(
-                    ParameterizedType.class.cast(type), (Class<Object>) ParameterizedType.class.cast(type).getRawType());
-            if (mapping != null) {
-                return mapCollection(mapping, jsonArray);
-            }
-        }
-
-        throw new UnsupportedOperationException("type " + type + " not supported");
-    }
-
-    private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray) throws InstantiationException, IllegalAccessException {
-        final Collection collection;
-        
-        if (SortedSet.class == mapping.raw) {
-            collection = new TreeSet<T>();
-        } else if (Set.class == mapping.raw) {
-            collection = new HashSet<T>(jsonArray.size());
-        } else if (Queue.class == mapping.raw) {
-            collection = new ArrayBlockingQueue<T>(jsonArray.size());
-          //fail fast if collection is not know, assume Collection.class to be compatible with ArrayList is wrong for almost all cases
-        } else if (List.class == mapping.raw /*|| Collection.class == mapping.raw*/) {
-            collection = new ArrayList<T>(jsonArray.size());
-        } else {
-            throw new IllegalStateException("not supported collection type: " + mapping.raw.getName());
-        }
-
-        for (final JsonValue value : jsonArray) {
-            final Object element = toObject(value, mapping.arg);
-            collection.add(element);
-        }
-        return collection;
-    }
-
-    private Object buildArrayWithComponentType(final JsonArray jsonArray, final Class<?> componentType) throws InstantiationException, IllegalAccessException {
-        final Object array = Array.newInstance(componentType, jsonArray.size());
-        int i = 0;
-        for (final JsonValue value : jsonArray) {
-            Array.set(array, i++, toObject(value, componentType));
-        }
-        return array;
-    }
-
-    private static class FallbackConverter implements Converter<Object> {
-        @Override
-        public String toString(final Object instance) {
-            return instance.toString();
-        }
-
-        @Override
-        public Object fromString(final String text) {
-            throw new UnsupportedOperationException("Using fallback converter, " +
-                "this only works in write mode but not in read. Please register a custom converter to do so.");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
deleted file mode 100644
index 7ec07bd..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import org.apache.fleece.mapper.converter.BigDecimalConverter;
-import org.apache.fleece.mapper.converter.BigIntegerConverter;
-import org.apache.fleece.mapper.converter.BooleanConverter;
-import org.apache.fleece.mapper.converter.ByteConverter;
-import org.apache.fleece.mapper.converter.CachedDelegateConverter;
-import org.apache.fleece.mapper.converter.CharacterConverter;
-import org.apache.fleece.mapper.converter.ClassConverter;
-import org.apache.fleece.mapper.converter.DateConverter;
-import org.apache.fleece.mapper.converter.DoubleConverter;
-import org.apache.fleece.mapper.converter.FloatConverter;
-import org.apache.fleece.mapper.converter.IntegerConverter;
-import org.apache.fleece.mapper.converter.LongConverter;
-import org.apache.fleece.mapper.converter.ShortConverter;
-import org.apache.fleece.mapper.converter.StringConverter;
-
-import javax.json.JsonReaderFactory;
-import javax.json.spi.JsonProvider;
-import javax.json.stream.JsonGeneratorFactory;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-public class MapperBuilder {
-    private static final Map<Class<?>, Converter<?>> DEFAULT_CONVERTERS = new HashMap<Class<?>, Converter<?>>();
-
-    static {
-        //DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyy-MM-dd'T'HH:mm:ssZ")); // ISO8601 long RFC822 zone
-        DEFAULT_CONVERTERS.put(Date.class, new DateConverter("yyyyMMddHHmmssZ")); // ISO8601 short
-        DEFAULT_CONVERTERS.put(Class.class, new ClassConverter());
-        DEFAULT_CONVERTERS.put(String.class, new StringConverter());
-        DEFAULT_CONVERTERS.put(BigDecimal.class, new BigDecimalConverter());
-        DEFAULT_CONVERTERS.put(BigInteger.class, new BigIntegerConverter());
-        DEFAULT_CONVERTERS.put(Byte.class, new CachedDelegateConverter<Byte>(new ByteConverter()));
-        DEFAULT_CONVERTERS.put(Character.class, new CharacterConverter());
-        DEFAULT_CONVERTERS.put(Double.class, new DoubleConverter());
-        DEFAULT_CONVERTERS.put(Float.class, new FloatConverter());
-        DEFAULT_CONVERTERS.put(Integer.class, new IntegerConverter());
-        DEFAULT_CONVERTERS.put(Long.class, new LongConverter());
-        DEFAULT_CONVERTERS.put(Short.class, new ShortConverter());
-        DEFAULT_CONVERTERS.put(Boolean.class, new CachedDelegateConverter<Boolean>(new BooleanConverter()));
-        DEFAULT_CONVERTERS.put(byte.class, DEFAULT_CONVERTERS.get(Byte.class));
-        DEFAULT_CONVERTERS.put(char.class, new CharacterConverter());
-        DEFAULT_CONVERTERS.put(double.class, DEFAULT_CONVERTERS.get(Double.class));
-        DEFAULT_CONVERTERS.put(float.class, DEFAULT_CONVERTERS.get(Float.class));
-        DEFAULT_CONVERTERS.put(int.class, DEFAULT_CONVERTERS.get(Integer.class));
-        DEFAULT_CONVERTERS.put(long.class, DEFAULT_CONVERTERS.get(Long.class));
-        DEFAULT_CONVERTERS.put(short.class, DEFAULT_CONVERTERS.get(Short.class));
-        DEFAULT_CONVERTERS.put(boolean.class, DEFAULT_CONVERTERS.get(Boolean.class));
-    }
-
-    private JsonReaderFactory readerFactory;
-    private JsonGeneratorFactory generatorFactory;
-    private boolean doCloseOnStreams = false;
-    private int version = -1;
-    private Comparator<String> attributeOrder = null;
-    private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS);
-
-    public Mapper build() {
-        if (readerFactory == null || generatorFactory == null) {
-            final JsonProvider provider = JsonProvider.provider();
-            final Map<String, Object> config = Collections.<String, Object>emptyMap();
-            if (readerFactory == null) {
-                readerFactory = provider.createReaderFactory(config);
-            }
-            if (generatorFactory == null) {
-                generatorFactory = provider.createGeneratorFactory(config);
-            }
-        }
-
-        return new Mapper(readerFactory, generatorFactory, doCloseOnStreams, converters, version, attributeOrder);
-    }
-
-    public MapperBuilder setAttributeOrder(final Comparator<String> attributeOrder) {
-        this.attributeOrder = attributeOrder;
-        return this;
-    }
-
-    public MapperBuilder setReaderFactory(final JsonReaderFactory readerFactory) {
-        this.readerFactory = readerFactory;
-        return this;
-    }
-
-    public MapperBuilder setGeneratorFactory(final JsonGeneratorFactory generatorFactory) {
-        this.generatorFactory = generatorFactory;
-        return this;
-    }
-
-    public MapperBuilder setDoCloseOnStreams(final boolean doCloseOnStreams) {
-        this.doCloseOnStreams = doCloseOnStreams;
-        return this;
-    }
-
-    public MapperBuilder addPropertyEditor(final Class<?> clazz, final Converter<?> converter) {
-        this.converters.put(clazz, converter);
-        return this;
-    }
-
-    public MapperBuilder setVersion(final int version) {
-        this.version = version;
-        return this;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperException.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperException.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperException.java
deleted file mode 100644
index e882c2a..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.fleece.mapper;
-
-import javax.json.JsonException;
-
-public class MapperException extends JsonException {
-    public MapperException(final Throwable e) {
-        super(e.getMessage(), e);
-    }
-
-    public MapperException(final String s) {
-        super(s);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigDecimalConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigDecimalConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigDecimalConverter.java
deleted file mode 100644
index f5828b1..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigDecimalConverter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-import java.math.BigDecimal;
-
-public class BigDecimalConverter implements Converter<BigDecimal> {
-    @Override
-    public String toString(final BigDecimal instance) {
-        return instance.toString();
-    }
-
-    @Override
-    public BigDecimal fromString(final String text) {
-        return new BigDecimal(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigIntegerConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigIntegerConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigIntegerConverter.java
deleted file mode 100644
index eb3f0d7..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BigIntegerConverter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-import java.math.BigInteger;
-
-public class BigIntegerConverter implements Converter<BigInteger> {
-    @Override
-    public String toString(final BigInteger instance) {
-        return instance.toString();
-    }
-
-    @Override
-    public BigInteger fromString(final String text) {
-        return new BigInteger(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BooleanConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BooleanConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BooleanConverter.java
deleted file mode 100644
index ee51806..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/BooleanConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class BooleanConverter implements Converter<Boolean> {
-    @Override
-    public String toString(final Boolean instance) {
-        return Boolean.toString(instance);
-    }
-
-    @Override
-    public Boolean fromString(final String text) {
-        return Boolean.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ByteConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ByteConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ByteConverter.java
deleted file mode 100644
index 32edd86..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ByteConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class ByteConverter implements Converter<Byte> {
-    @Override
-    public String toString(final Byte instance) {
-        return Byte.toString(instance);
-    }
-
-    @Override
-    public Byte fromString(final String text) {
-        return Byte.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CachedDelegateConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CachedDelegateConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CachedDelegateConverter.java
deleted file mode 100644
index 9d36701..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CachedDelegateConverter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-public class CachedDelegateConverter<T> implements Converter<T> {
-    private final ConcurrentMap<T, String> strings = new ConcurrentHashMap<T, String>();
-    private final ConcurrentMap<String, T> values = new ConcurrentHashMap<String, T>();
-    private final Converter<T> delegate;
-
-    public CachedDelegateConverter(final Converter<T> delegate) {
-        this.delegate = delegate;
-    }
-
-    @Override
-    public String toString(final T instance) {
-        String v = strings.get(instance);
-        if (v == null) {
-            v = delegate.toString(instance);
-            strings.putIfAbsent(instance, v);
-        }
-        return v;
-    }
-
-    @Override
-    public T fromString(final String text) {
-        T v = values.get(text);
-        if (v == null) {
-            v = delegate.fromString(text);
-            values.putIfAbsent(text, v);
-        }
-        return v;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CharacterConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CharacterConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CharacterConverter.java
deleted file mode 100644
index 6117b07..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/CharacterConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class CharacterConverter implements Converter<Character> {
-    @Override
-    public String toString(final Character instance) {
-        return Character.toString(instance);
-    }
-
-    @Override
-    public Character fromString(final String text) {
-        return text.length() > 0 ? text.charAt(0) : null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ClassConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ClassConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ClassConverter.java
deleted file mode 100644
index 0214c51..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/ClassConverter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class ClassConverter implements Converter<Class<?>> {
-    @Override
-    public String toString(final Class<?> instance) {
-        return instance.getName();
-    }
-
-    @Override
-    public Class<?> fromString(final String text) {
-        try {
-            return Class.forName(text, true, Thread.currentThread().getContextClassLoader());
-        } catch (final ClassNotFoundException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DateConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DateConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DateConverter.java
deleted file mode 100644
index fa8831b..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DateConverter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public class DateConverter implements Converter<Date> {
-    // TODO: see if we can clean it
-    private final ThreadLocal<DateFormat> format;
-
-    public DateConverter(final String pattern) {
-        format = new ThreadLocal<DateFormat>() {
-            @Override
-            protected DateFormat initialValue() {
-                return new SimpleDateFormat(pattern);
-            }
-        };
-    }
-
-    @Override
-    public String toString(final Date instance) {
-        return format.get().format(instance);
-    }
-
-    @Override
-    public Date fromString(final String text) {
-        try {
-            return format.get().parse(text);
-        } catch (final ParseException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DoubleConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DoubleConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DoubleConverter.java
deleted file mode 100644
index 6faf015..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/DoubleConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-public class DoubleConverter implements Converter<Double> {
-    @Override
-    public String toString(final Double instance) {
-        return Double.toString(instance);
-    }
-
-    @Override
-    public Double fromString(final String text) {
-        return Double.valueOf(text);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/EnumConverter.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/EnumConverter.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/EnumConverter.java
deleted file mode 100644
index 56aadcb..0000000
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/converter/EnumConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.fleece.mapper.converter;
-
-import org.apache.fleece.mapper.Converter;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class EnumConverter<T extends Enum<T>> implements Converter<T> {
-    private final Map<String, T> values;
-
-    public EnumConverter(final Class<T> aClass) {
-        final T[] enumConstants = aClass.getEnumConstants();
-        values = new HashMap<String, T>(enumConstants.length);
-        for (final T t : enumConstants) {
-            values.put(t.name(), t);
-        }
-    }
-
-    @Override // no need of cache here, it is already fast
-    public String toString(final T instance) {
-        return instance.name();
-    }
-
-    @Override
-    public T fromString(final String text) {
-        return values.get(text);
-    }
-}


[08/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
new file mode 100644
index 0000000..098967e
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectBuilderImplTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import javax.json.Json;
+import javax.json.JsonObjectBuilder;
+
+import org.junit.Test;
+
+public class JsonObjectBuilderImplTest {
+    @Test
+    public void build() {
+        final JsonObjectBuilder builder = Json.createObjectBuilder();
+        builder.add("a", "b");
+        assertEquals("{\"a\":\"b\"}", builder.build().toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
new file mode 100644
index 0000000..6f4ba86
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonObjectImplTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import javax.json.Json;
+import javax.json.JsonObjectBuilder;
+
+import org.junit.Test;
+
+public class JsonObjectImplTest {
+    @Test
+    public void objectToString() {
+        final JsonObjectBuilder ob = Json.createObjectBuilder();
+        ob.add("a", new JsonStringImpl("b"));
+        assertEquals("{\"a\":\"b\"}", ob.build().toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
new file mode 100644
index 0000000..745132b
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonParserTest.java
@@ -0,0 +1,1419 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.NoSuchElementException;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonException;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonReader;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParser.Event;
+import javax.json.stream.JsonParsingException;
+
+import org.junit.Test;
+
+public class JsonParserTest {
+    
+    
+    static final Charset UTF_8 = Charset.forName("UTF-8");
+    static final Charset UTF_16BE = Charset.forName("UTF-16BE");
+    static final Charset UTF_16LE = Charset.forName("UTF-16LE");
+    static final Charset UTF_16 = Charset.forName("UTF-16");
+    static final Charset UTF_32LE = Charset.forName("UTF-32LE");
+    static final Charset UTF_32BE = Charset.forName("UTF-32BE");
+    
+    public JsonParserTest() {
+        super();
+        if (!Charset.defaultCharset().equals(Charset.forName("UTF-8"))) {
+            throw new RuntimeException("Default charset is " + Charset.defaultCharset() + ", must must be UTF-8");
+        }
+    }
+
+    private void assertSimple(final JsonParser parser) {
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_STRING, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("c", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(4, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("d", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_ARRAY, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(1, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(-2, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_ARRAY, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_OBJECT, event);
+        }
+        {
+            assertFalse(parser.hasNext());
+        }
+        parser.close();
+    }
+
+    @Test
+    public void array() {
+        final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/array.json"));
+        assertNotNull(loadInMemReader);
+        final JsonArray array = loadInMemReader.readArray();
+        assertNotNull(array);
+
+        final JsonParser parser = Json.createParserFactory(Collections.<String, Object>emptyMap()).createParser(array);
+        assertNotNull(parser);
+
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_ARRAY, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_STRING, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(1, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_STRING, event);
+            assertEquals("c", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(5, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_ARRAY, event);
+        }
+        {
+            assertFalse(parser.hasNext());
+        }
+    }
+
+    @Test
+    public void simpleInMemory() {
+        final JsonObjectBuilder ob = Json.createObjectBuilder();
+        ob.add("a", new JsonStringImpl("b"));
+        ob.add("c", new JsonNumberImpl(new BigDecimal(4)));
+        JsonArrayBuilder ab = Json.createArrayBuilder();
+        ab.add(new JsonNumberImpl(new BigDecimal(1)));
+        ab.add(new JsonNumberImpl(new BigDecimal(-2)));
+        
+        ob.add("d", ab);
+
+        final JsonParser parser = Json.createParserFactory(Collections.<String, Object>emptyMap()).createParser(ob.build());
+        assertNotNull(parser);
+        assertSimple(parser);
+    }
+
+    @Test
+    public void simple() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"));
+        assertNotNull(parser);
+        assertSimple(parser);
+    }
+    
+    @Test
+    public void simpleUTF16LE() {
+        final JsonParser parser = Json.createParserFactory(null).createParser(Thread.currentThread()
+                .getContextClassLoader().getResourceAsStream("json/simple_utf16le.json"),UTF_16LE);
+        assertNotNull(parser);
+        assertSimple(parser);
+    }
+    
+    @Test
+    public void simpleUTF16LEAutoDetect() {
+        final JsonParser parser = Json.createParserFactory(null).createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple_utf16le.json"));
+        assertNotNull(parser);
+        assertSimple(parser);
+    }
+    
+
+    @Test
+    public void nested() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/nested.json"));
+        assertNotNull(parser);
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_STRING, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("c", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("d", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_ARRAY, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(1, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertEquals(2, parser.getInt());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_ARRAY, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_OBJECT, event);
+        }
+        {
+            assertFalse(parser.hasNext());
+        }
+        parser.close();
+    }
+
+    
+    @Test
+    public void numbers() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/numbers.json"));
+        assertNotNull(parser);
+        parser.next();
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(0, parser.getInt());
+            assertEquals(0, parser.getLong());
+            assertEquals(new BigDecimal(0), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(0, parser.getInt());
+            assertEquals(0, parser.getLong());
+            assertEquals(new BigDecimal(0), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(1, parser.getInt());
+            assertEquals(1, parser.getLong());
+            assertEquals(new BigDecimal(1), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(-1, parser.getInt());
+            assertEquals(-1L, parser.getLong());
+            assertEquals(new BigDecimal(-1), parser.getBigDecimal());
+        }
+
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(9, parser.getInt());
+            assertEquals(9L, parser.getLong());
+            assertEquals(new BigDecimal(9), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(-9, parser.getInt());
+            assertEquals(-9, parser.getLong());
+            assertEquals(new BigDecimal(-9), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(10, parser.getInt());
+            assertEquals(10, parser.getLong());
+            assertEquals(new BigDecimal(10), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(-10, parser.getInt());
+            assertEquals(-10, parser.getLong());
+            assertEquals(new BigDecimal(-10), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(100, parser.getInt());
+            assertEquals(100, parser.getLong());
+            assertEquals(new BigDecimal(100), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(-100, parser.getInt());
+            assertEquals(-100, parser.getLong());
+            assertEquals(new BigDecimal(-100), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(456, parser.getInt());
+            assertEquals(456, parser.getLong());
+            assertEquals(new BigDecimal(456), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            assertEquals(-456, parser.getInt());
+            assertEquals(-456, parser.getLong());
+            assertEquals(new BigDecimal(-456), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(!parser.isIntegralNumber());
+            assertEquals(123, parser.getInt());
+            assertEquals(123, parser.getLong());
+            assertEquals(new BigDecimal("123.12345"), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(!parser.isIntegralNumber());
+            assertEquals(-123, parser.getInt());
+            assertEquals(-123, parser.getLong());
+            assertEquals(new BigDecimal("-123.12345"), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            //assertEquals(Integer.MAX_VALUE, parser.getInt());
+            //assertEquals(Long.MAX_VALUE, parser.getLong());
+            assertEquals(new BigDecimal("999999999999999999999999999999"), parser.getBigDecimal());
+        }
+        parser.next();
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertTrue(parser.isIntegralNumber());
+            //assertEquals(Integer.MIN_VALUE, parser.getInt());
+            //assertEquals(Long.MIN_VALUE, parser.getLong());
+            assertEquals(new BigDecimal("-999999999999999999999999999999"), parser.getBigDecimal());
+        }
+        parser.next();
+        
+        {
+            assertFalse(parser.hasNext());
+        }
+        parser.close();
+    }
+    
+    
+    @Test
+    public void bigdecimal() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/bigdecimal.json"));
+        assertNotNull(parser);
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.START_OBJECT, event);
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("a", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertFalse(parser.isIntegralNumber());
+            assertEquals(new BigDecimal("1.23E3"), parser.getBigDecimal());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("b", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertFalse(parser.isIntegralNumber());
+            assertEquals(new BigDecimal("1.23E-3"), parser.getBigDecimal());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.KEY_NAME, event);
+            assertEquals("c", parser.getString());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
+            assertFalse(parser.isIntegralNumber());
+            assertEquals(new BigDecimal("1.23E+3"), parser.getBigDecimal());
+        }
+        {
+            assertTrue(parser.hasNext());
+            final JsonParser.Event event = parser.next();
+            assertNotNull(event);
+            assertEquals(JsonParser.Event.END_OBJECT, event);
+        }
+        {
+            assertFalse(parser.hasNext());
+        }
+        parser.close();
+    }
+    
+    @Test(expected=IllegalStateException.class)
+    public void isIntegralThrowsISE() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/bigdecimal.json"));
+        assertNotNull(parser);
+        assertTrue(parser.hasNext());
+        final JsonParser.Event event = parser.next();
+        assertNotNull(event);
+        assertEquals(JsonParser.Event.START_OBJECT, event);
+        assertFalse(parser.isIntegralNumber());
+            
+    }
+    
+    @Test
+    public void escaping() {
+        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/escaping.json"));
+        parser.next();
+        parser.next();
+        assertEquals("\"", parser.getString());
+        parser.next();
+        assertEquals("\\", parser.getString());
+        parser.next();
+        assertEquals("/", parser.getString());
+        parser.next();
+        assertEquals("\b", parser.getString());
+        parser.next();
+        assertEquals("\f", parser.getString());
+        parser.next();
+        assertEquals("\n", parser.getString());
+        parser.next();
+        assertEquals("\r", parser.getString());
+        parser.next();
+        assertEquals("\t", parser.getString());
+        parser.next();
+        assertEquals("D", parser.getString());
+        parser.next();
+        assertFalse(parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void escapedStringAwareParser() {
+        final JsonParser parser = Json.createParser(Thread.currentThread()
+                .getContextClassLoader().getResourceAsStream("json/stringescape.json"));
+        parser.next();
+        parser.next();
+        parser.next();
+        assertEquals("s\"mit\"", parser.getString());
+        assertEquals("\"s\\\"mit\\\"\"", new JsonStringImpl(parser.getString()).toString());
+        parser.close();
+    }
+
+    @Test
+    public void dosProtected() {
+        // strings
+        {
+            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
+                        put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
+                    }}).createParser(new InputStream() {
+                private int index = 0;
+
+                @Override
+                public int read() throws IOException {
+                    switch (index) {
+                        case 0:
+                            index++;
+                            return '{';
+                        case 1:
+                            index++;
+                            return '"';
+                        default: break;
+                    }
+                    return 'a'; // infinite key
+                }
+            });
+            assertEquals(JsonParser.Event.START_OBJECT, parser.next());
+            try {
+                parser.next(); // should fail cause we try to make a OOME
+                fail();
+            } catch (final JsonParsingException expected) {
+                // no-op
+            }
+            parser.close();
+        }
+        
+        
+        // spaces
+        {
+            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
+                        put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
+                    }}).createParser(new InputStream() {
+                private int index = 0;
+
+                @Override
+                public int read() throws IOException {
+                    switch (index) {
+                        case 0:
+                            index++;
+                            return '{';
+                        default: break;
+                    }
+                    return ' '; // infinite spaces
+                }
+            });
+            assertEquals(JsonParser.Event.START_OBJECT, parser.next());
+            try { // should fail cause we try to make a OOME
+                while (parser.hasNext()) {
+                    parser.next();
+                }
+                fail();
+            } catch (final JsonParsingException expected) {
+                // no-op
+            }
+            parser.close();
+        }
+    }
+
+    @Test
+    public void hasNext() {
+        final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
+            put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
+        }}).createParser(new ByteArrayInputStream("{}".getBytes()));
+        assertTrue(parser.hasNext());
+        assertTrue(parser.hasNext());
+        assertTrue(parser.hasNext());
+        assertTrue(parser.hasNext());
+        assertEquals(JsonParser.Event.START_OBJECT, parser.next());
+        parser.close();
+    }
+
+    @Test(expected = JsonParsingException.class)
+    public void commaChecks() {
+        // using a reader as wrapper of parser
+  
+        Json.createReader(new ByteArrayInputStream("{\"z\":\"b\"\"j\":\"d\"}".getBytes())).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void literalFailChecksTrue() {
+        // using a reader as wrapper of parser
+  
+        Json.createReader(new ByteArrayInputStream("{\"z\":truet}".getBytes())).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void literalFailChecksNull() {
+        // using a reader as wrapper of parser
+  
+        Json.createReader(new ByteArrayInputStream("{\"z\":nulll}".getBytes())).read();
+    }
+    
+    @Test(expected = JsonException.class)
+    public void zeroByteInput() {
+        // using a reader as wrapper of parser
+  
+        Json.createReader(new ByteArrayInputStream(new byte[]{})).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void zeroCharInput() {
+        // using a reader as wrapper of parser
+  
+        Json.createReader(new CharArrayReader(new char[]{})).read();
+    }
+    
+    @Test
+    public void testUTF32LEStream() {
+        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF32LE\"]".getBytes(UTF_32LE));
+        JsonParser parser = Json.createParser(bin);
+        parser.next();
+        parser.next();
+        assertEquals("UTF32LE", parser.getString());
+        parser.next();
+        assertTrue(!parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void testUTF32BEStream() {
+        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF32BE\"]".getBytes(UTF_32BE));
+        JsonParser parser = Json.createParser(bin);
+        parser.next();
+        parser.next();
+        assertEquals("UTF32BE", parser.getString());
+        parser.next();
+        assertTrue(!parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void testUTF16BEStream() {
+        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF16BE\"]".getBytes(UTF_16BE));
+        JsonParser parser = Json.createParser(bin);
+        parser.next();
+        parser.next();
+        assertEquals("UTF16BE", parser.getString());
+        parser.next();
+        assertTrue(!parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void testUTF16LEStream() {
+        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF16LE\"]".getBytes(UTF_16LE));
+        JsonParser parser = Json.createParser(bin);
+        parser.next();
+        parser.next();
+        assertEquals("UTF16LE", parser.getString());
+        parser.next();
+        assertTrue(!parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void testUTF8Stream() {
+        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF8\"]".getBytes(UTF_8));
+        JsonParser parser = Json.createParser(bin);
+        parser.next();
+        parser.next();
+        assertEquals("UTF8", parser.getString());
+        parser.next();
+        assertTrue(!parser.hasNext());
+        parser.close();
+    }
+    
+    @Test
+    public void shortestNonEmtyJsonFile() {
+        // using a reader as wrapper of parser
+  
+        assertEquals(0L, Json.createReader(new ByteArrayInputStream("[0]".getBytes())).readArray().getJsonNumber(0).longValue());
+    }
+    
+    
+    @Test
+    public void shortestNonEmtyJsonFileWithWhiteSpaceChars() {
+        // using a reader as wrapper of parser
+  
+        assertEquals(0L, Json.createReader(new ByteArrayInputStream("  \n\n   [   0  ]  \n\n".getBytes())).readArray().getJsonNumber(0).longValue());
+    }
+    
+    @Test
+    public void escapeStart() {
+        // using a reader as wrapper of parser
+  
+        assertEquals("\\abcdef", Json.createReader(new ByteArrayInputStream("[\"\\\\abcdef\"]".getBytes())).readArray().getString(0));
+    }
+    
+    @Test
+    public void escapeStart2() {
+        // using a reader as wrapper of parser
+  
+        assertEquals("\"abcdef", Json.createReader(new ByteArrayInputStream("[\"\\\"abcdef\"]".getBytes())).readArray().getString(0));
+    }
+    
+    @Test
+    public void threeLiterals() {
+        final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
+            put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
+        }}).createParser(new ByteArrayInputStream("{\"a\":true,\"b\":null,\"c\":false,\"arr\":[false, true, null]}".getBytes()));
+        parser.next();
+        parser.next();
+        assertEquals(JsonParser.Event.VALUE_TRUE, parser.next());
+        parser.next();
+        assertEquals(JsonParser.Event.VALUE_NULL, parser.next());
+        parser.next();
+        assertEquals(JsonParser.Event.VALUE_FALSE, parser.next());
+        parser.next();
+        parser.next();
+        assertEquals(JsonParser.Event.VALUE_FALSE, parser.next());
+        assertEquals(JsonParser.Event.VALUE_TRUE, parser.next());
+        assertEquals(JsonParser.Event.VALUE_NULL, parser.next());
+        parser.close();
+    }
+    
+    @Test
+    public void maxStringStringOK() {
+        // using a reader as wrapper of parser
+        Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.max-string-length", "5");
+            }
+        }).createReader(new ByteArrayInputStream("[\"abcde\"]".getBytes())).read();
+       
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void maxStringStringFail() {
+        // using a reader as wrapper of parser
+        Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.max-string-length", "5");
+            }
+        }).createReader(new ByteArrayInputStream("[\"abcdef\"]".getBytes())).read();
+       
+    }
+    
+    @Test
+    public void maxStringNumberOK() {
+        // using a reader as wrapper of parser
+        Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.max-string-length", "5");
+            }
+        }).createReader(new ByteArrayInputStream("[12.3]".getBytes())).read();
+       
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void maxStringNumberFail() {
+        // using a reader as wrapper of parser
+        Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.max-string-length", "5");
+            }
+        }).createReader(new ByteArrayInputStream("[12.333]".getBytes())).read();
+       
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void maxStringWhitespace() {
+        // using a reader as wrapper of parser
+        Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.max-string-length", "5");
+            }
+        }).createReader(new ByteArrayInputStream("[\"12\"           ]".getBytes())).read();
+       
+    }
+    
+    
+    @Test
+    public void testEmptyArray() {
+       JsonParser parser = Json.createParser(new ByteArrayInputStream("[]".getBytes()));
+        assertEquals(Event.START_ARRAY, parser.next());
+        assertEquals(Event.END_ARRAY, parser.next());
+        assertEquals(false, parser.hasNext());
+        try {
+            parser.next();
+            fail("Should have thrown a NoSuchElementException");
+        } catch (NoSuchElementException ne) {
+            //expected
+        }
+    }
+    
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail1() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail1.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail2() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail2.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail3() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail3.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail4() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail4.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail5() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail5.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail6() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail6.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail7() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail7.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail8() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail8.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail9() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail9.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail10() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail10.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail11() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail11.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail12() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail12.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail13() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail13.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail14() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail14.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail15() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail15.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail16() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail16.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail17() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail17.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail18() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail18.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail19() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail19.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail20() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail20.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail21() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail21.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail22() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail22.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail23() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail23.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail24() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail24.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail25() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail25.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail26() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail26.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail27() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail27.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail28() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail28.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail29() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail29.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail30() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail30.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail31() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail31.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail32() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail32.json")).read();
+    }
+    
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail33() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail33.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail34() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail34.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail35() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail35.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail36() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail36.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail37() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail37.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail38() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail38.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail39() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail39.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail40() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail40.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail41() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail41.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail42() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail42.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail43() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail43.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail44() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail44.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail45() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail45.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail46() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail46.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail47() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail47.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail48() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail48.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail49() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail49.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail50() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail50.json")).read();
+    }
+    
+    //@Test(expected = JsonParsingException.class)
+    public void fail51() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail51.json")).read();
+    }
+    
+    //@Test(expected = JsonParsingException.class)
+    public void fail52() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail52.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail53() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail53.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail54() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail54.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail55() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail55.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail56() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail56.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail57() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail57.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail58() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail58.json")).read();
+    }
+    
+    @Test(expected = JsonException.class)
+    public void fail59() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail59.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail60() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail60.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail61() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail61.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail62() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail62.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail63() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail63.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail64() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail64.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail65() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail65.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail66() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail66.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail67() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail67.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail68() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail68.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail69() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail69.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail70() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail70.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail71() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail71.json")).read();
+    }
+    
+    @Test(expected = JsonParsingException.class)
+    public void fail72() {
+        
+        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail72.json")).read();
+    }
+    
+    
+    @Test
+    public void stringescapeVariousBufferSizesBogus() {
+        
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("\t\"special-\":" + "\"" + "\\\\f\\n\\r\\t\\u6565\uDC00\uD800" + "\",\n");
+        sb.append("\t\"unicode-\\u0000- \":\"\\u5656\uDC00\uD800\"\n");
+        String s = "{"+sb.toString()+"}";
+       
+        for (int i = 1; i < s.length()+100; i++) {
+            final String value = String.valueOf(i);
+
+            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {
+                {
+                    put("org.apache.johnzon.default-char-buffer", value);
+                }
+            }).createParser(new ByteArrayInputStream(s.getBytes()));
+            assertNotNull(parser);
+            
+            while(parser.hasNext()) {
+                Event e = parser.next();
+                if(e==null) {
+                    fail();
+                }
+            }
+            
+            assertTrue(!parser.hasNext());
+            parser.close();
+            
+        }
+    }
+    
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
new file mode 100644
index 0000000..465945e
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonReaderImplTest.java
@@ -0,0 +1,453 @@
+/*
+ * 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 static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.JsonStructure;
+
+import org.junit.Test;
+
+public class JsonReaderImplTest {
+    
+    
+    
+    public JsonReaderImplTest() {
+        super();
+        if (!Charset.defaultCharset().equals(Charset.forName("UTF-8"))) {
+            throw new RuntimeException("Default charset is " + Charset.defaultCharset() + ", must must be UTF-8");
+        }
+    }
+
+    protected static Charset utf8Charset = Charset.forName("UTF8");
+    protected static Charset asciiCharset = Charset.forName("ASCII");
+
+    @SuppressWarnings("unchecked")
+    protected Map<String, ?> getFactoryConfig() {
+        return Collections.EMPTY_MAP;
+    }
+
+    @Test
+    public void simple() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(3, object.size());
+        assertEquals("b", object.getString("a"));
+        assertEquals(4, object.getInt("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(2, array.size());
+        assertEquals(1, array.getInt(0));
+        assertEquals(-2, array.getInt(1));
+        reader.close();
+    }
+
+    @Test
+    public void unicode() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/unicode.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(String.valueOf('\u6565'), object.getString("a"));
+        assertEquals("", object.getString("z"));
+        assertEquals(String.valueOf('\u0000'), object.getString("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(3, array.size());
+        assertEquals(-2, array.getInt(0));
+        assertEquals(" ", array.getString(1));
+        assertEquals("", array.getString(2));
+        assertEquals(5, object.size());
+        reader.close();
+    }
+
+    @Test
+    public void unicodeWithIoReader() {
+        final Reader ioReader = new InputStreamReader(Thread.currentThread().getContextClassLoader()
+                .getResourceAsStream("json/unicode.json"), utf8Charset);
+        final JsonReader reader = Json.createReader(ioReader);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(String.valueOf('\u6565'), object.getString("a"));
+        assertEquals("", object.getString("z"));
+        assertEquals(String.valueOf('\u0000'), object.getString("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(3, array.size());
+        assertEquals(-2, array.getInt(0));
+        assertEquals(" ", array.getString(1));
+        assertEquals("", array.getString(2));
+        assertEquals(5, object.size());
+        reader.close();
+    }
+
+    @Test
+    public void special() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/special.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(9, object.size());
+        assertEquals("b,,", object.getString("a{"));
+        assertEquals(":4::,[{", object.getString("c::::"));
+        assertTrue(object.getJsonNumber("w").doubleValue() > 4 && object.getJsonNumber("w").doubleValue() < 5);
+        assertEquals(110, object.getInt("1.4312"));
+        assertEquals("\"", object.getString("\""));
+        assertTrue(object.isNull("\u0044"));
+        assertEquals("ন:4::,[{", object.getString("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#"));
+        reader.close();
+    }
+
+    @Test
+    public void specialWithIoReader() {
+        final Reader ioReader = new InputStreamReader(Thread.currentThread().getContextClassLoader()
+                .getResourceAsStream("json/special.json"), utf8Charset);
+        final JsonReader reader = Json.createReader(ioReader);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(9, object.size());
+        assertEquals("b,,", object.getString("a{"));
+        assertEquals(":4::,[{", object.getString("c::::"));
+        assertTrue(object.getJsonNumber("w").doubleValue() > 4 && object.getJsonNumber("w").doubleValue() < 5);
+        assertEquals(110, object.getInt("1.4312"));
+        assertEquals("\"", object.getString("\""));
+        assertEquals("ন:4::,[{", object.getString("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#"));
+        reader.close();
+    }
+
+    @Test
+    public void specialWithStringAsByteArrayInputStream() {
+        final String s = "{\"নa\":\"hallo\u20acö\uffff \u08a5 থ?ߧ$%&´'`*+#\udbff\udfff\"}";
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(1, object.size());
+        assertEquals("hallo\u20acö\uffff \u08a5 থ?ߧ$%&´'`*+#\udbff\udfff", object.getString("নa"));
+        reader.close();
+    }
+    
+    @Test
+    public void specialKeysWithStringAsByteArrayInputStream() {
+        final String s = "{\"\\\"a\":\"\u0055\",\"\u0055\":\"test2\"}";
+        System.out.println(s);
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(2, object.size());
+        assertEquals("U", object.getString("\"a"));
+        assertEquals("test2", object.getString("U"));
+        reader.close();
+    }
+
+    @Test
+    public void specialWithStringReader() {
+        final String s = "{\"ন:4::,[{\u08a5\":\"থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\ua5a5\"}";
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new InputStreamReader(new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset));
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(1, object.size());
+        assertEquals("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\ua5a5", object.getString("ন:4::,[{\u08a5"));
+        reader.close();
+    }
+
+    @Test
+    public void unicode4Bytes() {
+        final int codepoint = 128149;
+        final char[] charPair = Character.toChars(codepoint);
+        assertNotNull(charPair);
+        assertEquals(2, charPair.length);
+        assertTrue(Character.isHighSurrogate(charPair[0]));
+        assertTrue(Character.isLowSurrogate(charPair[1]));
+        assertTrue(Character.isSurrogatePair(charPair[0], charPair[1]));
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                (new ByteArrayInputStream(("{\"\":\"Ö" + charPair[0] + charPair[1] + "\"}").getBytes(utf8Charset))),
+                utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+
+        assertEquals(codepoint, object.getString("").codePointAt(1));
+        assertEquals("Ö" + new String(charPair), object.getString(""));
+        assertEquals(1, object.size());
+        reader.close();
+    }
+
+    @Test
+    public void unicode3Bytes() {
+        final char[] charPair = Character.toChars("\uffff".codePointAt(0));
+        assertNotNull(charPair);
+        assertEquals(1, charPair.length);
+        assertTrue(!Character.isLowSurrogate(charPair[0]));
+        assertTrue(!Character.isHighSurrogate(charPair[0]));
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new ByteArrayInputStream(("{\"\":\"\uffff\"}").getBytes(utf8Charset)), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(String.valueOf('\uffff'), object.getString(""));
+        assertEquals(1, object.size());
+        reader.close();
+    }
+
+    @Test
+    public void unicode2Bytes() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new ByteArrayInputStream(("{\"\":\"Ö\u00d6\"}").getBytes(utf8Charset)), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals("Ö\u00d6", object.getString(""));
+        assertEquals(1, object.size());
+        reader.close();
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void unicodeFailAscii() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                new ByteArrayInputStream(
+                        "{\"ন:4::,[{\udbff\udfff\":\"থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\udbff\udfff\"}".getBytes(asciiCharset)),
+                utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(1, object.size());
+        assertEquals("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\udbff\udfff", object.getString("ন:4::,[{\udbff\udfff"));
+        reader.close();
+    }
+
+    @Test
+    public void parseHuge1MbJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/huge_1mb.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void parseBig600KbJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/big_600kb.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void parseLarge130KbJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/large_130kb.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void parseMedium11KbJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/medium_11kb.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void parseSmall3KbJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/small_3kb.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void parseTiny50BJsonFile() {
+        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
+                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/tiny_50b.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonStructure object = reader.read();
+        assertNotNull(object);
+        reader.close();
+    }
+
+    @Test
+    public void simpleBadBufferSize8() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "8");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(3, object.size());
+        assertEquals("b", object.getString("a"));
+        assertEquals(4, object.getInt("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(2, array.size());
+        assertEquals(1, array.getInt(0));
+        assertEquals(-2, array.getInt(1));
+        reader.close();
+    }
+    
+    @Test
+    public void simple2BadBufferSize8() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "8");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple2.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(3, object.size());
+        assertEquals("b", object.getString("a"));
+        assertEquals(4, object.getInt("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(2, array.size());
+        assertEquals(1, array.getInt(0));
+        assertEquals(-2, array.getInt(1));
+        reader.close();
+    }
+
+    @Test
+    public void simpleBadBufferSize9() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "9");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(3, object.size());
+        assertEquals("b", object.getString("a"));
+        assertEquals(4, object.getInt("c"));
+        assertThat(object.get("d"), instanceOf(JsonArray.class));
+        final JsonArray array = object.getJsonArray("d");
+        assertNotNull(array);
+        assertEquals(2, array.size());
+        assertEquals(1, array.getInt(0));
+        assertEquals(-2, array.getInt(1));
+        reader.close();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void emptyZeroCharBuffersize() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "0");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/empty.json"), utf8Charset);
+        assertNotNull(reader);
+        reader.readObject();
+        reader.close();
+    }
+
+    @Test
+    public void emptyOneCharBufferSize() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "1");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/empty.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonObject object = reader.readObject();
+        assertNotNull(object);
+        assertEquals(0, object.size());
+        reader.close();
+    }
+
+    @Test
+    public void emptyArrayOneCharBufferSize() {
+        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+            {
+                put("org.apache.johnzon.default-char-buffer", "1");
+            }
+        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/emptyarray.json"), utf8Charset);
+        assertNotNull(reader);
+        final JsonArray array = reader.readArray();
+        assertNotNull(array);
+        assertEquals(0, array.size());
+        reader.close();
+    }
+
+    @Test
+    public void stringescapeVariousBufferSizes() {
+        final int[] buffersizes = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
+                26, 27, 28, 32, 64, 128, 1024, 8192 };
+
+        for (int i = 0; i < buffersizes.length; i++) {
+            final String value = String.valueOf(buffersizes[i]);
+            final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
+                {
+                    put("org.apache.johnzon.default-char-buffer", value);
+                }
+            }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/stringescape.json"),
+                    utf8Charset);
+            assertNotNull(reader);
+            final JsonObject object = reader.readObject();
+            assertNotNull(object);
+            assertEquals(1, object.size());
+            assertEquals("s\"mit\"", object.getString("name"));
+            reader.close();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
new file mode 100644
index 0000000..d9b2ecd
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonWriterImplTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+
+import javax.json.Json;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonWriter;
+
+import org.junit.Test;
+
+public class JsonWriterImplTest {
+    @Test
+    public void writer() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final JsonWriter writer = Json.createWriter(out);
+        final JsonObjectBuilder ob = Json.createObjectBuilder();
+        ob.add("a", new JsonStringImpl("b"));
+        writer.write(ob.build());
+        writer.close();
+        assertEquals("{\"a\":\"b\"}", new String(out.toByteArray()));
+    }
+}


[05/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/huge_1mb.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/huge_1mb.json b/johnzon-core/src/test/resources/bench/huge_1mb.json
new file mode 100644
index 0000000..2ac39d0
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/huge_1mb.json
@@ -0,0 +1,44003 @@
+{
+	"special-0":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 0":"\u5656",
+	"bigdecimal0":7817265.00000111,
+	"bigdecimal-2-0":127655512123456.761009E-123,
+	"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int0":4561,
+	"ints0":0,
+	"false0":false,
+	"nil0":false,
+	"n0":      null                ,
+	"obj0":
+		{
+			"special-0":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 0":"\u5656",
+	"bigdecimal0":7817265.00000111,
+			"bigdecimal-2-0":127655512123456.761009E-123,
+			"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int0":4561,
+			"ints0":0,
+			"false0":false,
+			"nil0":false,
+			"obj0":      null                ,
+			"obj0":
+				[    true    ,
+				{
+				"special-0":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 0":"\u5656",
+				"bigdecimal0":7817265.00000111,
+				"bigdecimal-2-0":127655512123456.761009E-123,
+				"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int0":4561,
+				"ints0":0,
+				"false0":false,
+				"nil0":false,
+				"obj0":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-1":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 1":"\u5656",
+	"bigdecimal1":7817265.00000111,
+	"bigdecimal-2-1":127655512123456.761009E-123,
+	"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int1":4561,
+	"ints1":0,
+	"false1":false,
+	"nil1":false,
+	"n1":      null                ,
+	"obj1":
+		{
+			"special-1":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 1":"\u5656",
+	"bigdecimal1":7817265.00000111,
+			"bigdecimal-2-1":127655512123456.761009E-123,
+			"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int1":4561,
+			"ints1":0,
+			"false1":false,
+			"nil1":false,
+			"obj1":      null                ,
+			"obj1":
+				[    true    ,
+				{
+				"special-1":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 1":"\u5656",
+				"bigdecimal1":7817265.00000111,
+				"bigdecimal-2-1":127655512123456.761009E-123,
+				"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int1":4561,
+				"ints1":0,
+				"false1":false,
+				"nil1":false,
+				"obj1":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-2":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 2":"\u5656",
+	"bigdecimal2":7817265.00000111,
+	"bigdecimal-2-2":127655512123456.761009E-123,
+	"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int2":4561,
+	"ints2":0,
+	"false2":false,
+	"nil2":false,
+	"n2":      null                ,
+	"obj2":
+		{
+			"special-2":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 2":"\u5656",
+	"bigdecimal2":7817265.00000111,
+			"bigdecimal-2-2":127655512123456.761009E-123,
+			"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int2":4561,
+			"ints2":0,
+			"false2":false,
+			"nil2":false,
+			"obj2":      null                ,
+			"obj2":
+				[    true    ,
+				{
+				"special-2":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 2":"\u5656",
+				"bigdecimal2":7817265.00000111,
+				"bigdecimal-2-2":127655512123456.761009E-123,
+				"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int2":4561,
+				"ints2":0,
+				"false2":false,
+				"nil2":false,
+				"obj2":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-3":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 3":"\u5656",
+	"bigdecimal3":7817265.00000111,
+	"bigdecimal-2-3":127655512123456.761009E-123,
+	"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int3":4561,
+	"ints3":0,
+	"false3":false,
+	"nil3":false,
+	"n3":      null                ,
+	"obj3":
+		{
+			"special-3":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 3":"\u5656",
+	"bigdecimal3":7817265.00000111,
+			"bigdecimal-2-3":127655512123456.761009E-123,
+			"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int3":4561,
+			"ints3":0,
+			"false3":false,
+			"nil3":false,
+			"obj3":      null                ,
+			"obj3":
+				[    true    ,
+				{
+				"special-3":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 3":"\u5656",
+				"bigdecimal3":7817265.00000111,
+				"bigdecimal-2-3":127655512123456.761009E-123,
+				"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int3":4561,
+				"ints3":0,
+				"false3":false,
+				"nil3":false,
+				"obj3":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-4":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 4":"\u5656",
+	"bigdecimal4":7817265.00000111,
+	"bigdecimal-2-4":127655512123456.761009E-123,
+	"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int4":4561,
+	"ints4":0,
+	"false4":false,
+	"nil4":false,
+	"n4":      null                ,
+	"obj4":
+		{
+			"special-4":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 4":"\u5656",
+	"bigdecimal4":7817265.00000111,
+			"bigdecimal-2-4":127655512123456.761009E-123,
+			"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int4":4561,
+			"ints4":0,
+			"false4":false,
+			"nil4":false,
+			"obj4":      null                ,
+			"obj4":
+				[    true    ,
+				{
+				"special-4":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 4":"\u5656",
+				"bigdecimal4":7817265.00000111,
+				"bigdecimal-2-4":127655512123456.761009E-123,
+				"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int4":4561,
+				"ints4":0,
+				"false4":false,
+				"nil4":false,
+				"obj4":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-5":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 5":"\u5656",
+	"bigdecimal5":7817265.00000111,
+	"bigdecimal-2-5":127655512123456.761009E-123,
+	"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int5":4561,
+	"ints5":0,
+	"false5":false,
+	"nil5":false,
+	"n5":      null                ,
+	"obj5":
+		{
+			"special-5":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 5":"\u5656",
+	"bigdecimal5":7817265.00000111,
+			"bigdecimal-2-5":127655512123456.761009E-123,
+			"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int5":4561,
+			"ints5":0,
+			"false5":false,
+			"nil5":false,
+			"obj5":      null                ,
+			"obj5":
+				[    true    ,
+				{
+				"special-5":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 5":"\u5656",
+				"bigdecimal5":7817265.00000111,
+				"bigdecimal-2-5":127655512123456.761009E-123,
+				"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int5":4561,
+				"ints5":0,
+				"false5":false,
+				"nil5":false,
+				"obj5":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-6":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 6":"\u5656",
+	"bigdecimal6":7817265.00000111,
+	"bigdecimal-2-6":127655512123456.761009E-123,
+	"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int6":4561,
+	"ints6":0,
+	"false6":false,
+	"nil6":false,
+	"n6":      null                ,
+	"obj6":
+		{
+			"special-6":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 6":"\u5656",
+	"bigdecimal6":7817265.00000111,
+			"bigdecimal-2-6":127655512123456.761009E-123,
+			"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int6":4561,
+			"ints6":0,
+			"false6":false,
+			"nil6":false,
+			"obj6":      null                ,
+			"obj6":
+				[    true    ,
+				{
+				"special-6":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 6":"\u5656",
+				"bigdecimal6":7817265.00000111,
+				"bigdecimal-2-6":127655512123456.761009E-123,
+				"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int6":4561,
+				"ints6":0,
+				"false6":false,
+				"nil6":false,
+				"obj6":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-7":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 7":"\u5656",
+	"bigdecimal7":7817265.00000111,
+	"bigdecimal-2-7":127655512123456.761009E-123,
+	"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int7":4561,
+	"ints7":0,
+	"false7":false,
+	"nil7":false,
+	"n7":      null                ,
+	"obj7":
+		{
+			"special-7":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 7":"\u5656",
+	"bigdecimal7":7817265.00000111,
+			"bigdecimal-2-7":127655512123456.761009E-123,
+			"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int7":4561,
+			"ints7":0,
+			"false7":false,
+			"nil7":false,
+			"obj7":      null                ,
+			"obj7":
+				[    true    ,
+				{
+				"special-7":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 7":"\u5656",
+				"bigdecimal7":7817265.00000111,
+				"bigdecimal-2-7":127655512123456.761009E-123,
+				"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int7":4561,
+				"ints7":0,
+				"false7":false,
+				"nil7":false,
+				"obj7":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-8":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 8":"\u5656",
+	"bigdecimal8":7817265.00000111,
+	"bigdecimal-2-8":127655512123456.761009E-123,
+	"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int8":4561,
+	"ints8":0,
+	"false8":false,
+	"nil8":false,
+	"n8":      null                ,
+	"obj8":
+		{
+			"special-8":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 8":"\u5656",
+	"bigdecimal8":7817265.00000111,
+			"bigdecimal-2-8":127655512123456.761009E-123,
+			"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int8":4561,
+			"ints8":0,
+			"false8":false,
+			"nil8":false,
+			"obj8":      null                ,
+			"obj8":
+				[    true    ,
+				{
+				"special-8":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 8":"\u5656",
+				"bigdecimal8":7817265.00000111,
+				"bigdecimal-2-8":127655512123456.761009E-123,
+				"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int8":4561,
+				"ints8":0,
+				"false8":false,
+				"nil8":false,
+				"obj8":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-9":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 9":"\u5656",
+	"bigdecimal9":7817265.00000111,
+	"bigdecimal-2-9":127655512123456.761009E-123,
+	"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int9":4561,
+	"ints9":0,
+	"false9":false,
+	"nil9":false,
+	"n9":      null                ,
+	"obj9":
+		{
+			"special-9":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 9":"\u5656",
+	"bigdecimal9":7817265.00000111,
+			"bigdecimal-2-9":127655512123456.761009E-123,
+			"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int9":4561,
+			"ints9":0,
+			"false9":false,
+			"nil9":false,
+			"obj9":      null                ,
+			"obj9":
+				[    true    ,
+				{
+				"special-9":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 9":"\u5656",
+				"bigdecimal9":7817265.00000111,
+				"bigdecimal-2-9":127655512123456.761009E-123,
+				"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int9":4561,
+				"ints9":0,
+				"false9":false,
+				"nil9":false,
+				"obj9":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-10":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 10":"\u5656",
+	"bigdecimal10":7817265.00000111,
+	"bigdecimal-2-10":127655512123456.761009E-123,
+	"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int10":4561,
+	"ints10":0,
+	"false10":false,
+	"nil10":false,
+	"n10":      null                ,
+	"obj10":
+		{
+			"special-10":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 10":"\u5656",
+	"bigdecimal10":7817265.00000111,
+			"bigdecimal-2-10":127655512123456.761009E-123,
+			"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int10":4561,
+			"ints10":0,
+			"false10":false,
+			"nil10":false,
+			"obj10":      null                ,
+			"obj10":
+				[    true    ,
+				{
+				"special-10":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 10":"\u5656",
+				"bigdecimal10":7817265.00000111,
+				"bigdecimal-2-10":127655512123456.761009E-123,
+				"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int10":4561,
+				"ints10":0,
+				"false10":false,
+				"nil10":false,
+				"obj10":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-11":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 11":"\u5656",
+	"bigdecimal11":7817265.00000111,
+	"bigdecimal-2-11":127655512123456.761009E-123,
+	"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int11":4561,
+	"ints11":0,
+	"false11":false,
+	"nil11":false,
+	"n11":      null                ,
+	"obj11":
+		{
+			"special-11":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 11":"\u5656",
+	"bigdecimal11":7817265.00000111,
+			"bigdecimal-2-11":127655512123456.761009E-123,
+			"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int11":4561,
+			"ints11":0,
+			"false11":false,
+			"nil11":false,
+			"obj11":      null                ,
+			"obj11":
+				[    true    ,
+				{
+				"special-11":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 11":"\u5656",
+				"bigdecimal11":7817265.00000111,
+				"bigdecimal-2-11":127655512123456.761009E-123,
+				"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int11":4561,
+				"ints11":0,
+				"false11":false,
+				"nil11":false,
+				"obj11":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-12":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 12":"\u5656",
+	"bigdecimal12":7817265.00000111,
+	"bigdecimal-2-12":127655512123456.761009E-123,
+	"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int12":4561,
+	"ints12":0,
+	"false12":false,
+	"nil12":false,
+	"n12":      null                ,
+	"obj12":
+		{
+			"special-12":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 12":"\u5656",
+	"bigdecimal12":7817265.00000111,
+			"bigdecimal-2-12":127655512123456.761009E-123,
+			"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int12":4561,
+			"ints12":0,
+			"false12":false,
+			"nil12":false,
+			"obj12":      null                ,
+			"obj12":
+				[    true    ,
+				{
+				"special-12":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 12":"\u5656",
+				"bigdecimal12":7817265.00000111,
+				"bigdecimal-2-12":127655512123456.761009E-123,
+				"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int12":4561,
+				"ints12":0,
+				"false12":false,
+				"nil12":false,
+				"obj12":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-13":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 13":"\u5656",
+	"bigdecimal13":7817265.00000111,
+	"bigdecimal-2-13":127655512123456.761009E-123,
+	"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int13":4561,
+	"ints13":0,
+	"false13":false,
+	"nil13":false,
+	"n13":      null                ,
+	"obj13":
+		{
+			"special-13":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 13":"\u5656",
+	"bigdecimal13":7817265.00000111,
+			"bigdecimal-2-13":127655512123456.761009E-123,
+			"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int13":4561,
+			"ints13":0,
+			"false13":false,
+			"nil13":false,
+			"obj13":      null                ,
+			"obj13":
+				[    true    ,
+				{
+				"special-13":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 13":"\u5656",
+				"bigdecimal13":7817265.00000111,
+				"bigdecimal-2-13":127655512123456.761009E-123,
+				"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int13":4561,
+				"ints13":0,
+				"false13":false,
+				"nil13":false,
+				"obj13":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-14":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 14":"\u5656",
+	"bigdecimal14":7817265.00000111,
+	"bigdecimal-2-14":127655512123456.761009E-123,
+	"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int14":4561,
+	"ints14":0,
+	"false14":false,
+	"nil14":false,
+	"n14":      null                ,
+	"obj14":
+		{
+			"special-14":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 14":"\u5656",
+	"bigdecimal14":7817265.00000111,
+			"bigdecimal-2-14":127655512123456.761009E-123,
+			"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int14":4561,
+			"ints14":0,
+			"false14":false,
+			"nil14":false,
+			"obj14":      null                ,
+			"obj14":
+				[    true    ,
+				{
+				"special-14":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 14":"\u5656",
+				"bigdecimal14":7817265.00000111,
+				"bigdecimal-2-14":127655512123456.761009E-123,
+				"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int14":4561,
+				"ints14":0,
+				"false14":false,
+				"nil14":false,
+				"obj14":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-15":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 15":"\u5656",
+	"bigdecimal15":7817265.00000111,
+	"bigdecimal-2-15":127655512123456.761009E-123,
+	"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int15":4561,
+	"ints15":0,
+	"false15":false,
+	"nil15":false,
+	"n15":      null                ,
+	"obj15":
+		{
+			"special-15":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 15":"\u5656",
+	"bigdecimal15":7817265.00000111,
+			"bigdecimal-2-15":127655512123456.761009E-123,
+			"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int15":4561,
+			"ints15":0,
+			"false15":false,
+			"nil15":false,
+			"obj15":      null                ,
+			"obj15":
+				[    true    ,
+				{
+				"special-15":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 15":"\u5656",
+				"bigdecimal15":7817265.00000111,
+				"bigdecimal-2-15":127655512123456.761009E-123,
+				"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int15":4561,
+				"ints15":0,
+				"false15":false,
+				"nil15":false,
+				"obj15":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-16":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 16":"\u5656",
+	"bigdecimal16":7817265.00000111,
+	"bigdecimal-2-16":127655512123456.761009E-123,
+	"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int16":4561,
+	"ints16":0,
+	"false16":false,
+	"nil16":false,
+	"n16":      null                ,
+	"obj16":
+		{
+			"special-16":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 16":"\u5656",
+	"bigdecimal16":7817265.00000111,
+			"bigdecimal-2-16":127655512123456.761009E-123,
+			"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int16":4561,
+			"ints16":0,
+			"false16":false,
+			"nil16":false,
+			"obj16":      null                ,
+			"obj16":
+				[    true    ,
+				{
+				"special-16":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 16":"\u5656",
+				"bigdecimal16":7817265.00000111,
+				"bigdecimal-2-16":127655512123456.761009E-123,
+				"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int16":4561,
+				"ints16":0,
+				"false16":false,
+				"nil16":false,
+				"obj16":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-17":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 17":"\u5656",
+	"bigdecimal17":7817265.00000111,
+	"bigdecimal-2-17":127655512123456.761009E-123,
+	"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int17":4561,
+	"ints17":0,
+	"false17":false,
+	"nil17":false,
+	"n17":      null                ,
+	"obj17":
+		{
+			"special-17":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 17":"\u5656",
+	"bigdecimal17":7817265.00000111,
+			"bigdecimal-2-17":127655512123456.761009E-123,
+			"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int17":4561,
+			"ints17":0,
+			"false17":false,
+			"nil17":false,
+			"obj17":      null                ,
+			"obj17":
+				[    true    ,
+				{
+				"special-17":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 17":"\u5656",
+				"bigdecimal17":7817265.00000111,
+				"bigdecimal-2-17":127655512123456.761009E-123,
+				"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int17":4561,
+				"ints17":0,
+				"false17":false,
+				"nil17":false,
+				"obj17":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-18":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 18":"\u5656",
+	"bigdecimal18":7817265.00000111,
+	"bigdecimal-2-18":127655512123456.761009E-123,
+	"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int18":4561,
+	"ints18":0,
+	"false18":false,
+	"nil18":false,
+	"n18":      null                ,
+	"obj18":
+		{
+			"special-18":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 18":"\u5656",
+	"bigdecimal18":7817265.00000111,
+			"bigdecimal-2-18":127655512123456.761009E-123,
+			"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int18":4561,
+			"ints18":0,
+			"false18":false,
+			"nil18":false,
+			"obj18":      null                ,
+			"obj18":
+				[    true    ,
+				{
+				"special-18":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 18":"\u5656",
+				"bigdecimal18":7817265.00000111,
+				"bigdecimal-2-18":127655512123456.761009E-123,
+				"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int18":4561,
+				"ints18":0,
+				"false18":false,
+				"nil18":false,
+				"obj18":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-19":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 19":"\u5656",
+	"bigdecimal19":7817265.00000111,
+	"bigdecimal-2-19":127655512123456.761009E-123,
+	"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int19":4561,
+	"ints19":0,
+	"false19":false,
+	"nil19":false,
+	"n19":      null                ,
+	"obj19":
+		{
+			"special-19":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 19":"\u5656",
+	"bigdecimal19":7817265.00000111,
+			"bigdecimal-2-19":127655512123456.761009E-123,
+			"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int19":4561,
+			"ints19":0,
+			"false19":false,
+			"nil19":false,
+			"obj19":      null                ,
+			"obj19":
+				[    true    ,
+				{
+				"special-19":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 19":"\u5656",
+				"bigdecimal19":7817265.00000111,
+				"bigdecimal-2-19":127655512123456.761009E-123,
+				"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int19":4561,
+				"ints19":0,
+				"false19":false,
+				"nil19":false,
+				"obj19":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-20":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 20":"\u5656",
+	"bigdecimal20":7817265.00000111,
+	"bigdecimal-2-20":127655512123456.761009E-123,
+	"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int20":4561,
+	"ints20":0,
+	"false20":false,
+	"nil20":false,
+	"n20":      null                ,
+	"obj20":
+		{
+			"special-20":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 20":"\u5656",
+	"bigdecimal20":7817265.00000111,
+			"bigdecimal-2-20":127655512123456.761009E-123,
+			"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int20":4561,
+			"ints20":0,
+			"false20":false,
+			"nil20":false,
+			"obj20":      null                ,
+			"obj20":
+				[    true    ,
+				{
+				"special-20":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 20":"\u5656",
+				"bigdecimal20":7817265.00000111,
+				"bigdecimal-2-20":127655512123456.761009E-123,
+				"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int20":4561,
+				"ints20":0,
+				"false20":false,
+				"nil20":false,
+				"obj20":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-21":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 21":"\u5656",
+	"bigdecimal21":7817265.00000111,
+	"bigdecimal-2-21":127655512123456.761009E-123,
+	"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int21":4561,
+	"ints21":0,
+	"false21":false,
+	"nil21":false,
+	"n21":      null                ,
+	"obj21":
+		{
+			"special-21":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 21":"\u5656",
+	"bigdecimal21":7817265.00000111,
+			"bigdecimal-2-21":127655512123456.761009E-123,
+			"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int21":4561,
+			"ints21":0,
+			"false21":false,
+			"nil21":false,
+			"obj21":      null                ,
+			"obj21":
+				[    true    ,
+				{
+				"special-21":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 21":"\u5656",
+				"bigdecimal21":7817265.00000111,
+				"bigdecimal-2-21":127655512123456.761009E-123,
+				"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int21":4561,
+				"ints21":0,
+				"false21":false,
+				"nil21":false,
+				"obj21":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-22":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 22":"\u5656",
+	"bigdecimal22":7817265.00000111,
+	"bigdecimal-2-22":127655512123456.761009E-123,
+	"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int22":4561,
+	"ints22":0,
+	"false22":false,
+	"nil22":false,
+	"n22":      null                ,
+	"obj22":
+		{
+			"special-22":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 22":"\u5656",
+	"bigdecimal22":7817265.00000111,
+			"bigdecimal-2-22":127655512123456.761009E-123,
+			"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int22":4561,
+			"ints22":0,
+			"false22":false,
+			"nil22":false,
+			"obj22":      null                ,
+			"obj22":
+				[    true    ,
+				{
+				"special-22":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 22":"\u5656",
+				"bigdecimal22":7817265.00000111,
+				"bigdecimal-2-22":127655512123456.761009E-123,
+				"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int22":4561,
+				"ints22":0,
+				"false22":false,
+				"nil22":false,
+				"obj22":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-23":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 23":"\u5656",
+	"bigdecimal23":7817265.00000111,
+	"bigdecimal-2-23":127655512123456.761009E-123,
+	"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int23":4561,
+	"ints23":0,
+	"false23":false,
+	"nil23":false,
+	"n23":      null                ,
+	"obj23":
+		{
+			"special-23":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 23":"\u5656",
+	"bigdecimal23":7817265.00000111,
+			"bigdecimal-2-23":127655512123456.761009E-123,
+			"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int23":4561,
+			"ints23":0,
+			"false23":false,
+			"nil23":false,
+			"obj23":      null                ,
+			"obj23":
+				[    true    ,
+				{
+				"special-23":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 23":"\u5656",
+				"bigdecimal23":7817265.00000111,
+				"bigdecimal-2-23":127655512123456.761009E-123,
+				"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int23":4561,
+				"ints23":0,
+				"false23":false,
+				"nil23":false,
+				"obj23":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-24":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 24":"\u5656",
+	"bigdecimal24":7817265.00000111,
+	"bigdecimal-2-24":127655512123456.761009E-123,
+	"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int24":4561,
+	"ints24":0,
+	"false24":false,
+	"nil24":false,
+	"n24":      null                ,
+	"obj24":
+		{
+			"special-24":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 24":"\u5656",
+	"bigdecimal24":7817265.00000111,
+			"bigdecimal-2-24":127655512123456.761009E-123,
+			"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int24":4561,
+			"ints24":0,
+			"false24":false,
+			"nil24":false,
+			"obj24":      null                ,
+			"obj24":
+				[    true    ,
+				{
+				"special-24":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 24":"\u5656",
+				"bigdecimal24":7817265.00000111,
+				"bigdecimal-2-24":127655512123456.761009E-123,
+				"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int24":4561,
+				"ints24":0,
+				"false24":false,
+				"nil24":false,
+				"obj24":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-25":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 25":"\u5656",
+	"bigdecimal25":7817265.00000111,
+	"bigdecimal-2-25":127655512123456.761009E-123,
+	"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int25":4561,
+	"ints25":0,
+	"false25":false,
+	"nil25":false,
+	"n25":      null                ,
+	"obj25":
+		{
+			"special-25":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 25":"\u5656",
+	"bigdecimal25":7817265.00000111,
+			"bigdecimal-2-25":127655512123456.761009E-123,
+			"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int25":4561,
+			"ints25":0,
+			"false25":false,
+			"nil25":false,
+			"obj25":      null                ,
+			"obj25":
+				[    true    ,
+				{
+				"special-25":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 25":"\u5656",
+				"bigdecimal25":7817265.00000111,
+				"bigdecimal-2-25":127655512123456.761009E-123,
+				"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int25":4561,
+				"ints25":0,
+				"false25":false,
+				"nil25":false,
+				"obj25":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-26":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 26":"\u5656",
+	"bigdecimal26":7817265.00000111,
+	"bigdecimal-2-26":127655512123456.761009E-123,
+	"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int26":4561,
+	"ints26":0,
+	"false26":false,
+	"nil26":false,
+	"n26":      null                ,
+	"obj26":
+		{
+			"special-26":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 26":"\u5656",
+	"bigdecimal26":7817265.00000111,
+			"bigdecimal-2-26":127655512123456.761009E-123,
+			"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int26":4561,
+			"ints26":0,
+			"false26":false,
+			"nil26":false,
+			"obj26":      null                ,
+			"obj26":
+				[    true    ,
+				{
+				"special-26":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 26":"\u5656",
+				"bigdecimal26":7817265.00000111,
+				"bigdecimal-2-26":127655512123456.761009E-123,
+				"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int26":4561,
+				"ints26":0,
+				"false26":false,
+				"nil26":false,
+				"obj26":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-27":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 27":"\u5656",
+	"bigdecimal27":7817265.00000111,
+	"bigdecimal-2-27":127655512123456.761009E-123,
+	"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int27":4561,
+	"ints27":0,
+	"false27":false,
+	"nil27":false,
+	"n27":      null                ,
+	"obj27":
+		{
+			"special-27":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 27":"\u5656",
+	"bigdecimal27":7817265.00000111,
+			"bigdecimal-2-27":127655512123456.761009E-123,
+			"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int27":4561,
+			"ints27":0,
+			"false27":false,
+			"nil27":false,
+			"obj27":      null                ,
+			"obj27":
+				[    true    ,
+				{
+				"special-27":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 27":"\u5656",
+				"bigdecimal27":7817265.00000111,
+				"bigdecimal-2-27":127655512123456.761009E-123,
+				"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int27":4561,
+				"ints27":0,
+				"false27":false,
+				"nil27":false,
+				"obj27":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-28":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 28":"\u5656",
+	"bigdecimal28":7817265.00000111,
+	"bigdecimal-2-28":127655512123456.761009E-123,
+	"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int28":4561,
+	"ints28":0,
+	"false28":false,
+	"nil28":false,
+	"n28":      null                ,
+	"obj28":
+		{
+			"special-28":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 28":"\u5656",
+	"bigdecimal28":7817265.00000111,
+			"bigdecimal-2-28":127655512123456.761009E-123,
+			"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int28":4561,
+			"ints28":0,
+			"false28":false,
+			"nil28":false,
+			"obj28":      null                ,
+			"obj28":
+				[    true    ,
+				{
+				"special-28":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 28":"\u5656",
+				"bigdecimal28":7817265.00000111,
+				"bigdecimal-2-28":127655512123456.761009E-123,
+				"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int28":4561,
+				"ints28":0,
+				"false28":false,
+				"nil28":false,
+				"obj28":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-29":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 29":"\u5656",
+	"bigdecimal29":7817265.00000111,
+	"bigdecimal-2-29":127655512123456.761009E-123,
+	"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int29":4561,
+	"ints29":0,
+	"false29":false,
+	"nil29":false,
+	"n29":      null                ,
+	"obj29":
+		{
+			"special-29":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 29":"\u5656",
+	"bigdecimal29":7817265.00000111,
+			"bigdecimal-2-29":127655512123456.761009E-123,
+			"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int29":4561,
+			"ints29":0,
+			"false29":false,
+			"nil29":false,
+			"obj29":      null                ,
+			"obj29":
+				[    true    ,
+				{
+				"special-29":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 29":"\u5656",
+				"bigdecimal29":7817265.00000111,
+				"bigdecimal-2-29":127655512123456.761009E-123,
+				"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int29":4561,
+				"ints29":0,
+				"false29":false,
+				"nil29":false,
+				"obj29":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-30":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 30":"\u5656",
+	"bigdecimal30":7817265.00000111,
+	"bigdecimal-2-30":127655512123456.761009E-123,
+	"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int30":4561,
+	"ints30":0,
+	"false30":false,
+	"nil30":false,
+	"n30":      null                ,
+	"obj30":
+		{
+			"special-30":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 30":"\u5656",
+	"bigdecimal30":7817265.00000111,
+			"bigdecimal-2-30":127655512123456.761009E-123,
+			"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int30":4561,
+			"ints30":0,
+			"false30":false,
+			"nil30":false,
+			"obj30":      null                ,
+			"obj30":
+				[    true    ,
+				{
+				"special-30":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 30":"\u5656",
+				"bigdecimal30":7817265.00000111,
+				"bigdecimal-2-30":127655512123456.761009E-123,
+				"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int30":4561,
+				"ints30":0,
+				"false30":false,
+				"nil30":false,
+				"obj30":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-31":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 31":"\u5656",
+	"bigdecimal31":7817265.00000111,
+	"bigdecimal-2-31":127655512123456.761009E-123,
+	"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int31":4561,
+	"ints31":0,
+	"false31":false,
+	"nil31":false,
+	"n31":      null                ,
+	"obj31":
+		{
+			"special-31":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 31":"\u5656",
+	"bigdecimal31":7817265.00000111,
+			"bigdecimal-2-31":127655512123456.761009E-123,
+			"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int31":4561,
+			"ints31":0,
+			"false31":false,
+			"nil31":false,
+			"obj31":      null                ,
+			"obj31":
+				[    true    ,
+				{
+				"special-31":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 31":"\u5656",
+				"bigdecimal31":7817265.00000111,
+				"bigdecimal-2-31":127655512123456.761009E-123,
+				"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int31":4561,
+				"ints31":0,
+				"false31":false,
+				"nil31":false,
+				"obj31":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-32":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 32":"\u5656",
+	"bigdecimal32":7817265.00000111,
+	"bigdecimal-2-32":127655512123456.761009E-123,
+	"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int32":4561,
+	"ints32":0,
+	"false32":false,
+	"nil32":false,
+	"n32":      null                ,
+	"obj32":
+		{
+			"special-32":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 32":"\u5656",
+	"bigdecimal32":7817265.00000111,
+			"bigdecimal-2-32":127655512123456.761009E-123,
+			"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int32":4561,
+			"ints32":0,
+			"false32":false,
+			"nil32":false,
+			"obj32":      null                ,
+			"obj32":
+				[    true    ,
+				{
+				"special-32":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 32":"\u5656",
+				"bigdecimal32":7817265.00000111,
+				"bigdecimal-2-32":127655512123456.761009E-123,
+				"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int32":4561,
+				"ints32":0,
+				"false32":false,
+				"nil32":false,
+				"obj32":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-33":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 33":"\u5656",
+	"bigdecimal33":7817265.00000111,
+	"bigdecimal-2-33":127655512123456.761009E-123,
+	"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int33":4561,
+	"ints33":0,
+	"false33":false,
+	"nil33":false,
+	"n33":      null                ,
+	"obj33":
+		{
+			"special-33":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 33":"\u5656",
+	"bigdecimal33":7817265.00000111,
+			"bigdecimal-2-33":127655512123456.761009E-123,
+			"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int33":4561,
+			"ints33":0,
+			"false33":false,
+			"nil33":false,
+			"obj33":      null                ,
+			"obj33":
+				[    true    ,
+				{
+				"special-33":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 33":"\u5656",
+				"bigdecimal33":7817265.00000111,
+				"bigdecimal-2-33":127655512123456.761009E-123,
+				"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int33":4561,
+				"ints33":0,
+				"false33":false,
+				"nil33":false,
+				"obj33":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-34":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 34":"\u5656",
+	"bigdecimal34":7817265.00000111,
+	"bigdecimal-2-34":127655512123456.761009E-123,
+	"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int34":4561,
+	"ints34":0,
+	"false34":false,
+	"nil34":false,
+	"n34":      null                ,
+	"obj34":
+		{
+			"special-34":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 34":"\u5656",
+	"bigdecimal34":7817265.00000111,
+			"bigdecimal-2-34":127655512123456.761009E-123,
+			"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int34":4561,
+			"ints34":0,
+			"false34":false,
+			"nil34":false,
+			"obj34":      null                ,
+			"obj34":
+				[    true    ,
+				{
+				"special-34":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 34":"\u5656",
+				"bigdecimal34":7817265.00000111,
+				"bigdecimal-2-34":127655512123456.761009E-123,
+				"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int34":4561,
+				"ints34":0,
+				"false34":false,
+				"nil34":false,
+				"obj34":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-35":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 35":"\u5656",
+	"bigdecimal35":7817265.00000111,
+	"bigdecimal-2-35":127655512123456.761009E-123,
+	"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int35":4561,
+	"ints35":0,
+	"false35":false,
+	"nil35":false,
+	"n35":      null                ,
+	"obj35":
+		{
+			"special-35":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 35":"\u5656",
+	"bigdecimal35":7817265.00000111,
+			"bigdecimal-2-35":127655512123456.761009E-123,
+			"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int35":4561,
+			"ints35":0,
+			"false35":false,
+			"nil35":false,
+			"obj35":      null                ,
+			"obj35":
+				[    true    ,
+				{
+				"special-35":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 35":"\u5656",
+				"bigdecimal35":7817265.00000111,
+				"bigdecimal-2-35":127655512123456.761009E-123,
+				"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int35":4561,
+				"ints35":0,
+				"false35":false,
+				"nil35":false,
+				"obj35":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-36":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 36":"\u5656",
+	"bigdecimal36":7817265.00000111,
+	"bigdecimal-2-36":127655512123456.761009E-123,
+	"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int36":4561,
+	"ints36":0,
+	"false36":false,
+	"nil36":false,
+	"n36":      null                ,
+	"obj36":
+		{
+			"special-36":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 36":"\u5656",
+	"bigdecimal36":7817265.00000111,
+			"bigdecimal-2-36":127655512123456.761009E-123,
+			"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int36":4561,
+			"ints36":0,
+			"false36":false,
+			"nil36":false,
+			"obj36":      null                ,
+			"obj36":
+				[    true    ,
+				{
+				"special-36":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 36":"\u5656",
+				"bigdecimal36":7817265.00000111,
+				"bigdecimal-2-36":127655512123456.761009E-123,
+				"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int36":4561,
+				"ints36":0,
+				"false36":false,
+				"nil36":false,
+				"obj36":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-37":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 37":"\u5656",
+	"bigdecimal37":7817265.00000111,
+	"bigdecimal-2-37":127655512123456.761009E-123,
+	"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int37":4561,
+	"ints37":0,
+	"false37":false,
+	"nil37":false,
+	"n37":      null                ,
+	"obj37":
+		{
+			"special-37":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 37":"\u5656",
+	"bigdecimal37":7817265.00000111,
+			"bigdecimal-2-37":127655512123456.761009E-123,
+			"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int37":4561,
+			"ints37":0,
+			"false37":false,
+			"nil37":false,
+			"obj37":      null                ,
+			"obj37":
+				[    true    ,
+				{
+				"special-37":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 37":"\u5656",
+				"bigdecimal37":7817265.00000111,
+				"bigdecimal-2-37":127655512123456.761009E-123,
+				"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int37":4561,
+				"ints37":0,
+				"false37":false,
+				"nil37":false,
+				"obj37":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-38":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 38":"\u5656",
+	"bigdecimal38":7817265.00000111,
+	"bigdecimal-2-38":127655512123456.761009E-123,
+	"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int38":4561,
+	"ints38":0,
+	"false38":false,
+	"nil38":false,
+	"n38":      null                ,
+	"obj38":
+		{
+			"special-38":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 38":"\u5656",
+	"bigdecimal38":7817265.00000111,
+			"bigdecimal-2-38":127655512123456.761009E-123,
+			"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int38":4561,
+			"ints38":0,
+			"false38":false,
+			"nil38":false,
+			"obj38":      null                ,
+			"obj38":
+				[    true    ,
+				{
+				"special-38":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 38":"\u5656",
+				"bigdecimal38":7817265.00000111,
+				"bigdecimal-2-38":127655512123456.761009E-123,
+				"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int38":4561,
+				"ints38":0,
+				"false38":false,
+				"nil38":false,
+				"obj38":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-39":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 39":"\u5656",
+	"bigdecimal39":7817265.00000111,
+	"bigdecimal-2-39":127655512123456.761009E-123,
+	"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int39":4561,
+	"ints39":0,
+	"false39":false,
+	"nil39":false,
+	"n39":      null                ,
+	"obj39":
+		{
+			"special-39":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 39":"\u5656",
+	"bigdecimal39":7817265.00000111,
+			"bigdecimal-2-39":127655512123456.761009E-123,
+			"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int39":4561,
+			"ints39":0,
+			"false39":false,
+			"nil39":false,
+			"obj39":      null                ,
+			"obj39":
+				[    true    ,
+				{
+				"special-39":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 39":"\u5656",
+				"bigdecimal39":7817265.00000111,
+				"bigdecimal-2-39":127655512123456.761009E-123,
+				"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int39":4561,
+				"ints39":0,
+				"false39":false,
+				"nil39":false,
+				"obj39":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-40":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 40":"\u5656",
+	"bigdecimal40":7817265.00000111,
+	"bigdecimal-2-40":127655512123456.761009E-123,
+	"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int40":4561,
+	"ints40":0,
+	"false40":false,
+	"nil40":false,
+	"n40":      null                ,
+	"obj40":
+		{
+			"special-40":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 40":"\u5656",
+	"bigdecimal40":7817265.00000111,
+			"bigdecimal-2-40":127655512123456.761009E-123,
+			"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int40":4561,
+			"ints40":0,
+			"false40":false,
+			"nil40":false,
+			"obj40":      null                ,
+			"obj40":
+				[    true    ,
+				{
+				"special-40":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 40":"\u5656",
+				"bigdecimal40":7817265.00000111,
+				"bigdecimal-2-40":127655512123456.761009E-123,
+				"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int40":4561,
+				"ints40":0,
+				"false40":false,
+				"nil40":false,
+				"obj40":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-41":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 41":"\u5656",
+	"bigdecimal41":7817265.00000111,
+	"bigdecimal-2-41":127655512123456.761009E-123,
+	"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int41":4561,
+	"ints41":0,
+	"false41":false,
+	"nil41":false,
+	"n41":      null                ,
+	"obj41":
+		{
+			"special-41":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 41":"\u5656",
+	"bigdecimal41":7817265.00000111,
+			"bigdecimal-2-41":127655512123456.761009E-123,
+			"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int41":4561,
+			"ints41":0,
+			"false41":false,
+			"nil41":false,
+			"obj41":      null                ,
+			"obj41":
+				[    true    ,
+				{
+				"special-41":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 41":"\u5656",
+				"bigdecimal41":7817265.00000111,
+				"bigdecimal-2-41":127655512123456.761009E-123,
+				"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int41":4561,
+				"ints41":0,
+				"false41":false,
+				"nil41":false,
+				"obj41":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-42":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 42":"\u5656",
+	"bigdecimal42":7817265.00000111,
+	"bigdecimal-2-42":127655512123456.761009E-123,
+	"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int42":4561,
+	"ints42":0,
+	"false42":false,
+	"nil42":false,
+	"n42":      null                ,
+	"obj42":
+		{
+			"special-42":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 42":"\u5656",
+	"bigdecimal42":7817265.00000111,
+			"bigdecimal-2-42":127655512123456.761009E-123,
+			"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int42":4561,
+			"ints42":0,
+			"false42":false,
+			"nil42":false,
+			"obj42":      null                ,
+			"obj42":
+				[    true    ,
+				{
+				"special-42":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 42":"\u5656",
+				"bigdecimal42":7817265.00000111,
+				"bigdecimal-2-42":127655512123456.761009E-123,
+				"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int42":4561,
+				"ints42":0,
+				"false42":false,
+				"nil42":false,
+				"obj42":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-43":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 43":"\u5656",
+	"bigdecimal43":7817265.00000111,
+	"bigdecimal-2-43":127655512123456.761009E-123,
+	"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int43":4561,
+	"ints43":0,
+	"false43":false,
+	"nil43":false,
+	"n43":      null                ,
+	"obj43":
+		{
+			"special-43":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 43":"\u5656",
+	"bigdecimal43":7817265.00000111,
+			"bigdecimal-2-43":127655512123456.761009E-123,
+			"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int43":4561,
+			"ints43":0,
+			"false43":false,
+			"nil43":false,
+			"obj43":      null                ,
+			"obj43":
+				[    true    ,
+				{
+				"special-43":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 43":"\u5656",
+				"bigdecimal43":7817265.00000111,
+				"bigdecimal-2-43":127655512123456.761009E-123,
+				"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int43":4561,
+				"ints43":0,
+				"false43":false,
+				"nil43":false,
+				"obj43":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-44":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 44":"\u5656",
+	"bigdecimal44":7817265.00000111,
+	"bigdecimal-2-44":127655512123456.761009E-123,
+	"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int44":4561,
+	"ints44":0,
+	"false44":false,
+	"nil44":false,
+	"n44":      null                ,
+	"obj44":
+		{
+			"special-44":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 44":"\u5656",
+	"bigdecimal44":7817265.00000111,
+			"bigdecimal-2-44":127655512123456.761009E-123,
+			"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int44":4561,
+			"ints44":0,
+			"false44":false,
+			"nil44":false,
+			"obj44":      null                ,
+			"obj44":
+				[    true    ,
+				{
+				"special-44":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 44":"\u5656",
+				"bigdecimal44":7817265.00000111,
+				"bigdecimal-2-44":127655512123456.761009E-123,
+				"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int44":4561,
+				"ints44":0,
+				"false44":false,
+				"nil44":false,
+				"obj44":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-45":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 45":"\u5656",
+	"bigdecimal45":7817265.00000111,
+	"bigdecimal-2-45":127655512123456.761009E-123,
+	"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int45":4561,
+	"ints45":0,
+	"false45":false,
+	"nil45":false,
+	"n45":      null                ,
+	"obj45":
+		{
+			"special-45":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 45":"\u5656",
+	"bigdecimal45":7817265.00000111,
+			"bigdecimal-2-45":127655512123456.761009E-123,
+			"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int45":4561,
+			"ints45":0,
+			"false45":false,
+			"nil45":false,
+			"obj45":      null                ,
+			"obj45":
+				[    true    ,
+				{
+				"special-45":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 45":"\u5656",
+				"bigdecimal45":7817265.00000111,
+				"bigdecimal-2-45":127655512123456.761009E-123,
+				"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int45":4561,
+				"ints45":0,
+				"false45":false,
+				"nil45":false,
+				"obj45":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-46":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 46":"\u5656",
+	"bigdecimal46":7817265.00000111,
+	"bigdecimal-2-46":127655512123456.761009E-123,
+	"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int46":4561,
+	"ints46":0,
+	"false46":false,
+	"nil46":false,
+	"n46":      null                ,
+	"obj46":
+		{
+			"special-46":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 46":"\u5656",
+	"bigdecimal46":7817265.00000111,
+			"bigdecimal-2-46":127655512123456.761009E-123,
+			"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int46":4561,
+			"ints46":0,
+			"false46":false,
+			"nil46":false,
+			"obj46":      null                ,
+			"obj46":
+				[    true    ,
+				{
+				"special-46":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 46":"\u5656",
+				"bigdecimal46":7817265.00000111,
+				"bigdecimal-2-46":127655512123456.761009E-123,
+				"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int46":4561,
+				"ints46":0,
+				"false46":false,
+				"nil46":false,
+				"obj46":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-47":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 47":"\u5656",
+	"bigdecimal47":7817265.00000111,
+	"bigdecimal-2-47":127655512123456.761009E-123,
+	"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int47":4561,
+	"ints47":0,
+	"false47":false,
+	"nil47":false,
+	"n47":      null                ,
+	"obj47":
+		{
+			"special-47":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 47":"\u5656",
+	"bigdecimal47":7817265.00000111,
+			"bigdecimal-2-47":127655512123456.761009E-123,
+			"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int47":4561,
+			"ints47":0,
+			"false47":false,
+			"nil47":false,
+			"obj47":      null                ,
+			"obj47":
+				[    true    ,
+				{
+				"special-47":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 47":"\u5656",
+				"bigdecimal47":7817265.00000111,
+				"bigdecimal-2-47":127655512123456.761009E-123,
+				"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int47":4561,
+				"ints47":0,
+				"false47":false,
+				"nil47":false,
+				"obj47":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-48":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 48":"\u5656",
+	"bigdecimal48":7817265.00000111,
+	"bigdecimal-2-48":127655512123456.761009E-123,
+	"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int48":4561,
+	"ints48":0,
+	"false48":false,
+	"nil48":false,
+	"n48":      null                ,
+	"obj48":
+		{
+			"special-48":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 48":"\u5656",
+	"bigdecimal48":7817265.00000111,
+			"bigdecimal-2-48":127655512123456.761009E-123,
+			"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int48":4561,
+			"ints48":0,
+			"false48":false,
+			"nil48":false,
+			"obj48":      null                ,
+			"obj48":
+				[    true    ,
+				{
+				"special-48":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 48":"\u5656",
+				"bigdecimal48":7817265.00000111,
+				"bigdecimal-2-48":127655512123456.761009E-123,
+				"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int48":4561,
+				"ints48":0,
+				"false48":false,
+				"nil48":false,
+				"obj48":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-49":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 49":"\u5656",
+	"bigdecimal49":7817265.00000111,
+	"bigdecimal-2-49":127655512123456.761009E-123,
+	"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int49":4561,
+	"ints49":0,
+	"false49":false,
+	"nil49":false,
+	"n49":      null                ,
+	"obj49":
+		{
+			"special-49":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 49":"\u5656",
+	"bigdecimal49":7817265.00000111,
+			"bigdecimal-2-49":127655512123456.761009E-123,
+			"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int49":4561,
+			"ints49":0,
+			"false49":false,
+			"nil49":false,
+			"obj49":      null                ,
+			"obj49":
+				[    true    ,
+				{
+				"special-49":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 49":"\u5656",
+				"bigdecimal49":7817265.00000111,
+				"bigdecimal-2-49":127655512123456.761009E-123,
+				"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int49":4561,
+				"ints49":0,
+				"false49":false,
+				"nil49":false,
+				"obj49":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-50":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 50":"\u5656",
+	"bigdecimal50":7817265.00000111,
+	"bigdecimal-2-50":127655512123456.761009E-123,
+	"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int50":4561,
+	"ints50":0,
+	"false50":false,
+	"nil50":false,
+	"n50":      null                ,
+	"obj50":
+		{
+			"special-50":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 50":"\u5656",
+	"bigdecimal50":7817265.00000111,
+			"bigdecimal-2-50":127655512123456.761009E-123,
+			"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int50":4561,
+			"ints50":0,
+			"false50":false,
+			"nil50":false,
+			"obj50":      null                ,
+			"obj50":
+				[    true    ,
+				{
+				"special-50":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 50":"\u5656",
+				"bigdecimal50":7817265.00000111,
+				"bigdecimal-2-50":127655512123456.761009E-123,
+				"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int50":4561,
+				"ints50":0,
+				"false50":false,
+				"nil50":false,
+				"obj50":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-51":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 51":"\u5656",
+	"bigdecimal51":7817265.00000111,
+	"bigdecimal-2-51":127655512123456.761009E-123,
+	"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int51":4561,
+	"ints51":0,
+	"false51":false,
+	"nil51":false,
+	"n51":      null                ,
+	"obj51":
+		{
+			"special-51":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 51":"\u5656",
+	"bigdecimal51":7817265.00000111,
+			"bigdecimal-2-51":127655512123456.761009E-123,
+			"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int51":4561,
+			"ints51":0,
+			"false51":false,
+			"nil51":false,
+			"obj51":      null                ,
+			"obj51":
+				[    true    ,
+				{
+				"special-51":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 51":"\u5656",
+				"bigdecimal51":7817265.00000111,
+				"bigdecimal-2-51":127655512123456.761009E-123,
+				"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int51":4561,
+				"ints51":0,
+				"false51":false,
+				"nil51":false,
+				"obj51":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-52":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 52":"\u5656",
+	"bigdecimal52":7817265.00000111,
+	"bigdecimal-2-52":127655512123456.761009E-123,
+	"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int52":4561,
+	"ints52":0,
+	"false52":false,
+	"nil52":false,
+	"n52":      null                ,
+	"obj52":
+		{
+			"special-52":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 52":"\u5656",
+	"bigdecimal52":7817265.00000111,
+			"bigdecimal-2-52":127655512123456.761009E-123,
+			"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int52":4561,
+			"ints52":0,
+			"false52":false,
+			"nil52":false,
+			"obj52":      null                ,
+			"obj52":
+				[    true    ,
+				{
+				"special-52":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 52":"\u5656",
+				"bigdecimal52":7817265.00000111,
+				"bigdecimal-2-52":127655512123456.761009E-123,
+				"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int52":4561,
+				"ints52":0,
+				"false52":false,
+				"nil52":false,
+				"obj52":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-53":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 53":"\u5656",
+	"bigdecimal53":7817265.00000111,
+	"bigdecimal-2-53":127655512123456.761009E-123,
+	"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int53":4561,
+	"ints53":0,
+	"false53":false,
+	"nil53":false,
+	"n53":      null                ,
+	"obj53":
+		{
+			"special-53":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 53":"\u5656",
+	"bigdecimal53":7817265.00000111,
+			"bigdecimal-2-53":127655512123456.761009E-123,
+			"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int53":4561,
+			"ints53":0,
+			"false53":false,
+			"nil53":false,
+			"obj53":      null                ,
+			"obj53":
+				[    true    ,
+				{
+				"special-53":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 53":"\u5656",
+				"bigdecimal53":7817265.00000111,
+				"bigdecimal-2-53":127655512123456.761009E-123,
+				"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int53":4561,
+				"ints53":0,
+				"false53":false,
+				"nil53":false,
+				"obj53":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-54":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 54":"\u5656",
+	"bigdecimal54":7817265.00000111,
+	"bigdecimal-2-54":127655512123456.761009E-123,
+	"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int54":4561,
+	"ints54":0,
+	"false54":false,
+	"nil54":false,
+	"n54":      null                ,
+	"obj54":
+		{
+			"special-54":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 54":"\u5656",
+	"bigdecimal54":7817265.00000111,
+			"bigdecimal-2-54":127655512123456.761009E-123,
+			"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int54":4561,
+			"ints54":0,
+			"false54":false,
+			"nil54":false,
+			"obj54":      null                ,
+			"obj54":
+				[    true    ,
+				{
+				"special-54":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 54":"\u5656",
+				"bigdecimal54":7817265.00000111,
+				"bigdecimal-2-54":127655512123456.761009E-123,
+				"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int54":4561,
+				"ints54":0,
+				"false54":false,
+				"nil54":false,
+				"obj54":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-55":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 55":"\u5656",
+	"bigdecimal55":7817265.00000111,
+	"bigdecimal-2-55":127655512123456.761009E-123,
+	"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int55":4561,
+	"ints55":0,
+	"false55":false,
+	"nil55":false,
+	"n55":      null                ,
+	"obj55":
+		{
+			"special-55":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 55":"\u5656",
+	"bigdecimal55":7817265.00000111,
+			"bigdecimal-2-55":127655512123456.761009E-123,
+			"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int55":4561,
+			"ints55":0,
+			"false55":false,
+			"nil55":false,
+			"obj55":      null                ,
+			"obj55":
+				[    true    ,
+				{
+				"special-55":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 55":"\u5656",
+				"bigdecimal55":7817265.00000111,
+				"bigdecimal-2-55":127655512123456.761009E-123,
+				"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int55":4561,
+				"ints55":0,
+				"false55":false,
+				"nil55":false,
+				"obj55":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-56":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 56":"\u5656",
+	"bigdecimal56":7817265.00000111,
+	"bigdecimal-2-56":127655512123456.761009E-123,
+	"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int56":4561,
+	"ints56":0,
+	"false56":false,
+	"nil56":false,
+	"n56":      null                ,
+	"obj56":
+		{
+			"special-56":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 56":"\u5656",
+	"bigdecimal56":7817265.00000111,
+			"bigdecimal-2-56":127655512123456.761009E-123,
+			"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int56":4561,
+			"ints56":0,
+			"false56":false,
+			"nil56":false,
+			"obj56":      null                ,
+			"obj56":
+				[    true    ,
+				{
+				"special-56":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 56":"\u5656",
+				"bigdecimal56":7817265.00000111,
+				"bigdecimal-2-56":127655512123456.761009E-123,
+				"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int56":4561,
+				"ints56":0,
+				"false56":false,
+				"nil56":false,
+				"obj56":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-57":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 57":"\u5656",
+	"bigdecimal57":7817265.00000111,
+	"bigdecimal-2-57":127655512123456.761009E-123,
+	"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int57":4561,
+	"ints57":0,
+	"false57":false,
+	"nil57":false,
+	"n57":      null                ,
+	"obj57":
+		{
+			"special-57":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 57":"\u5656",
+	"bigdecimal57":7817265.00000111,
+			"bigdecimal-2-57":127655512123456.761009E-123,
+			"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int57":4561,
+			"ints57":0,
+			"false57":false,
+			"nil57":false,
+			"obj57":      null                ,
+			"obj57":
+				[    true    ,
+				{
+				"special-57":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 57":"\u5656",
+				"bigdecimal57":7817265.00000111,
+				"bigdecimal-2-57":127655512123456.761009E-123,
+				"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int57":4561,
+				"ints57":0,
+				"false57":false,
+				"nil57":false,
+				"obj57":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-58":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 58":"\u5656",
+	"bigdecimal58":7817265.00000111,
+	"bigdecimal-2-58":127655512123456.761009E-123,
+	"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int58":4561,
+	"ints58":0,
+	"false58":false,
+	"nil58":false,
+	"n58":      null                ,
+	"obj58":
+		{
+			"special-58":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 58":"\u5656",
+	"bigdecimal58":7817265.00000111,
+			"bigdecimal-2-58":127655512123456.761009E-123,
+			"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int58":4561,
+			"ints58":0,
+			"false58":false,
+			"nil58":false,
+			"obj58":      null                ,
+			"obj58":
+				[    true    ,
+				{
+				"special-58":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 58":"\u5656",
+				"bigdecimal58":7817265.00000111,
+				"bigdecimal-2-58":127655512123456.761009E-123,
+				"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int58":4561,
+				"ints58":0,
+				"false58":false,
+				"nil58":false,
+				"obj58":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-59":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 59":"\u5656",
+	"bigdecimal59":7817265.00000111,
+	"bigdecimal-2-59":127655512123456.761009E-123,
+	"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int59":4561,
+	"ints59":0,
+	"false59":false,
+	"nil59":false,
+	"n59":      null                ,
+	"obj59":
+		{
+			"special-59":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 59":"\u5656",
+	"bigdecimal59":7817265.00000111,
+			"bigdecimal-2-59":127655512123456.761009E-123,
+			"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int59":4561,
+			"ints59":0,
+			"false59":false,
+			"nil59":false,
+			"obj59":      null                ,
+			"obj59":
+				[    true    ,
+				{
+				"special-59":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 59":"\u5656",
+				"bigdecimal59":7817265.00000111,
+				"bigdecimal-2-59":127655512123456.761009E-123,
+				"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int59":4561,
+				"ints59":0,
+				"false59":false,
+				"nil59":false,
+				"obj59":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-60":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 60":"\u5656",
+	"bigdecimal60":7817265.00000111,
+	"bigdecimal-2-60":127655512123456.761009E-123,
+	"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int60":4561,
+	"ints60":0,
+	"false60":false,
+	"nil60":false,
+	"n60":      null                ,
+	"obj60":
+		{
+			"special-60":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 60":"\u5656",
+	"bigdecimal60":7817265.00000111,
+			"bigdecimal-2-60":127655512123456.761009E-123,
+			"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int60":4561,
+			"ints60":0,
+			"false60":false,
+			"nil60":false,
+			"obj60":      null                ,
+			"obj60":
+				[    true    ,
+				{
+				"special-60":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 60":"\u5656",
+				"bigdecimal60":7817265.00000111,
+				"bigdecimal-2-60":127655512123456.761009E-123,
+				"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int60":4561,
+				"ints60":0,
+				"false60":false,
+				"nil60":false,
+				"obj60":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-61":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 61":"\u5656",
+	"bigdecimal61":7817265.00000111,
+	"bigdecimal-2-61":127655512123456.761009E-123,
+	"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int61":4561,
+	"ints61":0,
+	"false61":false,
+	"nil61":false,
+	"n61":      null                ,
+	"obj61":
+		{
+			"special-61":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 61":"\u5656",
+	"bigdecimal61":7817265.00000111,
+			"bigdecimal-2-61":127655512123456.761009E-123,
+			"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int61":4561,
+			"ints61":0,
+			"false61":false,
+			"nil61":false,
+			"obj61":      null                ,
+			"obj61":
+				[    true    ,
+				{
+				"special-61":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 61":"\u5656",
+				"bigdecimal61":7817265.00000111,
+				"bigdecimal-2-61":127655512123456.761009E-123,
+				"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int61":4561,
+				"ints61":0,
+				"false61":false,
+				"nil61":false,
+				"obj61":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-62":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 62":"\u5656",
+	"bigdecimal62":7817265.00000111,
+	"bigdecimal-2-62":127655512123456.761009E-123,
+	"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int62":4561,
+	"ints62":0,
+	"false62":false,
+	"nil62":false,
+	"n62":      null                ,
+	"obj62":
+		{
+			"special-62":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 62":"\u5656",
+	"bigdecimal62":7817265.00000111,
+			"bigdecimal-2-62":127655512123456.761009E-123,
+			"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int62":4561,
+			"ints62":0,
+			"false62":false,
+			"nil62":false,
+			"obj62":      null                ,
+			"obj62":
+				[    true    ,
+				{
+				"special-62":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 62":"\u5656",
+				"bigdecimal62":7817265.00000111,
+				"bigdecimal-2-62":127655512123456.761009E-123,
+				"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int62":4561,
+				"ints62":0,
+				"false62":false,
+				"nil62":false,
+				"obj62":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-63":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 63":"\u5656",
+	"bigdecimal63":7817265.00000111,
+	"bigdecimal-2-63":127655512123456.761009E-123,
+	"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int63":4561,
+	"ints63":0,
+	"false63":false,
+	"nil63":false,
+	"n63":      null                ,
+	"obj63":
+		{
+			"special-63":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 63":"\u5656",
+	"bigdecimal63":7817265.00000111,
+			"bigdecimal-2-63":127655512123456.761009E-123,
+			"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int63":4561,
+			"ints63":0,
+			"false63":false,
+			"nil63":false,
+			"obj63":      null                ,
+			"obj63":
+				[    true    ,
+				{
+				"special-63":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 63":"\u5656",
+				"bigdecimal63":7817265.00000111,
+				"bigdecimal-2-63":127655512123456.761009E-123,
+				"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int63":4561,
+				"ints63":0,
+				"false63":false,
+				"nil63":false,
+				"obj63":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-64":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 64":"\u5656",
+	"bigdecimal64":7817265.00000111,
+	"bigdecimal-2-64":127655512123456.761009E-123,
+	"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int64":4561,
+	"ints64":0,
+	"false64":false,
+	"nil64":false,
+	"n64":      null                ,
+	"obj64":
+		{
+			"special-64":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 64":"\u5656",
+	"bigdecimal64":7817265.00000111,
+			"bigdecimal-2-64":127655512123456.761009E-123,
+			"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int64":4561,
+			"ints64":0,
+			"false64":false,
+			"nil64":false,
+			"obj64":      null                ,
+			"obj64":
+				[    true    ,
+				{
+				"special-64":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 64":"\u5656",
+				"bigdecimal64":7817265.00000111,
+				"bigdecimal-2-64":127655512123456.761009E-123,
+				"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int64":4561,
+				"ints64":0,
+				"false64":false,
+				"nil64":false,
+				"obj64":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-65":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 65":"\u5656",
+	"bigdecimal65":7817265.00000111,
+	"bigdecimal-2-65":127655512123456.761009E-123,
+	"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int65":4561,
+	"ints65":0,
+	"false65":false,
+	"nil65":false,
+	"n65":      null                ,
+	"obj65":
+		{
+			"special-65":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 65":"\u5656",
+	"bigdecimal65":7817265.00000111,
+			"bigdecimal-2-65":127655512123456.761009E-123,
+			"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int65":4561,
+			"ints65":0,
+			"false65":false,
+			"nil65":false,
+			"obj65":      null                ,
+			"obj65":
+				[    true    ,
+				{
+				"special-65":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 65":"\u5656",
+				"bigdecimal65":7817265.00000111,
+				"bigdecimal-2-65":127655512123456.761009E-123,
+				"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int65":4561,
+				"ints65":0,
+				"false65":false,
+				"nil65":false,
+				"obj65":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-66":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 66":"\u5656",
+	"bigdecimal66":7817265.00000111,
+	"bigdecimal-2-66":127655512123456.761009E-123,
+	"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int66":4561,
+	"ints66":0,
+	"false66":false,
+	"nil66":false,
+	"n66":      null                ,
+	"obj66":
+		{
+			"special-66":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 66":"\u5656",
+	"bigdecimal66":7817265.00000111,
+			"bigdecimal-2-66":127655512123456.761009E-123,
+			"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int66":4561,
+			"ints66":0,
+			"false66":false,
+			"nil66":false,
+			"obj66":      null                ,
+			"obj66":
+				[    true    ,
+				{
+				"special-66":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 66":"\u5656",
+				"bigdecimal66":7817265.00000111,
+				"bigdecimal-2-66":127655512123456.761009E-123,
+				"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int66":4561,
+				"ints66":0,
+				"false66":false,
+				"nil66":false,
+				"obj66":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-67":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 67":"\u5656",
+	"bigdecimal67":7817265.00000111,
+	"bigdecimal-2-67":127655512123456.761009E-123,
+	"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int67":4561,
+	"ints67":0,
+	"false67":false,
+	"nil67":false,
+	"n67":      null                ,
+	"obj67":
+		{
+			"special-67":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 67":"\u5656",
+	"bigdecimal67":7817265.00000111,
+			"bigdecimal-2-67":127655512123456.761009E-123,
+			"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int67":4561,
+			"ints67":0,
+			"false67":false,
+			"nil67":false,
+			"obj67":      null                ,
+			"obj67":
+				[    true    ,
+				{
+				"special-67":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 67":"\u5656",
+				"bigdecimal67":7817265.00000111,
+				"bigdecimal-2-67":127655512123456.761009E-123,
+				"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int67":4561,
+				"ints67":0,
+				"false67":false,
+				"nil67":false,
+				"obj67":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-68":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 68":"\u5656",
+	"bigdecimal68":7817265.00000111,
+	"bigdecimal-2-68":127655512123456.761009E-123,
+	"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int68":4561,
+	"ints68":0,
+	"false68":false,
+	"nil68":false,
+	"n68":      null                ,
+	"obj68":
+		{
+			"special-68":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 68":"\u5656",
+	"bigdecimal68":7817265.00000111,
+			"bigdecimal-2-68":127655512123456.761009E-123,
+			"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int68":4561,
+			"ints68":0,
+			"false68":false,
+			"nil68":false,
+			"obj68":      null                ,
+			"obj68":
+				[    true    ,
+				{
+				"special-68":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 68":"\u5656",
+				"bigdecimal68":7817265.00000111,
+				"bigdecimal-2-68":127655512123456.761009E-123,
+				"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int68":4561,
+				"ints68":0,
+				"false68":false,
+				"nil68":false,
+				"obj68":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-69":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 69":"\u5656",
+	"bigdecimal69":7817265.00000111,
+	"bigdecimal-2-69":127655512123456.761009E-123,
+	"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int69":4561,
+	"ints69":0,
+	"false69":false,
+	"nil69":false,
+	"n69":      null                ,
+	"obj69":
+		{
+			"special-69":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 69":"\u5656",
+	"bigdecimal69":7817265.00000111,
+			"bigdecimal-2-69":127655512123456.761009E-123,
+			"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int69":4561,
+			"ints69":0,
+			"false69":false,
+			"nil69":false,
+			"obj69":      null                ,
+			"obj69":
+				[    true    ,
+				{
+				"special-69":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 69":"\u5656",
+				"bigdecimal69":7817265.00000111,
+				"bigdecimal-2-69":127655512123456.761009E-123,
+				"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int69":4561,
+				"ints69":0,
+				"false69":false,
+				"nil69":false,
+				"obj69":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-70":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 70":"\u5656",
+	"bigdecimal70":7817265.00000111,
+	"bigdecimal-2-70":127655512123456.761009E-123,
+	"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int70":4561,
+	"ints70":0,
+	"false70":false,
+	"nil70":false,
+	"n70":      null                ,
+	"obj70":
+		{
+			"special-70":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 70":"\u5656",
+	"bigdecimal70":7817265.00000111,
+			"bigdecimal-2-70":127655512123456.761009E-123,
+			"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int70":4561,
+			"ints70":0,
+			"false70":false,
+			"nil70":false,
+			"obj70":      null                ,
+			"obj70":
+				[    true    ,
+				{
+				"special-70":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 70":"\u5656",
+				"bigdecimal70":7817265.00000111,
+				"bigdecimal-2-70":127655512123456.761009E-123,
+				"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int70":4561,
+				"ints70":0,
+				"false70":false,
+				"nil70":false,
+				"obj70":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-71":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 71":"\u5656",
+	"bigdecimal71":7817265.00000111,
+	"bigdecimal-2-71":127655512123456.761009E-123,
+	"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int71":4561,
+	"ints71":0,
+	"false71":false,
+	"nil71":false,
+	"n71":      null                ,
+	"obj71":
+		{
+			"special-71":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 71":"\u5656",
+	"bigdecimal71":7817265.00000111,
+			"bigdecimal-2-71":127655512123456.761009E-123,
+			"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int71":4561,
+			"ints71":0,
+			"false71":false,
+			"nil71":false,
+			"obj71":      null                ,
+			"obj71":
+				[    true    ,
+				{
+				"special-71":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 71":"\u5656",
+				"bigdecimal71":7817265.00000111,
+				"bigdecimal-2-71":127655512123456.761009E-123,
+				"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int71":4561,
+				"ints71":0,
+				"false71":false,
+				"nil71":false,
+				"obj71":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-72":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 72":"\u5656",
+	"bigdecimal72":7817265.00000111,
+	"bigdecimal-2-72":127655512123456.761009E-123,
+	"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int72":4561,
+	"ints72":0,
+	"false72":false,
+	"nil72":false,
+	"n72":      null                ,
+	"obj72":
+		{
+			"special-72":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 72":"\u5656",
+	"bigdecimal72":7817265.00000111,
+			"bigdecimal-2-72":127655512123456.761009E-123,
+			"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int72":4561,
+			"ints72":0,
+			"false72":false,
+			"nil72":false,
+			"obj72":      null                ,
+			"obj72":
+				[    true    ,
+				{
+				"special-72":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 72":"\u5656",
+				"bigdecimal72":7817265.00000111,
+				"bigdecimal-2-72":127655512123456.761009E-123,
+				"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int72":4561,
+				"ints72":0,
+				"false72":false,
+				"nil72":false,
+				"obj72":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-73":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 73":"\u5656",
+	"bigdecimal73":7817265.00000111,
+	"bigdecimal-2-73":127655512123456.761009E-123,
+	"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int73":4561,
+	"ints73":0,
+	"false73":false,
+	"nil73":false,
+	"n73":      null                ,
+	"obj73":
+		{
+			"special-73":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 73":"\u5656",
+	"bigdecimal73":7817265.00000111,
+			"bigdecimal-2-73":127655512123456.761009E-123,
+			"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int73":4561,
+			"ints73":0,
+			"false73":false,
+			"nil73":false,
+			"obj73":      null                ,
+			"obj73":
+				[    true    ,
+				{
+				"special-73":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 73":"\u5656",
+				"bigdecimal73":7817265.00000111,
+				"bigdecimal-2-73":127655512123456.761009E-123,
+				"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int73":4561,
+				"ints73":0,
+				"false73":false,
+				"nil73":false,
+				"obj73":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-74":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 74":"\u5656",
+	"bigdecimal74":7817265.00000111,
+	"bigdecimal-2-74":127655512123456.761009E-123,
+	"string-74":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int74":4561,
+	"ints74":0,
+	"false74":false,
+	"nil74":false,
+	"n74":      null                ,
+	"obj74":
+		{
+			"special-74":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 74":"\u5656",
+	"bigdecimal74":7817265.00000111,
+			"bigdecimal-2-74":127655512123456.761009E-123,
+			"string-74":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int74":4561,
+			"ints74":0,
+			"false74":false,
+			"nil74":false,
+			"obj74":      null                ,
+			"obj74":
+				[    true    ,
+				{
+				"special-74":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 74":"\u5656",
+				"bigdecimal74":7817265.00000111,
+				"bigdecimal-2-74":127655512123456.761009E-123,
+				"string-74":"lorem ipsum, Ä

<TRUNCATED>

[18/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonStreamParserImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonStreamParserImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonStreamParserImpl.java
deleted file mode 100644
index 8a69195..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonStreamParserImpl.java
+++ /dev/null
@@ -1,964 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.util.NoSuchElementException;
-
-import javax.json.JsonException;
-import javax.json.stream.JsonLocation;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParsingException;
-
-//This class represents either the Json tokenizer and the Json parser.
-public class JsonStreamParserImpl implements JsonChars, JsonParser{
-
-    //the main buffer where the stream will be buffered
-    private final char[] buffer;
-
-    //current parser position within the buffer
-    //Initial MIN_VALUE will trigger buffer refill, normally bufferPos is >= -1
-    //-1 would cause a re-read of the first character in the buffer (which is at zero index)
-    private int bufferPos = Integer.MIN_VALUE;
-
-    //available character in the buffer
-    //normally this is buffer.length, except for the last buffer page it might be <= buffer.length
-    private int availableCharsInBuffer;
-
-    //start and end position of values in the buffer
-    //may cross boundaries, then value is in fallBackCopyBuffer
-    private int startOfValueInBuffer = -1;
-    private int endOfValueInBuffer = -1;
-
-    private final Reader in;
-
-    //do we read from a character stream or a byte stream
-    //not used at the moment but maybe relevant in future to calculate the JsonLocation offset
-    @SuppressWarnings("unused")
-    private final boolean readBytes;
-    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
-    private final BufferStrategy.BufferProvider<char[]> valueProvider;
-
-    //max length for strings and numbers (max count of characters)
-    private final int maxValueLength;
-
-    //we use a byte here, because comparing bytes
-    //is more efficient than comparing enums
-    //Additionally we handle internally two more event: COMMA_EVENT and KEY_SEPARATOR_EVENT
-    private byte previousEvent;
-
-    //this buffer is used to store current String or Number value in case that
-    //within the value a buffer boundary is crossed or the string contains escaped characters
-    private final char[] fallBackCopyBuffer;
-    private int fallBackCopyBufferLength;
-
-    // location (line, column, offset)
-    // We try to calculate this efficiently so we do not just increment the values per char read
-    // Instead we calculate the column and offset relative to the pastBufferReadCount and/or lastLineBreakPosition.
-    private long currentLine = 1;
-    private long lastLineBreakPosition;
-    private long pastBufferReadCount;
-
-    //cache (if current value is a number) integral state and the number itself if its only one digit    
-    private boolean isCurrentNumberIntegral = true;
-    private Integer currentIntegralNumber; //for number from 0 - 9
-
-    //maybe we want also cache BigDecimals
-    //private BigDecimal currentBigDecimalNumber = null;
-
-    //We need a stack if we want detect bad formatted Json do determine if we are within an array or not
-    //example
-    //     Streamparser sees: ],1  <-- we look from here
-    //the 1 is only allowed if we are within an array
-    //This can only be determined by build up a stack which tracks the trail of Json objects and arrays
-    //This stack here is only needed for validating the above mentioned case, if we want to be lenient we can skip suing the stack.
-    //Stack can cause out of memory issues when the nesting depth of a Json stream is too deep.
-    private StructureElement currentStructureElement = null;
-
-    //minimal stack implementation
-    private static final class StructureElement {
-        final StructureElement previous;
-        final boolean isArray;
-
-        StructureElement(final StructureElement previous, final boolean isArray) {
-            super();
-            this.previous = previous;
-            this.isArray = isArray;
-        }
-    }
-
-    //detect charset according to RFC 4627
-    public JsonStreamParserImpl(final InputStream inputStream, final int maxStringLength,
-            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
-
-        this(inputStream, null, null, maxStringLength, bufferProvider, valueBuffer);
-    }
-
-    //use charset provided
-    public JsonStreamParserImpl(final InputStream inputStream, final Charset encoding, final int maxStringLength,
-            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
-
-        this(inputStream, null, encoding, maxStringLength, bufferProvider, valueBuffer);
-    }
-
-    public JsonStreamParserImpl(final Reader reader, final int maxStringLength, final BufferStrategy.BufferProvider<char[]> bufferProvider,
-            final BufferStrategy.BufferProvider<char[]> valueBuffer) {
-
-        this(null, reader, null, maxStringLength, bufferProvider, valueBuffer);
-    }
-
-    private JsonStreamParserImpl(final InputStream inputStream, final Reader reader, final Charset encoding, final int maxStringLength,
-            final BufferStrategy.BufferProvider<char[]> bufferProvider, final BufferStrategy.BufferProvider<char[]> valueBuffer) {
-
-        this.maxValueLength = maxStringLength <= 0 ? 8192 : maxStringLength;
-        this.fallBackCopyBuffer = valueBuffer.newBuffer();
-        this.buffer = bufferProvider.newBuffer();
-        this.bufferProvider = bufferProvider;
-        this.valueProvider = valueBuffer;
-
-        if (fallBackCopyBuffer.length < maxStringLength) {
-            throw cust("Size of value buffer cannot be smaller than maximum string length");
-        }
-
-        if (reader != null) {
-            this.in = reader;
-            readBytes = false;
-        } else if (encoding == null) {
-            this.in = new RFC4627AwareInputStreamReader(inputStream);
-            readBytes = true;
-
-        } else {
-            this.in = new InputStreamReader(inputStream, encoding.newDecoder());
-            readBytes = true;
-        }
-
-    }
-
-    //append a single char to the value buffer
-    private void appendToCopyBuffer(final char c) {
-        fallBackCopyBuffer[fallBackCopyBufferLength] = c;
-        fallBackCopyBufferLength++;
-    }
-
-    //copy content between "start" and "end" from buffer to value buffer 
-    private void copyCurrentValue() {
-
-        if ((endOfValueInBuffer - startOfValueInBuffer) > 0) {
-
-            if ((endOfValueInBuffer - startOfValueInBuffer) > maxValueLength) {
-                throw tmc();
-            }
-
-            System.arraycopy(buffer, startOfValueInBuffer, fallBackCopyBuffer, fallBackCopyBufferLength,
-                    (endOfValueInBuffer - startOfValueInBuffer));
-            fallBackCopyBufferLength += (endOfValueInBuffer - startOfValueInBuffer);
-
-        }
-
-        startOfValueInBuffer = endOfValueInBuffer = -1;
-    }
-
-    @Override
-    public final boolean hasNext() {
-
-        if (currentStructureElement != null || (previousEvent != END_ARRAY && previousEvent != END_OBJECT) || previousEvent == 0) {
-            return true;
-        }
-
-        //detect garbage at the end of the file after last object or array is closed
-        if (bufferPos < availableCharsInBuffer - 2) {
-
-            final char c = readNextNonWhitespaceChar();
-
-            if (c == EOF) {
-                return false;
-            }
-
-            if (bufferPos < availableCharsInBuffer) {
-                throw uexc("EOF expected");
-            }
-
-        }
-
-        return false;
-
-    }
-
-    private static boolean isAsciiDigit(final char value) {
-        return value <= NINE && value >= ZERO;
-    }
-
-    //check if value is a valid hex digit and return the numeric value
-    private int parseHexDigit(final char value) {
-
-        if (isAsciiDigit(value)) {
-            return value - 48;
-        } else if (value <= 'f' && value >= 'a') {
-            return (value) - 87;
-        } else if ((value <= 'F' && value >= 'A')) {
-            return (value) - 55;
-        } else {
-            throw uexc("Invalid hex character");
-        }
-    }
-
-    private JsonLocation createLocation() {
-
-        //we start with column = 1, so column is always >= 1
-        //APi is not clear in this, but starting column with 1 is convenient
-        long column = 1;
-        long charOffset = 0;
-
-        if (bufferPos >= -1) {
-
-            charOffset = pastBufferReadCount + bufferPos + 1;
-            column = lastLineBreakPosition == 0 ? charOffset + 1 : charOffset - lastLineBreakPosition;
-        }
-
-        //For now its unclear how to calculate offset for (byte) inputsream.
-        //API says count bytes but thats dependent on encoding and not efficient
-        //skip this for now, count always bytes and defer this until the JSR TCK arrives.
-
-        return new JsonLocationImpl(currentLine, column, charOffset);
-    }
-
-    //read the next char from the stream and set/increment the bufferPos
-    //will also refill buffer if neccessary
-    //if we are currently processing a value (string or number) and buffer 
-    //refill is neccessary copy the already readed value part into the value buffer
-    private char readNextChar() {
-
-        if ((buffer.length - bufferPos) <= 1) {
-            //fillbuffer
-
-            //copy content from old buffer to valuebuffer
-            //correct start end mark
-            if (startOfValueInBuffer > -1 && endOfValueInBuffer == -1) {
-                endOfValueInBuffer = availableCharsInBuffer;
-                copyCurrentValue();
-
-                startOfValueInBuffer = 0;
-            }
-
-            if (bufferPos >= -1) {
-                pastBufferReadCount += availableCharsInBuffer;
-            }
-
-            try {
-                availableCharsInBuffer = in.read(buffer, 0, buffer.length);
-                if (availableCharsInBuffer <= 0) {
-                    return EOF;
-                }
-
-            } catch (final IOException e) {
-                close();
-                throw uexio(e);
-            }
-
-            bufferPos = 0;
-            //end fillbuffer
-        } else {
-            bufferPos++;
-        }
-
-        return buffer[bufferPos];
-    }
-
-    //skip whitespaces
-    //tracks location informations (line, column)
-    //returns the first non whitespace character
-    private char readNextNonWhitespaceChar() {
-
-        int dosCount = 0;
-        char c = readNextChar();
-
-        while (c == SPACE || c == TAB || c == CR || c == EOL) {
-
-            if (c == EOL) {
-                currentLine++;
-                lastLineBreakPosition = pastBufferReadCount + bufferPos;
-            }
-
-            //prevent DOS (denial of service) attack
-            if (dosCount >= maxValueLength) {
-                throw tmc();
-            }
-            dosCount++;
-
-            //read next character
-            c = readNextChar();
-
-        }
-
-        return c;
-    }
-
-    @Override
-    public final Event next() {
-        //main entry, make decision how to handle the current character in the stream
-
-        if (!hasNext()) {
-            throw new NoSuchElementException();
-        }
-
-        if (previousEvent != 0 && currentStructureElement == null) {
-            throw uexc("Unexpected end of structure");
-        }
-
-        final char c = readNextNonWhitespaceChar();
-
-        if (c == COMMA_CHAR) {
-
-            //last event must one of the following-> " ] } LITERAL
-            if (previousEvent == START_ARRAY || previousEvent == START_OBJECT || previousEvent == COMMA_EVENT || previousEvent == KEY_NAME) {
-                throw uexc("Expected \" ] } LITERAL");
-            }
-
-            previousEvent = COMMA_EVENT;
-            return next();
-
-        }
-
-        if (c == KEY_SEPARATOR) {
-
-            if (previousEvent != KEY_NAME) {
-                throw uexc("A : can only follow a key name");
-            }
-
-            previousEvent = KEY_SEPARATOR_EVENT;
-            return next();
-
-        }
-
-        if (!isCurrentNumberIntegral) {
-            isCurrentNumberIntegral = true;
-        }
-        //        if (currentBigDecimalNumber != null) {
-        //            currentBigDecimalNumber = null;
-        //        }
-        if (currentIntegralNumber != null) {
-            currentIntegralNumber = null;
-        }
-
-        if (fallBackCopyBufferLength != 0) {
-            fallBackCopyBufferLength = 0;
-        }
-
-        startOfValueInBuffer = endOfValueInBuffer = -1;
-
-        switch (c) {
-
-            case START_OBJECT_CHAR:
-
-                return handleStartObject();
-
-            case END_OBJECT_CHAR:
-
-                return handleEndObject();
-
-            case START_ARRAY_CHAR:
-
-                return handleStartArray();
-
-            case END_ARRAY_CHAR:
-
-                return handleEndArray();
-
-            case QUOTE_CHAR:
-
-                return handleQuote();
-
-            case '0':
-            case '1':
-            case '2':
-            case '3':
-            case '4':
-            case '5':
-            case '6':
-            case '7':
-            case '8':
-            case '9':
-            case MINUS:
-            case FALSE_F: // false
-            case TRUE_T: // true
-            case NULL_N: // null
-
-                return handleLiteral(c);
-            default:
-                throw uexc("Excpected structural character or digit or 't' or 'n' or 'f' or '-'");
-
-        }
-
-    }
-
-    private Event handleStartObject() {
-
-        //last event must one of the following-> : , [
-        if (previousEvent != 0 && previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
-            throw uexc("Excpected : , [");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, false);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
-            currentStructureElement = localStructureElement;
-        }
-
-        return EVT_MAP[previousEvent = START_OBJECT];
-
-    }
-
-    private Event handleEndObject() {
-
-        //last event must one of the following-> " ] { } LITERAL
-        if (previousEvent == START_ARRAY || previousEvent == COMMA_EVENT || previousEvent == KEY_NAME
-                || previousEvent == KEY_SEPARATOR_EVENT || currentStructureElement == null) {
-            throw uexc("Expected \" ] { } LITERAL");
-        }
-
-        if (currentStructureElement.isArray) {
-            throw uexc("Expected : ]");
-        }
-
-        //pop from stack
-        currentStructureElement = currentStructureElement.previous;
-
-        return EVT_MAP[previousEvent = END_OBJECT];
-    }
-
-    private Event handleStartArray() {
-
-        //last event must one of the following-> : , [
-        if (previousEvent != 0 && previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
-            throw uexc("Expected : , [");
-        }
-
-        //push upon the stack
-        if (currentStructureElement == null) {
-            currentStructureElement = new StructureElement(null, true);
-        } else {
-            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
-            currentStructureElement = localStructureElement;
-        }
-
-        return EVT_MAP[previousEvent = START_ARRAY];
-    }
-
-    private Event handleEndArray() {
-
-        //last event must one of the following-> [ ] } " LITERAL
-        if (previousEvent == START_OBJECT || previousEvent == COMMA_EVENT || previousEvent == KEY_SEPARATOR_EVENT
-                || currentStructureElement == null) {
-            throw uexc("Expected [ ] } \" LITERAL");
-        }
-
-        if (!currentStructureElement.isArray) {
-            throw uexc("Expected : }");
-        }
-
-        //pop from stack
-        currentStructureElement = currentStructureElement.previous;
-
-        return EVT_MAP[previousEvent = END_ARRAY];
-    }
-
-    //read a string, gets called recursively
-    //Handles escape/d characters
-    //if string contains escape chars and/or cross buffer boundary then copy in the value buffer
-    //if not then denote string start and end in startOfValueInBuffer and endOfValueInBuffer and read directly from buffer
-    private void readString() {
-
-        char n = readNextChar();
-        //when first called n its first char after the starting quote
-        //after that its the next character after the while loop below
-
-        if (n == QUOTE_CHAR) {
-            endOfValueInBuffer = startOfValueInBuffer = bufferPos; //->"" case
-            return;
-        } else if (n == EOL) {
-            throw uexc("Unexpected linebreak");
-
-        } else if (n >= '\u0000' && n <= '\u001F') {
-            throw uexc("Unescaped control character");
-
-        } else if (n == ESCAPE_CHAR) {
-
-            n = readNextChar();
-
-            //  \ u XXXX -> unicode char
-            if (n == 'u') {
-                n = parseUnicodeHexChars();
-                appendToCopyBuffer(n);
-
-                // \\ -> \
-            } else if (n == ESCAPE_CHAR) {
-                appendToCopyBuffer(n);
-
-                //another escape chars, for example \t
-            } else {
-                appendToCopyBuffer(Strings.asEscapedChar(n));
-
-            }
-
-        } else {
-
-            startOfValueInBuffer = bufferPos;
-            endOfValueInBuffer = -1;
-
-            while ((n = readNextChar()) > '\u001F' && n != ESCAPE_CHAR && n != EOL && n != QUOTE_CHAR) {
-                //read fast
-            }
-
-            endOfValueInBuffer = bufferPos;
-
-            if (n == QUOTE_CHAR) {
-
-                if (fallBackCopyBufferLength > 0) {
-                    copyCurrentValue();
-                } else {
-                    if ((endOfValueInBuffer - startOfValueInBuffer) > maxValueLength) {
-                        throw tmc();
-                    }
-
-                }
-
-                return;
-            } else if (n == EOL) {
-                throw uexc("Unexpected linebreak");
-
-            } else if (n >= '\u0000' && n <= '\u001F') {
-                throw uexc("Unescaped control character");
-            }
-
-            copyCurrentValue();
-
-            //current n is one of < '\u001F' -OR- ESCAPE_CHAR -OR- EOL -OR- QUOTE
-
-            bufferPos--; //unread one char
-
-        }
-
-        //recurse until string is terminated by a non escaped quote
-        readString();
-
-    }
-
-    //maybe we want to check invalid utf encoding
-    //not clear yet if the InputStreamReader is doing that
-
-    /*
-    private char checkSurrogates(char n, char highSurrogate) {
-        //check for invalid surrogates
-        //high followed by low       
-        if (Character.isHighSurrogate(n)) {
-
-            if (highSurrogate != 0) {
-                throw uexc("Unexpected high surrogate");
-            }
-            return n;
-        } else if (Character.isLowSurrogate(n)) {
-
-            if (highSurrogate == 0) {
-                throw uexc("Unexpected low surrogate");
-            } else if (!Character.isSurrogatePair(highSurrogate, n)) {
-                throw uexc("Invalid surrogate pair");
-            }
-            return 0;
-        } else if (highSurrogate != 0 && !Character.isLowSurrogate(n)) {
-            throw uexc("Expected low surrogate");
-        }
-        
-        return highSurrogate;
-    }*/
-
-    //read the next four chars, check them and treat them as an single unicode char
-    private char parseUnicodeHexChars() {
-        // \u08Ac etc       
-        return (char) (((parseHexDigit(readNextChar())) * 4096) + ((parseHexDigit(readNextChar())) * 256)
-                + ((parseHexDigit(readNextChar())) * 16) + ((parseHexDigit(readNextChar()))));
-
-    }
-
-    private Event handleQuote() {
-
-        //always the beginning quote of a key or value  
-
-        //last event must one of the following-> : { [ ,
-        if (previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_OBJECT && previousEvent != START_ARRAY
-                && previousEvent != COMMA_EVENT) {
-            throw uexc("Expected : { [ ,");
-        }
-        //starting quote already consumed
-        readString();
-        //end quote already consumed
-
-        //make the decision if its an key or value
-        if (previousEvent == KEY_SEPARATOR_EVENT) {
-            //must be value
-
-            if (currentStructureElement != null && currentStructureElement.isArray) {
-                //not in array, only allowed within array
-                throw uexc("Key value pair not allowed in an array");
-            }
-
-            return EVT_MAP[previousEvent = VALUE_STRING];
-
-        } else { //Event is  START_OBJECT  OR START_ARRAY OR COMMA_EVENT
-            //must be a key if we are in an object, if not its a value 
-
-            if (currentStructureElement != null && currentStructureElement.isArray) {
-                return EVT_MAP[previousEvent = VALUE_STRING];
-            }
-
-            return EVT_MAP[previousEvent = KEY_NAME];
-        }
-
-    }
-
-    //read a number
-    //if a number cross buffer boundary then copy in the value buffer
-    //if not then denote string start and end in startOfValueInBuffer and endOfValueInBuffer and read directly from buffer
-    private void readNumber(final char c) {
-
-        //start can change on any read() if we cross buffer boundary
-        startOfValueInBuffer = bufferPos;
-        endOfValueInBuffer = -1;
-
-        char y = EOF;
-
-        //sum up the digit values 
-        int cumulatedDigitValue = 0;
-        while (isAsciiDigit(y = readNextChar())) {
-
-            if (c == ZERO) {
-                throw uexc("Leading zeros not allowed");
-            }
-
-            if (c == MINUS && cumulatedDigitValue == 48) {
-                throw uexc("Leading zeros after minus not allowed");
-            }
-
-            cumulatedDigitValue += y;
-
-        }
-
-        if (c == MINUS && cumulatedDigitValue == 0) {
-
-            throw uexc("Unexpected premature end of number");
-        }
-
-        if (y == DOT) {
-            isCurrentNumberIntegral = false;
-            cumulatedDigitValue = 0;
-            while (isAsciiDigit(y = readNextChar())) {
-                cumulatedDigitValue++;
-            }
-
-            if (cumulatedDigitValue == 0) {
-
-                throw uexc("Unexpected premature end of number");
-            }
-
-        }
-
-        if (y == EXP_LOWERCASE || y == EXP_UPPERCASE) {
-            isCurrentNumberIntegral = false;
-
-            y = readNextChar(); //+ or - or digit
-
-            if (!isAsciiDigit(y) && y != MINUS && y != PLUS) {
-                throw uexc("Expected DIGIT or + or -");
-            }
-
-            if (y == MINUS || y == PLUS) {
-                y = readNextChar();
-                if (!isAsciiDigit(y)) {
-                    throw uexc("Unexpected premature end of number");
-                }
-
-            }
-
-            while (isAsciiDigit(y = readNextChar())) {
-                //no-op
-            }
-
-        }
-
-        endOfValueInBuffer = bufferPos;
-
-        if (y == COMMA_CHAR || y == END_ARRAY_CHAR || y == END_OBJECT_CHAR || y == EOL || y == SPACE || y == TAB || y == CR) {
-
-            bufferPos--;//unread one char
-
-            //['-', DIGIT]
-            if (isCurrentNumberIntegral && c == MINUS && cumulatedDigitValue >= 48 && cumulatedDigitValue <= 57) {
-
-                currentIntegralNumber = -(cumulatedDigitValue - 48); //optimize -0 till -9
-                return;
-            }
-
-            //[DIGIT]
-            if (isCurrentNumberIntegral && c != MINUS && cumulatedDigitValue == 0) {
-
-                currentIntegralNumber = (c - 48); //optimize 0 till 9
-                return;
-            }
-
-            if (fallBackCopyBufferLength > 0) {
-
-                //we crossed a buffer boundary, use value buffer
-                copyCurrentValue();
-
-            } else {
-                if ((endOfValueInBuffer - startOfValueInBuffer) >= maxValueLength) {
-                    throw tmc();
-                }
-            }
-
-            return;
-
-        }
-
-        throw uexc("Unexpected premature end of number");
-
-    }
-
-    //handles false, true, null and numbers
-    private Event handleLiteral(final char c) {
-
-        //last event must one of the following-> : , [
-        if (previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_ARRAY && previousEvent != COMMA_EVENT) {
-            throw uexc("Excpected : , [");
-        }
-
-        if (previousEvent == COMMA_EVENT && !currentStructureElement.isArray) {
-            //only allowed within array
-            throw uexc("Not in an array context");
-        }
-
-        // probe literals
-        switch (c) {
-            case TRUE_T:
-
-                if (readNextChar() != TRUE_R || readNextChar() != TRUE_U || readNextChar() != TRUE_E) {
-                    throw uexc("Expected LITERAL: true");
-                }
-                return EVT_MAP[previousEvent = VALUE_TRUE];
-            case FALSE_F:
-
-                if (readNextChar() != FALSE_A || readNextChar() != FALSE_L || readNextChar() != FALSE_S || readNextChar() != FALSE_E) {
-                    throw uexc("Expected LITERAL: false");
-                }
-
-                return EVT_MAP[previousEvent = VALUE_FALSE];
-
-            case NULL_N:
-
-                if (readNextChar() != NULL_U || readNextChar() != NULL_L || readNextChar() != NULL_L) {
-                    throw uexc("Expected LITERAL: null");
-                }
-                return EVT_MAP[previousEvent = VALUE_NULL];
-
-            default:
-                readNumber(c);
-                return EVT_MAP[previousEvent = VALUE_NUMBER];
-        }
-
-    }
-
-    @Override
-    public String getString() {
-        if (previousEvent == KEY_NAME || previousEvent == VALUE_STRING || previousEvent == VALUE_NUMBER) {
-
-            //if there a content in the value buffer read from them, if not use main buffer
-            return fallBackCopyBufferLength > 0 ? new String(fallBackCopyBuffer, 0, fallBackCopyBufferLength) : new String(buffer,
-                    startOfValueInBuffer, endOfValueInBuffer - startOfValueInBuffer);
-        } else {
-            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getString()");
-        }
-    }
-
-    @Override
-    public boolean isIntegralNumber() {
-
-        if (previousEvent != VALUE_NUMBER) {
-            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support isIntegralNumber()");
-        } else {
-            return isCurrentNumberIntegral;
-        }
-    }
-
-    @Override
-    public int getInt() {
-        if (previousEvent != VALUE_NUMBER) {
-            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getInt()");
-        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
-            return currentIntegralNumber;
-        } else if (isCurrentNumberIntegral) {
-            //if there a content in the value buffer read from them, if not use main buffer
-            final Integer retVal = fallBackCopyBufferLength > 0 ? parseIntegerFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
-                    : parseIntegerFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
-            if (retVal == null) {
-                return getBigDecimal().intValue();
-            } else {
-                return retVal.intValue();
-            }
-        } else {
-            return getBigDecimal().intValue();
-        }
-    }
-
-    @Override
-    public long getLong() {
-        if (previousEvent != VALUE_NUMBER) {
-            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getLong()");
-        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
-            return currentIntegralNumber;
-        } else if (isCurrentNumberIntegral) {
-            //if there a content in the value buffer read from them, if not use main buffer
-            final Long retVal = fallBackCopyBufferLength > 0 ? parseLongFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
-                    : parseLongFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
-            if (retVal == null) {
-                return getBigDecimal().longValue();
-            } else {
-                return retVal.longValue();
-            }
-        } else {
-            return getBigDecimal().longValue();
-        }
-
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        if (previousEvent != VALUE_NUMBER) {
-            throw new IllegalStateException(EVT_MAP[previousEvent] + " doesn't support getBigDecimal()");
-            //        } else if (currentBigDecimalNumber != null) {
-            //            return currentBigDecimalNumber;
-        } else if (isCurrentNumberIntegral && currentIntegralNumber != null) {
-            return new BigDecimal(currentIntegralNumber);
-        } else if (isCurrentNumberIntegral) {
-            //if there a content in the value buffer read from them, if not use main buffer
-            final Long retVal = fallBackCopyBufferLength > 0 ? parseLongFromChars(fallBackCopyBuffer, 0, fallBackCopyBufferLength)
-                    : parseLongFromChars(buffer, startOfValueInBuffer, endOfValueInBuffer);
-            if (retVal == null) {
-                return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
-                        fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer,
-                        (endOfValueInBuffer - startOfValueInBuffer)));
-            } else {
-                return (/*currentBigDecimalNumber = */new BigDecimal(retVal.longValue()));
-            }
-        } else {
-            //if there a content in the value buffer read from them, if not use main buffer
-            return (/*currentBigDecimalNumber = */fallBackCopyBufferLength > 0 ? new BigDecimal(fallBackCopyBuffer, 0,
-                    fallBackCopyBufferLength) : new BigDecimal(buffer, startOfValueInBuffer, (endOfValueInBuffer - startOfValueInBuffer)));
-        }
-
-    }
-
-    @Override
-    public JsonLocation getLocation() {
-        return createLocation();
-    }
-
-    @Override
-    public void close() {
-        bufferProvider.release(buffer);
-        valueProvider.release(fallBackCopyBuffer);
-
-        try {
-            in.close();
-        } catch (final IOException e) {
-            throw new JsonException("Unexpected IO exception " + e.getMessage(), e);
-        }
-    }
-
-    //parse a char[] to long while checking overflow
-    //if overflowed return null
-    //no additional checks since we are sure here that there are no non digits in the array
-    private static Long parseLongFromChars(final char[] chars, final int start, final int end) {
-
-        long retVal = 0;
-        final boolean negative = chars[start] == MINUS;
-        for (int i = negative ? start + 1 : start; i < end; i++) {
-            final long tmp = retVal * 10 + (chars[i] - ZERO);
-            if (tmp < retVal) { //check overflow
-                return null;
-            } else {
-                retVal = tmp;
-            }
-        }
-
-        return negative ? -retVal : retVal;
-    }
-
-    //parse a char[] to int while checking overflow
-    //if overflowed return null
-    //no additional checks since we are sure here that there are no non digits in the array
-    private static Integer parseIntegerFromChars(final char[] chars, final int start, final int end) {
-
-        int retVal = 0;
-        final boolean negative = chars[start] == MINUS;
-        for (int i = negative ? start + 1 : start; i < end; i++) {
-            final int tmp = retVal * 10 + (chars[i] - ZERO);
-            if (tmp < retVal) { //check overflow
-                return null;
-            } else {
-                retVal = tmp;
-            }
-        }
-
-        return negative ? -retVal : retVal;
-    }
-
-    private JsonParsingException uexc(final char c, final String message) {
-        final JsonLocation location = createLocation();
-        return new JsonParsingException("Unexpected character '" + c + "' (Codepoint: " + String.valueOf(c).codePointAt(0) + ") on "
-                + location + ". Reason is [[" + message + "]]", location);
-    }
-
-    private JsonParsingException uexc(final String message) {
-        final char c = bufferPos < 0 ? 0 : buffer[bufferPos];
-        return uexc(c, message);
-    }
-
-    private JsonParsingException tmc() {
-        final JsonLocation location = createLocation();
-        return new JsonParsingException("Too many characters. Maximum string/number length of " + maxValueLength + " exceeded on "
-                + location, location);
-    }
-
-    private JsonParsingException uexio(final IOException e) {
-        final JsonLocation location = createLocation();
-        return new JsonParsingException("Unexpected IO exception on " + location, e, location);
-    }
-
-    private JsonParsingException cust(final String message) {
-        final JsonLocation location = createLocation();
-        return new JsonParsingException("General exception on " + location + ". Reason is [[" + message + "]]", location);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonStringImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonStringImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonStringImpl.java
deleted file mode 100644
index fe16ce1..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonStringImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.fleece.core;
-
-import javax.json.JsonString;
-
-final class JsonStringImpl implements JsonString {
-    private final String value;
-    private String escape;
-    private Integer hashCode = null;
-
-
-    JsonStringImpl(final String value) {
-        if(value == null) {
-            throw new NullPointerException("value must not be null");
-        }
-
-        this.value = value;
-    }
-
-    @Override
-    public String getString() {
-        return value;
-    }
-
-    @Override
-    public CharSequence getChars() {
-        return value;
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.STRING;
-    }
-
-    @Override
-    public String toString() {
-        String s = escape;
-        if (s == null) {
-            s =  JsonChars.QUOTE_CHAR+Strings.escape(value)+JsonChars.QUOTE_CHAR;
-            escape=s;
-        }
-        return s;
-    }
-
-    @Override
-    public int hashCode() {
-        Integer h = hashCode;
-        if (h == null) {
-            h = value.hashCode();
-            hashCode=h;
-        }
-        return h;
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        return JsonString.class.isInstance(obj) && JsonString.class.cast(obj).getString().equals(value);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterFactoryImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterFactoryImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterFactoryImpl.java
deleted file mode 100644
index 67a4b66..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterFactoryImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Serializable;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.json.JsonWriter;
-import javax.json.JsonWriterFactory;
-import javax.json.stream.JsonGenerator;
-import javax.json.stream.JsonGeneratorFactory;
-
-class JsonWriterFactoryImpl implements JsonWriterFactory, Serializable {
-    private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
-    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
-    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
-        
-        JsonGenerator.PRETTY_PRINTING
-
-    };
-    private final JsonGeneratorFactory factory;
-
-    JsonWriterFactoryImpl(final Map<String, ?> config) {
-        if (config != null) {
-
-            for (final String configKey : SUPPORTED_CONFIG_KEYS) {
-                if (config.containsKey(configKey)) {
-                    internalConfig.put(configKey, config.get(configKey));
-                }
-            }
-        }
-
-        this.factory = new JsonGeneratorFactoryImpl(internalConfig);
-    }
-
-    @Override
-    public JsonWriter createWriter(final Writer writer) {
-        return new JsonWriterImpl(factory.createGenerator(writer));
-    }
-
-    @Override
-    public JsonWriter createWriter(final OutputStream out) {
-        return createWriter(new OutputStreamWriter(out, UTF8_CHARSET));
-    }
-
-    @Override
-    public JsonWriter createWriter(final OutputStream out, final Charset charset) {
-        return createWriter(new OutputStreamWriter(out, charset));
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return Collections.unmodifiableMap(internalConfig);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterImpl.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterImpl.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterImpl.java
deleted file mode 100644
index ef063b0..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/JsonWriterImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.JsonStructure;
-import javax.json.JsonWriter;
-import javax.json.stream.JsonGenerator;
-
-class JsonWriterImpl implements JsonWriter, Serializable{
-    private final JsonGenerator generator;
-    private boolean closed = false;
-
-    JsonWriterImpl(final JsonGenerator generator) {
-        this.generator = generator;
-    }
-
-    @Override
-    public void writeArray(final JsonArray array) {
-        checkClosed();
-        generator.write(array);
-        close();
-    }
-
-    @Override
-    public void writeObject(final JsonObject object) {
-        checkClosed();
-        generator.write(object);
-        close();
-    }
-
-    @Override
-    public void write(final JsonStructure value) {
-        checkClosed();
-        generator.write(value);
-        close();
-    }
-
-    @Override
-    public void close() {
-        
-        if(!closed) {
-            closed = true;
-            generator.close();
-        }
-    }
-    
-    private void checkClosed() {
-        if(closed) {
-            throw new IllegalStateException("writeArray(), writeObject(), write() or close() method was already called");
-        }
-           
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/RFC4627AwareInputStreamReader.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/RFC4627AwareInputStreamReader.java b/fleece-core/src/main/java/org/apache/fleece/core/RFC4627AwareInputStreamReader.java
deleted file mode 100644
index 4abac6e..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/RFC4627AwareInputStreamReader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PushbackInputStream;
-import java.nio.charset.Charset;
-
-import javax.json.JsonException;
-
-final class RFC4627AwareInputStreamReader extends InputStreamReader {
-
-    RFC4627AwareInputStreamReader(final InputStream in) {
-        this(new PushbackInputStream(in,4));
-    }
-    
-    private RFC4627AwareInputStreamReader(final PushbackInputStream in) {
-        super(in, getCharset(in).newDecoder());
-       
-    }
-
-
-    /*
-        * RFC 4627
-
-          JSON text SHALL be encoded in Unicode.  The default encoding is
-          UTF-8.
-       
-          Since the first two characters of a JSON text will always be ASCII
-          characters [RFC0020], it is possible to determine whether an octet
-          stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
-          at the pattern of nulls in the first four octets.
-
-          00 00 00 xx  UTF-32BE
-          00 xx 00 xx  UTF-16BE
-          xx 00 00 00  UTF-32LE
-          xx 00 xx 00  UTF-16LE
-          xx xx xx xx  UTF-8
-
-        */
-
-    private static Charset getCharset(final PushbackInputStream inputStream) {
-        Charset charset = Charset.forName("UTF-8");
-        final byte[] utfBytes = new byte[4];
-        int bomLength=0;
-        try {
-            final int read = inputStream.read(utfBytes);
-            if (read < 2) {
-                throw new JsonException("Invalid Json. Valid Json has at least 2 bytes");
-            } else {
-
-                int first = (utfBytes[0] & 0xFF);
-                int second = (utfBytes[1] & 0xFF);
-                
-                if (first == 0x00) {
-                    charset = (second == 0x00) ? Charset.forName("UTF-32BE") : Charset.forName("UTF-16BE");
-                } else if (read > 2 && second == 0x00) {
-                    int third = (utfBytes[2] & 0xFF);
-                    charset = (third  == 0x00) ? Charset.forName("UTF-32LE") : Charset.forName("UTF-16LE");
-                } else {
-                  
-                    /*check BOM
-
-                    Encoding       hex byte order mark
-                    UTF-8          EF BB BF
-                    UTF-16 (BE)    FE FF
-                    UTF-16 (LE)    FF FE
-                    UTF-32 (BE)    00 00 FE FF
-                    UTF-32 (LE)    FF FE 00 00
-                    */
-                                        
-                    
-                    
-                    
-                    if(first == 0xFE && second == 0xFF) {
-                        charset = Charset.forName("UTF-16BE");
-                        bomLength=2;
-                    } else if(read > 3 && first == 0x00 && second == 0x00 && (utfBytes[2]&0xff) == 0xFE && (utfBytes[3]&0xff) == 0xFF){
-                        charset = Charset.forName("UTF-32BE");
-                        bomLength=4;
-                    } else if(first == 0xFF && second == 0xFE) {
-                        
-                        if(read > 3 && (utfBytes[2]&0xff) == 0x00 && (utfBytes[3]&0xff) == 0x00) {
-                            charset = Charset.forName("UTF-32LE");
-                            bomLength=4;
-                        }else {
-                            charset = Charset.forName("UTF-16LE");
-                            bomLength=2;
-                        }
-                        
-                    } 
-                    
-                    //assume UTF8
-                    
-                }
-
-            }
-            
-            if(bomLength < 4) {
-                inputStream.unread(utfBytes,bomLength==2?2:0,read-bomLength);
-            }
-            
-            
-
-        } catch (final IOException e) {
-            throw new JsonException("Unable to detect charset due to "+e.getMessage(), e);
-        }
-
-        return charset;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/Strings.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/Strings.java b/fleece-core/src/main/java/org/apache/fleece/core/Strings.java
deleted file mode 100644
index e0c6c73..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/Strings.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import javax.json.stream.JsonParsingException;
-
-class Strings implements JsonChars {
-    private static final BufferStrategy.BufferProvider<StringBuilder> BUILDER_CACHE =
-        BufferStrategy.valueOf(System.getProperty("fleece.string-builder.strategy", "QUEUE"))
-            .newStringBuilderProvider(Integer.getInteger("org.apache.fleece.default-string-builder", 1024));
-
-    private static final String UNICODE_PREFIX = "\\u";
-    private static final String UNICODE_PREFIX_HELPER = "000";
-    private static final ConcurrentMap<Character, String> UNICODE_CACHE = new ConcurrentHashMap<Character, String>();
-
-    static char asEscapedChar(final char current) {
-        switch (current) {
-            case 'r':
-                return '\r';
-            case 't':
-                return '\t';
-            case 'b':
-                return '\b';
-            case 'f':
-                return '\f';
-            case 'n':
-                return '\n';
-            case '"':
-                return '\"';
-            case '\\':
-                return '\\';  
-            case '/':
-                return '/';  
-            default:
-                if(Character.isHighSurrogate(current) || Character.isLowSurrogate(current)) {
-                    return current;
-                }
-                throw new JsonParsingException("Invalid escape sequence '"+current +"' (Codepoint: "+String.valueOf(current).
-                        codePointAt(0),JsonLocationImpl.UNKNOW_LOCATION);
-        }
-
-    }
-
-    static String escape(final String value) {
-        
-        if(value == null || value.length()==0) {
-            return value;
-        }
-        
-        final StringBuilder builder = BUILDER_CACHE.newBuffer();
-        try {
-            for (int i = 0; i < value.length(); i++) {
-                final char c = value.charAt(i);
-                switch (c) {
-                    case QUOTE_CHAR:
-                    case ESCAPE_CHAR:
-                        builder.append(ESCAPE_CHAR).append(c);
-                        break;
-                    default:
-                        if (c < SPACE) { // we could do a single switch but actually we should rarely enter this if so no need to pay it
-                            switch (c) {
-                                case EOL:
-                                    builder.append("\\n");
-                                    break;
-                                case '\r':
-                                    builder.append("\\r");
-                                    break;
-                                case '\t':
-                                    builder.append("\\t");
-                                    break;
-                                case '\b':
-                                    builder.append("\\b");
-                                    break;
-                                case '\f':
-                                    builder.append("\\f");
-                                    break;
-                                default:
-                                    builder.append(toUnicode(c));
-                            }
-                        } else if ((c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) {
-                            builder.append(toUnicode(c));
-                        } else {
-                            builder.append(c);
-                        }
-                }
-            }
-            return builder.toString();
-        } finally {
-            BUILDER_CACHE.release(builder);
-        }
-    }
-
-    private static String toUnicode(final char c) {
-        final String found = UNICODE_CACHE.get(c);
-        if (found != null) {
-            return found;
-        }
-
-        final String hex = UNICODE_PREFIX_HELPER + Integer.toHexString(c);
-        final String s = UNICODE_PREFIX + hex.substring(hex.length() - 4);
-        UNICODE_CACHE.putIfAbsent(c, s);
-        return s;
-    }
-
-    private Strings() {
-        // no-op
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/java/org/apache/fleece/core/ThreadLocalBufferCache.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/java/org/apache/fleece/core/ThreadLocalBufferCache.java b/fleece-core/src/main/java/org/apache/fleece/core/ThreadLocalBufferCache.java
deleted file mode 100644
index 14f4ed6..0000000
--- a/fleece-core/src/main/java/org/apache/fleece/core/ThreadLocalBufferCache.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.io.Serializable;
-
-public abstract class ThreadLocalBufferCache<T> implements Serializable {
-    // alloc are expensive so using a very trivial buffer, we remove from TL to say we use it and reset it when we are done (close)
-    private final ThreadLocal<T> buffers;
-    private final int defaultSize;
-
-    public ThreadLocalBufferCache(final int defaultSize) {
-        this.buffers = new ThreadLocal<T>() {
-            @Override
-            protected T initialValue() {
-                return ThreadLocalBufferCache.this.newValue(defaultSize);
-            }
-        };
-        this.defaultSize = defaultSize;
-    }
-
-    protected abstract T newValue(final int defaultSize);
-
-    public T getCache() {
-        final T cachedLoadedChars = buffers.get();
-        if (cachedLoadedChars == null) {
-            return newValue(defaultSize);
-        }
-        buffers.set(null); // remove just kills the buffers
-        return cachedLoadedChars;
-    }
-
-
-    public void release(final T buffer) {
-        buffers.set(buffer);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
----------------------------------------------------------------------
diff --git a/fleece-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider b/fleece-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
deleted file mode 100644
index 0dbd3c3..0000000
--- a/fleece-core/src/main/resources/META-INF/services/javax.json.spi.JsonProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.fleece.core.JsonProviderImpl

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayBuilderImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayBuilderImplTest.java
deleted file mode 100644
index fd443c5..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayBuilderImplTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import javax.json.Json;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonValue;
-
-import org.junit.Test;
-
-public class JsonArrayBuilderImplTest {
-    @Test
-    public void array() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add("a").add("b");
-        assertEquals("[\"a\",\"b\"]", builder.build().toString());
-    }
-    
-    @Test
-    public void escapedStringArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add("a\"").add("\u0000");
-        assertEquals("[\"a\\\"\",\"\\u0000\"]", builder.build().toString());
-    }
-    
-    @Test
-    public void emptyArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        assertEquals("[]", builder.build().toString());
-    }
-    
-    @Test
-    public void emptyArrayInEmtyArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(Json.createArrayBuilder());
-        assertEquals("[[]]", builder.build().toString());
-    }
-    
-    @Test
-    public void arrayInArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(3).add(4);
-        final JsonArrayBuilder builder2 = Json.createArrayBuilder();
-        builder2.add(1).add(2).add(builder);
-        assertEquals("[1,2,[3,4]]", builder2.build().toString());
-    }
-    
-    @Test
-    public void arrayObjectInArray() {
-        final JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
-        objectBuilder.add("key", "val");
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(3).add(4).add(objectBuilder);
-        final JsonArrayBuilder builder2 = Json.createArrayBuilder();
-        builder2.add(1).add(2).add(builder);
-        assertEquals("[1,2,[3,4,{\"key\":\"val\"}]]", builder2.build().toString());
-    }
-    
-    @Test
-    public void nullArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.addNull().addNull();
-        assertEquals("[null,null]", builder.build().toString());
-    }
-    
-    @Test
-    public void nullArrayNonChaining() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.addNull();
-        builder.addNull();
-        assertEquals("[null,null]", builder.build().toString());
-    }
-    
-    @Test
-    public void nullJsonValueArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(JsonValue.NULL).add(JsonValue.NULL);
-        assertEquals("[null,null]", builder.build().toString());
-    }
-    
-    @Test
-    public void boolJsonValueArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(JsonValue.TRUE).add(JsonValue.FALSE);
-        assertEquals("[true,false]", builder.build().toString());
-    }
-    
-    @Test
-    public void numJsonValueArray() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(123.12d).add(new BigDecimal("456.789E-12")).add(-0).add(0).add((short)1).add((byte)1);
-        assertEquals("[123.12,4.56789E-10,0,0,1,1]", builder.build().toString());
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addStringNpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((String) null);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addJVNpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((JsonValue) null);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addBDNpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((BigDecimal) null);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addBINpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((BigInteger) null);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addJABuilderNpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((JsonArrayBuilder) null);
-    }
-    
-    @Test(expected=NullPointerException.class)
-    public void addJOBuilderNpeIfNull() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((JsonObjectBuilder) null);
-    }
-    
-    @Test(expected=NumberFormatException.class)
-    public void addDoubleNpeIfNaN() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((double) Double.NaN);
-    }
-    
-    @Test(expected=NumberFormatException.class)
-    public void addDoubleNpeIfPosInfinite() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((double) Double.POSITIVE_INFINITY);
-    }
-    
-    @Test(expected=NumberFormatException.class)
-    public void addDoubleNpeIfNegIfinite() {
-        final JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add((double) Double.NEGATIVE_INFINITY);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayImplTest.java
deleted file mode 100644
index c8863d4..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonArrayImplTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-
-import org.junit.Test;
-
-public class JsonArrayImplTest {
-    @Test
-    public void arrayToString() {       
-        JsonArrayBuilder ab = Json.createArrayBuilder();
-        
-        ab.add(new JsonStringImpl("a"));
-        ab.add(new JsonStringImpl("b"));
-        assertEquals("[\"a\",\"b\"]", ab.build().toString());
-    }
-    
-    @Test
-    public void arrayIndex() {
-        JsonArrayBuilder ab = Json.createArrayBuilder();
-        ab.add(new JsonStringImpl("a"));
-        ab.add(new JsonStringImpl("b"));
-        ab.add(new JsonLongImpl(5));
-        final JsonArray array = (JsonArray) ab.build();
-        assertFalse(array.isEmpty());
-        assertEquals("a", array.getJsonString(0).getString());
-        assertEquals("b", array.getJsonString(1).getString());
-        assertEquals(5, array.getJsonNumber(2).longValue());
-        assertEquals("[\"a\",\"b\",5]", array.toString());
-    }
-    
-    @Test
-    public void emptyArray() {
-        final JsonArray array = Json.createArrayBuilder().build();
-        assertTrue(array.isEmpty());
-        assertEquals("[]", array.toString());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java
deleted file mode 100644
index 6f501f6..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonGeneratorImplTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.ByteArrayOutputStream;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.HashMap;
-
-import javax.json.Json;
-import javax.json.JsonValue;
-import javax.json.stream.JsonGenerationException;
-import javax.json.stream.JsonGenerator;
-
-import org.junit.Test;
-
-public class JsonGeneratorImplTest {
-    @Test
-    public void notFluentGeneratorUsage() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final JsonGenerator generator = Json.createGenerator(baos);
-        generator.writeStartArray();
-        generator.writeStartObject();
-        generator.writeEnd();
-        generator.writeEnd();
-        generator.close();
-        assertEquals("[{}]", new String(baos.toByteArray()));
-    }
-
-    @Test
-    public void emptyArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final JsonGenerator generator = Json.createGenerator(baos);
-        generator.writeStartArray().writeEnd().close();
-        assertEquals("[]", new String(baos.toByteArray()));
-    }
-
-    @Test
-    public void simpleArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().write(1).write(2).writeEnd().close();
-        assertEquals("[1,2]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void stringArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().write("val1").write("val2").writeEnd().close();
-        assertEquals("[\"val1\",\"val2\"]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void stringArrayEscapes() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().write("\"val1\t\u0010").write("val2\\").writeEnd().close();
-        assertEquals("[\"\\\"val1\\t\\u0010\",\"val2\\\\\"]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void stringArrayEscapes2() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().write("\"val1\t\u0067").write("val2\\").writeEnd().close();
-        assertEquals("[\"\\\"val1\\tg\",\"val2\\\\\"]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void emptyStringArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().writeNull().write("").writeEnd().close();
-        assertEquals("[null,\"\"]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void nullLiteralArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().writeNull().write(JsonValue.NULL).writeEnd().close();
-        assertEquals("[null,null]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void boolLiteralArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos).writeStartArray().write(JsonValue.FALSE).write(JsonValue.TRUE).writeEnd().close();
-        assertEquals("[false,true]", new String(baos.toByteArray()));
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail1() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray("test");      
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail2() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .write("test",1);      
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail3() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartObject()
-        .writeStartObject();
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail4() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeEnd();
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail5() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .close();
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail6() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray()
-        .writeStartObject("test");
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail7() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray()
-        .writeNull()
-        .writeStartObject()
-        .write("a", new BigDecimal("123.123"))
-        .write("b", true)
-        .write("c", new BigInteger("3312"))
-        .write("d", new JsonStringImpl("mystring"))
-        .writeEnd()
-        .close();
-        
-    }
-    
-    @Test(expected=JsonGenerationException.class)
-    public void fail9() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartObject()
-        .write("a", new BigDecimal("123.123"))
-        .write("b", true)
-        .write("c", new BigInteger("3312"))
-        .write("d", new JsonStringImpl("mystring"))
-        .writeEnd()
-        .writeStartObject()
-        .close();
-        
-    }
-   
-    @Test
-    public void numbers() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray()
-        .writeNull()
-        .writeStartObject()
-        .write("a", new BigDecimal("123.123"))
-        .write("b", true)
-        .write("c", new BigInteger("3312"))
-        .write("d", new JsonStringImpl("Mystring"))
-        .writeEnd()
-        .writeEnd()
-        .close();
-        assertEquals("[null,{\"a\":123.123,\"b\":true,\"c\":3312,\"d\":\"Mystring\"}]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void numbers2() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray()
-        .writeNull()
-        .writeStartObject()
-        .write("a", 999999999L)
-        .write("b", 123)
-        .write("c", -444444444L)
-        .write("d",-123)
-        .writeEnd()
-        .writeEnd()
-        .close();
-        assertEquals("[null,{\"a\":999999999,\"b\":123,\"c\":-444444444,\"d\":-123}]", new String(baos.toByteArray()));
-    }
-    
-    @Test
-    public void arrayInArray() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Json.createGenerator(baos)
-        .writeStartArray()
-        .writeStartArray()
-        .writeNull()
-        .writeEnd()
-        .writeEnd()
-        .close();
-         assertEquals("[[null]]", new String(baos.toByteArray()));
-    }
-    
-
-    @Test
-    public void generate() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final JsonGenerator generator = Json.createGenerator(baos);
-
-        generator.writeStartObject().write("firstName", "John").write("lastName", "Smith").write("age", 25)
-        .writeStartObject("address").write("streetAddress", "21 2nd Street").write("city", "New York")
-        .write("state", "NY").write("postalCode", "10021").writeEnd().writeStartArray("phoneNumber")
-        .writeStartObject().write("type", "home").write("number", "212 555-1234").writeEnd().writeStartObject()
-        .write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd().writeEnd().close();
-
-        assertEquals("{\"firstName\":\"John\",\"lastName\":\"Smith\",\"age\":25,\"address\":"
-                + "{\"streetAddress\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"postalCode\":\"10021\"},"
-                + "\"phoneNumber\":[{\"type\":\"home\",\"number\":\"212 555-1234\"},{\"type\":\"fax\",\"number\":\"646 555-4567\"}]}", 
-                new String(baos.toByteArray()));
-    }
-
-    @Test
-    public void pretty() {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final JsonGenerator generator = Json.createGeneratorFactory(new HashMap<String, Object>() {{
-            put(JsonGenerator.PRETTY_PRINTING, true);
-        }}).createGenerator(baos);
-
-        generator.writeStartObject().write("firstName", "John").write("lastName", "Smith")
-        .write("age", 25).writeStartObject("address").write("streetAddress", "21 2nd Street")
-        .write("city", "New York").write("state", "NY").write("postalCode", "10021").writeEnd()
-        .writeStartArray("phoneNumber").writeStartObject().write("type", "home").write("number", "212 555-1234")
-        .writeEnd().writeStartObject().write("type", "fax").write("number", "646 555-4567").writeEnd().writeEnd()
-        .writeEnd().close();
-
-        assertEquals("{\n" +
-                        "  \"firstName\":\"John\",\n" +
-                        "  \"lastName\":\"Smith\",\n" +
-                        "  \"age\":25,\n" +
-                        "  \"address\":{\n" +
-                        "    \"streetAddress\":\"21 2nd Street\",\n" +
-                        "    \"city\":\"New York\",\n" +
-                        "    \"state\":\"NY\",\n" +
-                        "    \"postalCode\":\"10021\"\n" +
-                        "  },\n" +
-                        "  \"phoneNumber\":[\n" +
-                        "    {\n" +
-                        "      \"type\":\"home\",\n" +
-                        "      \"number\":\"212 555-1234\"\n" +
-                        "    },\n" +
-                        "    {\n" +
-                        "      \"type\":\"fax\",\n" +
-                        "      \"number\":\"646 555-4567\"\n" +
-                        "    }\n" +
-                        "  ]\n" +
-                        "}", new String(baos.toByteArray()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonNumberTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonNumberTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonNumberTest.java
deleted file mode 100644
index 7c95827..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonNumberTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.fleece.core;
-
-import java.math.BigInteger;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-
-
-public class JsonNumberTest {
-    
-    @Test(expected=ArithmeticException.class)
-    public void testBigIntegerExact() {
-       
-        JsonArray array = Json.createArrayBuilder().add(100.0200).build();
-        array.getJsonNumber(0).bigIntegerValueExact();
-
-       
-    }
-    
-    @Test
-    public void testBigInteger() {
-       
-        JsonArray array = Json.createArrayBuilder().add(100.0200).build();
-        Assert.assertEquals(new BigInteger("100"), array.getJsonNumber(0).bigIntegerValue());
-
-       
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectBuilderImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectBuilderImplTest.java
deleted file mode 100644
index 3462a41..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectBuilderImplTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import javax.json.Json;
-import javax.json.JsonObjectBuilder;
-
-import org.junit.Test;
-
-public class JsonObjectBuilderImplTest {
-    @Test
-    public void build() {
-        final JsonObjectBuilder builder = Json.createObjectBuilder();
-        builder.add("a", "b");
-        assertEquals("{\"a\":\"b\"}", builder.build().toString());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectImplTest.java
deleted file mode 100644
index 459ee57..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonObjectImplTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import javax.json.Json;
-import javax.json.JsonObjectBuilder;
-
-import org.junit.Test;
-
-public class JsonObjectImplTest {
-    @Test
-    public void objectToString() {
-        final JsonObjectBuilder ob = Json.createObjectBuilder();
-        ob.add("a", new JsonStringImpl("b"));
-        assertEquals("{\"a\":\"b\"}", ob.build().toString());
-    }
-}


[17/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonParserTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonParserTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonParserTest.java
deleted file mode 100644
index 8113b0d..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonParserTest.java
+++ /dev/null
@@ -1,1419 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.NoSuchElementException;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonException;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonReader;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParser.Event;
-import javax.json.stream.JsonParsingException;
-
-import org.junit.Test;
-
-public class JsonParserTest {
-    
-    
-    static final Charset UTF_8 = Charset.forName("UTF-8");
-    static final Charset UTF_16BE = Charset.forName("UTF-16BE");
-    static final Charset UTF_16LE = Charset.forName("UTF-16LE");
-    static final Charset UTF_16 = Charset.forName("UTF-16");
-    static final Charset UTF_32LE = Charset.forName("UTF-32LE");
-    static final Charset UTF_32BE = Charset.forName("UTF-32BE");
-    
-    public JsonParserTest() {
-        super();
-        if (!Charset.defaultCharset().equals(Charset.forName("UTF-8"))) {
-            throw new RuntimeException("Default charset is " + Charset.defaultCharset() + ", must must be UTF-8");
-        }
-    }
-
-    private void assertSimple(final JsonParser parser) {
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("a", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_STRING, event);
-            assertEquals("b", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("c", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(4, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("d", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_ARRAY, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(1, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(-2, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_ARRAY, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_OBJECT, event);
-        }
-        {
-            assertFalse(parser.hasNext());
-        }
-        parser.close();
-    }
-
-    @Test
-    public void array() {
-        final JsonReader loadInMemReader = Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/array.json"));
-        assertNotNull(loadInMemReader);
-        final JsonArray array = loadInMemReader.readArray();
-        assertNotNull(array);
-
-        final JsonParser parser = Json.createParserFactory(Collections.<String, Object>emptyMap()).createParser(array);
-        assertNotNull(parser);
-
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_ARRAY, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_STRING, event);
-            assertEquals("a", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(1, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("b", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_STRING, event);
-            assertEquals("c", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(5, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_ARRAY, event);
-        }
-        {
-            assertFalse(parser.hasNext());
-        }
-    }
-
-    @Test
-    public void simpleInMemory() {
-        final JsonObjectBuilder ob = Json.createObjectBuilder();
-        ob.add("a", new JsonStringImpl("b"));
-        ob.add("c", new JsonNumberImpl(new BigDecimal(4)));
-        JsonArrayBuilder ab = Json.createArrayBuilder();
-        ab.add(new JsonNumberImpl(new BigDecimal(1)));
-        ab.add(new JsonNumberImpl(new BigDecimal(-2)));
-        
-        ob.add("d", ab);
-
-        final JsonParser parser = Json.createParserFactory(Collections.<String, Object>emptyMap()).createParser(ob.build());
-        assertNotNull(parser);
-        assertSimple(parser);
-    }
-
-    @Test
-    public void simple() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"));
-        assertNotNull(parser);
-        assertSimple(parser);
-    }
-    
-    @Test
-    public void simpleUTF16LE() {
-        final JsonParser parser = Json.createParserFactory(null).createParser(Thread.currentThread()
-                .getContextClassLoader().getResourceAsStream("json/simple_utf16le.json"),UTF_16LE);
-        assertNotNull(parser);
-        assertSimple(parser);
-    }
-    
-    @Test
-    public void simpleUTF16LEAutoDetect() {
-        final JsonParser parser = Json.createParserFactory(null).createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple_utf16le.json"));
-        assertNotNull(parser);
-        assertSimple(parser);
-    }
-    
-
-    @Test
-    public void nested() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/nested.json"));
-        assertNotNull(parser);
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("a", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_STRING, event);
-            assertEquals("b", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("c", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("d", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_ARRAY, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(1, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertEquals(2, parser.getInt());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_ARRAY, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_OBJECT, event);
-        }
-        {
-            assertFalse(parser.hasNext());
-        }
-        parser.close();
-    }
-
-    
-    @Test
-    public void numbers() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/numbers.json"));
-        assertNotNull(parser);
-        parser.next();
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(0, parser.getInt());
-            assertEquals(0, parser.getLong());
-            assertEquals(new BigDecimal(0), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(0, parser.getInt());
-            assertEquals(0, parser.getLong());
-            assertEquals(new BigDecimal(0), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(1, parser.getInt());
-            assertEquals(1, parser.getLong());
-            assertEquals(new BigDecimal(1), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(-1, parser.getInt());
-            assertEquals(-1L, parser.getLong());
-            assertEquals(new BigDecimal(-1), parser.getBigDecimal());
-        }
-
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(9, parser.getInt());
-            assertEquals(9L, parser.getLong());
-            assertEquals(new BigDecimal(9), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(-9, parser.getInt());
-            assertEquals(-9, parser.getLong());
-            assertEquals(new BigDecimal(-9), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(10, parser.getInt());
-            assertEquals(10, parser.getLong());
-            assertEquals(new BigDecimal(10), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(-10, parser.getInt());
-            assertEquals(-10, parser.getLong());
-            assertEquals(new BigDecimal(-10), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(100, parser.getInt());
-            assertEquals(100, parser.getLong());
-            assertEquals(new BigDecimal(100), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(-100, parser.getInt());
-            assertEquals(-100, parser.getLong());
-            assertEquals(new BigDecimal(-100), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(456, parser.getInt());
-            assertEquals(456, parser.getLong());
-            assertEquals(new BigDecimal(456), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            assertEquals(-456, parser.getInt());
-            assertEquals(-456, parser.getLong());
-            assertEquals(new BigDecimal(-456), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(!parser.isIntegralNumber());
-            assertEquals(123, parser.getInt());
-            assertEquals(123, parser.getLong());
-            assertEquals(new BigDecimal("123.12345"), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(!parser.isIntegralNumber());
-            assertEquals(-123, parser.getInt());
-            assertEquals(-123, parser.getLong());
-            assertEquals(new BigDecimal("-123.12345"), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            //assertEquals(Integer.MAX_VALUE, parser.getInt());
-            //assertEquals(Long.MAX_VALUE, parser.getLong());
-            assertEquals(new BigDecimal("999999999999999999999999999999"), parser.getBigDecimal());
-        }
-        parser.next();
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertTrue(parser.isIntegralNumber());
-            //assertEquals(Integer.MIN_VALUE, parser.getInt());
-            //assertEquals(Long.MIN_VALUE, parser.getLong());
-            assertEquals(new BigDecimal("-999999999999999999999999999999"), parser.getBigDecimal());
-        }
-        parser.next();
-        
-        {
-            assertFalse(parser.hasNext());
-        }
-        parser.close();
-    }
-    
-    
-    @Test
-    public void bigdecimal() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/bigdecimal.json"));
-        assertNotNull(parser);
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.START_OBJECT, event);
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("a", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertFalse(parser.isIntegralNumber());
-            assertEquals(new BigDecimal("1.23E3"), parser.getBigDecimal());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("b", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertFalse(parser.isIntegralNumber());
-            assertEquals(new BigDecimal("1.23E-3"), parser.getBigDecimal());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.KEY_NAME, event);
-            assertEquals("c", parser.getString());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.VALUE_NUMBER, event);
-            assertFalse(parser.isIntegralNumber());
-            assertEquals(new BigDecimal("1.23E+3"), parser.getBigDecimal());
-        }
-        {
-            assertTrue(parser.hasNext());
-            final JsonParser.Event event = parser.next();
-            assertNotNull(event);
-            assertEquals(JsonParser.Event.END_OBJECT, event);
-        }
-        {
-            assertFalse(parser.hasNext());
-        }
-        parser.close();
-    }
-    
-    @Test(expected=IllegalStateException.class)
-    public void isIntegralThrowsISE() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/bigdecimal.json"));
-        assertNotNull(parser);
-        assertTrue(parser.hasNext());
-        final JsonParser.Event event = parser.next();
-        assertNotNull(event);
-        assertEquals(JsonParser.Event.START_OBJECT, event);
-        assertFalse(parser.isIntegralNumber());
-            
-    }
-    
-    @Test
-    public void escaping() {
-        final JsonParser parser = Json.createParser(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/escaping.json"));
-        parser.next();
-        parser.next();
-        assertEquals("\"", parser.getString());
-        parser.next();
-        assertEquals("\\", parser.getString());
-        parser.next();
-        assertEquals("/", parser.getString());
-        parser.next();
-        assertEquals("\b", parser.getString());
-        parser.next();
-        assertEquals("\f", parser.getString());
-        parser.next();
-        assertEquals("\n", parser.getString());
-        parser.next();
-        assertEquals("\r", parser.getString());
-        parser.next();
-        assertEquals("\t", parser.getString());
-        parser.next();
-        assertEquals("D", parser.getString());
-        parser.next();
-        assertFalse(parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void escapedStringAwareParser() {
-        final JsonParser parser = Json.createParser(Thread.currentThread()
-                .getContextClassLoader().getResourceAsStream("json/stringescape.json"));
-        parser.next();
-        parser.next();
-        parser.next();
-        assertEquals("s\"mit\"", parser.getString());
-        assertEquals("\"s\\\"mit\\\"\"", new JsonStringImpl(parser.getString()).toString());
-        parser.close();
-    }
-
-    @Test
-    public void dosProtected() {
-        // strings
-        {
-            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
-                        put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
-                    }}).createParser(new InputStream() {
-                private int index = 0;
-
-                @Override
-                public int read() throws IOException {
-                    switch (index) {
-                        case 0:
-                            index++;
-                            return '{';
-                        case 1:
-                            index++;
-                            return '"';
-                        default: break;
-                    }
-                    return 'a'; // infinite key
-                }
-            });
-            assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-            try {
-                parser.next(); // should fail cause we try to make a OOME
-                fail();
-            } catch (final JsonParsingException expected) {
-                // no-op
-            }
-            parser.close();
-        }
-        
-        
-        // spaces
-        {
-            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
-                        put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
-                    }}).createParser(new InputStream() {
-                private int index = 0;
-
-                @Override
-                public int read() throws IOException {
-                    switch (index) {
-                        case 0:
-                            index++;
-                            return '{';
-                        default: break;
-                    }
-                    return ' '; // infinite spaces
-                }
-            });
-            assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-            try { // should fail cause we try to make a OOME
-                while (parser.hasNext()) {
-                    parser.next();
-                }
-                fail();
-            } catch (final JsonParsingException expected) {
-                // no-op
-            }
-            parser.close();
-        }
-    }
-
-    @Test
-    public void hasNext() {
-        final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
-            put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
-        }}).createParser(new ByteArrayInputStream("{}".getBytes()));
-        assertTrue(parser.hasNext());
-        assertTrue(parser.hasNext());
-        assertTrue(parser.hasNext());
-        assertTrue(parser.hasNext());
-        assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-        parser.close();
-    }
-
-    @Test(expected = JsonParsingException.class)
-    public void commaChecks() {
-        // using a reader as wrapper of parser
-  
-        Json.createReader(new ByteArrayInputStream("{\"z\":\"b\"\"j\":\"d\"}".getBytes())).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void literalFailChecksTrue() {
-        // using a reader as wrapper of parser
-  
-        Json.createReader(new ByteArrayInputStream("{\"z\":truet}".getBytes())).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void literalFailChecksNull() {
-        // using a reader as wrapper of parser
-  
-        Json.createReader(new ByteArrayInputStream("{\"z\":nulll}".getBytes())).read();
-    }
-    
-    @Test(expected = JsonException.class)
-    public void zeroByteInput() {
-        // using a reader as wrapper of parser
-  
-        Json.createReader(new ByteArrayInputStream(new byte[]{})).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void zeroCharInput() {
-        // using a reader as wrapper of parser
-  
-        Json.createReader(new CharArrayReader(new char[]{})).read();
-    }
-    
-    @Test
-    public void testUTF32LEStream() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF32LE\"]".getBytes(UTF_32LE));
-        JsonParser parser = Json.createParser(bin);
-        parser.next();
-        parser.next();
-        assertEquals("UTF32LE", parser.getString());
-        parser.next();
-        assertTrue(!parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void testUTF32BEStream() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF32BE\"]".getBytes(UTF_32BE));
-        JsonParser parser = Json.createParser(bin);
-        parser.next();
-        parser.next();
-        assertEquals("UTF32BE", parser.getString());
-        parser.next();
-        assertTrue(!parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void testUTF16BEStream() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF16BE\"]".getBytes(UTF_16BE));
-        JsonParser parser = Json.createParser(bin);
-        parser.next();
-        parser.next();
-        assertEquals("UTF16BE", parser.getString());
-        parser.next();
-        assertTrue(!parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void testUTF16LEStream() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF16LE\"]".getBytes(UTF_16LE));
-        JsonParser parser = Json.createParser(bin);
-        parser.next();
-        parser.next();
-        assertEquals("UTF16LE", parser.getString());
-        parser.next();
-        assertTrue(!parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void testUTF8Stream() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[\"UTF8\"]".getBytes(UTF_8));
-        JsonParser parser = Json.createParser(bin);
-        parser.next();
-        parser.next();
-        assertEquals("UTF8", parser.getString());
-        parser.next();
-        assertTrue(!parser.hasNext());
-        parser.close();
-    }
-    
-    @Test
-    public void shortestNonEmtyJsonFile() {
-        // using a reader as wrapper of parser
-  
-        assertEquals(0L, Json.createReader(new ByteArrayInputStream("[0]".getBytes())).readArray().getJsonNumber(0).longValue());
-    }
-    
-    
-    @Test
-    public void shortestNonEmtyJsonFileWithWhiteSpaceChars() {
-        // using a reader as wrapper of parser
-  
-        assertEquals(0L, Json.createReader(new ByteArrayInputStream("  \n\n   [   0  ]  \n\n".getBytes())).readArray().getJsonNumber(0).longValue());
-    }
-    
-    @Test
-    public void escapeStart() {
-        // using a reader as wrapper of parser
-  
-        assertEquals("\\abcdef", Json.createReader(new ByteArrayInputStream("[\"\\\\abcdef\"]".getBytes())).readArray().getString(0));
-    }
-    
-    @Test
-    public void escapeStart2() {
-        // using a reader as wrapper of parser
-  
-        assertEquals("\"abcdef", Json.createReader(new ByteArrayInputStream("[\"\\\"abcdef\"]".getBytes())).readArray().getString(0));
-    }
-    
-    @Test
-    public void threeLiterals() {
-        final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {{
-            put(JsonParserFactoryImpl.MAX_STRING_LENGTH, 10);
-        }}).createParser(new ByteArrayInputStream("{\"a\":true,\"b\":null,\"c\":false,\"arr\":[false, true, null]}".getBytes()));
-        parser.next();
-        parser.next();
-        assertEquals(JsonParser.Event.VALUE_TRUE, parser.next());
-        parser.next();
-        assertEquals(JsonParser.Event.VALUE_NULL, parser.next());
-        parser.next();
-        assertEquals(JsonParser.Event.VALUE_FALSE, parser.next());
-        parser.next();
-        parser.next();
-        assertEquals(JsonParser.Event.VALUE_FALSE, parser.next());
-        assertEquals(JsonParser.Event.VALUE_TRUE, parser.next());
-        assertEquals(JsonParser.Event.VALUE_NULL, parser.next());
-        parser.close();
-    }
-    
-    @Test
-    public void maxStringStringOK() {
-        // using a reader as wrapper of parser
-        Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.max-string-length", "5");
-            }
-        }).createReader(new ByteArrayInputStream("[\"abcde\"]".getBytes())).read();
-       
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void maxStringStringFail() {
-        // using a reader as wrapper of parser
-        Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.max-string-length", "5");
-            }
-        }).createReader(new ByteArrayInputStream("[\"abcdef\"]".getBytes())).read();
-       
-    }
-    
-    @Test
-    public void maxStringNumberOK() {
-        // using a reader as wrapper of parser
-        Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.max-string-length", "5");
-            }
-        }).createReader(new ByteArrayInputStream("[12.3]".getBytes())).read();
-       
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void maxStringNumberFail() {
-        // using a reader as wrapper of parser
-        Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.max-string-length", "5");
-            }
-        }).createReader(new ByteArrayInputStream("[12.333]".getBytes())).read();
-       
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void maxStringWhitespace() {
-        // using a reader as wrapper of parser
-        Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.max-string-length", "5");
-            }
-        }).createReader(new ByteArrayInputStream("[\"12\"           ]".getBytes())).read();
-       
-    }
-    
-    
-    @Test
-    public void testEmptyArray() {
-       JsonParser parser = Json.createParser(new ByteArrayInputStream("[]".getBytes()));
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(false, parser.hasNext());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-            //expected
-        }
-    }
-    
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail1() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail1.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail2() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail2.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail3() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail3.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail4() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail4.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail5() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail5.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail6() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail6.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail7() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail7.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail8() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail8.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail9() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail9.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail10() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail10.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail11() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail11.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail12() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail12.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail13() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail13.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail14() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail14.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail15() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail15.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail16() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail16.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail17() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail17.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail18() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail18.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail19() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail19.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail20() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail20.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail21() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail21.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail22() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail22.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail23() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail23.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail24() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail24.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail25() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail25.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail26() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail26.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail27() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail27.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail28() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail28.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail29() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail29.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail30() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail30.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail31() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail31.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail32() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail32.json")).read();
-    }
-    
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail33() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail33.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail34() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail34.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail35() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail35.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail36() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail36.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail37() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail37.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail38() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail38.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail39() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail39.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail40() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail40.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail41() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail41.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail42() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail42.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail43() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail43.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail44() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail44.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail45() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail45.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail46() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail46.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail47() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail47.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail48() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail48.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail49() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail49.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail50() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail50.json")).read();
-    }
-    
-    //@Test(expected = JsonParsingException.class)
-    public void fail51() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail51.json")).read();
-    }
-    
-    //@Test(expected = JsonParsingException.class)
-    public void fail52() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail52.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail53() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail53.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail54() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail54.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail55() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail55.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail56() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail56.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail57() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail57.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail58() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail58.json")).read();
-    }
-    
-    @Test(expected = JsonException.class)
-    public void fail59() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail59.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail60() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail60.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail61() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail61.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail62() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail62.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail63() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail63.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail64() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail64.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail65() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail65.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail66() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail66.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail67() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail67.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail68() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail68.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail69() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail69.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail70() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail70.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail71() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail71.json")).read();
-    }
-    
-    @Test(expected = JsonParsingException.class)
-    public void fail72() {
-        
-        Json.createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/fails/fail72.json")).read();
-    }
-    
-    
-    @Test
-    public void stringescapeVariousBufferSizesBogus() {
-        
-
-        StringBuilder sb = new StringBuilder();
-        sb.append("\t\"special-\":" + "\"" + "\\\\f\\n\\r\\t\\u6565\uDC00\uD800" + "\",\n");
-        sb.append("\t\"unicode-\\u0000- \":\"\\u5656\uDC00\uD800\"\n");
-        String s = "{"+sb.toString()+"}";
-       
-        for (int i = 1; i < s.length()+100; i++) {
-            final String value = String.valueOf(i);
-
-            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {
-                {
-                    put("org.apache.fleece.default-char-buffer", value);
-                }
-            }).createParser(new ByteArrayInputStream(s.getBytes()));
-            assertNotNull(parser);
-            
-            while(parser.hasNext()) {
-                Event e = parser.next();
-                if(e==null) {
-                    fail();
-                }
-            }
-            
-            assertTrue(!parser.hasNext());
-            parser.close();
-            
-        }
-    }
-    
-    
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonReaderImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonReaderImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonReaderImplTest.java
deleted file mode 100644
index a9ecac7..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonReaderImplTest.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.JsonReader;
-import javax.json.JsonStructure;
-
-import org.junit.Test;
-
-public class JsonReaderImplTest {
-    
-    
-    
-    public JsonReaderImplTest() {
-        super();
-        if (!Charset.defaultCharset().equals(Charset.forName("UTF-8"))) {
-            throw new RuntimeException("Default charset is " + Charset.defaultCharset() + ", must must be UTF-8");
-        }
-    }
-
-    protected static Charset utf8Charset = Charset.forName("UTF8");
-    protected static Charset asciiCharset = Charset.forName("ASCII");
-
-    @SuppressWarnings("unchecked")
-    protected Map<String, ?> getFactoryConfig() {
-        return Collections.EMPTY_MAP;
-    }
-
-    @Test
-    public void simple() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(3, object.size());
-        assertEquals("b", object.getString("a"));
-        assertEquals(4, object.getInt("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(2, array.size());
-        assertEquals(1, array.getInt(0));
-        assertEquals(-2, array.getInt(1));
-        reader.close();
-    }
-
-    @Test
-    public void unicode() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/unicode.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(String.valueOf('\u6565'), object.getString("a"));
-        assertEquals("", object.getString("z"));
-        assertEquals(String.valueOf('\u0000'), object.getString("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(3, array.size());
-        assertEquals(-2, array.getInt(0));
-        assertEquals(" ", array.getString(1));
-        assertEquals("", array.getString(2));
-        assertEquals(5, object.size());
-        reader.close();
-    }
-
-    @Test
-    public void unicodeWithIoReader() {
-        final Reader ioReader = new InputStreamReader(Thread.currentThread().getContextClassLoader()
-                .getResourceAsStream("json/unicode.json"), utf8Charset);
-        final JsonReader reader = Json.createReader(ioReader);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(String.valueOf('\u6565'), object.getString("a"));
-        assertEquals("", object.getString("z"));
-        assertEquals(String.valueOf('\u0000'), object.getString("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(3, array.size());
-        assertEquals(-2, array.getInt(0));
-        assertEquals(" ", array.getString(1));
-        assertEquals("", array.getString(2));
-        assertEquals(5, object.size());
-        reader.close();
-    }
-
-    @Test
-    public void special() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("json/special.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(9, object.size());
-        assertEquals("b,,", object.getString("a{"));
-        assertEquals(":4::,[{", object.getString("c::::"));
-        assertTrue(object.getJsonNumber("w").doubleValue() > 4 && object.getJsonNumber("w").doubleValue() < 5);
-        assertEquals(110, object.getInt("1.4312"));
-        assertEquals("\"", object.getString("\""));
-        assertTrue(object.isNull("\u0044"));
-        assertEquals("ন:4::,[{", object.getString("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#"));
-        reader.close();
-    }
-
-    @Test
-    public void specialWithIoReader() {
-        final Reader ioReader = new InputStreamReader(Thread.currentThread().getContextClassLoader()
-                .getResourceAsStream("json/special.json"), utf8Charset);
-        final JsonReader reader = Json.createReader(ioReader);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(9, object.size());
-        assertEquals("b,,", object.getString("a{"));
-        assertEquals(":4::,[{", object.getString("c::::"));
-        assertTrue(object.getJsonNumber("w").doubleValue() > 4 && object.getJsonNumber("w").doubleValue() < 5);
-        assertEquals(110, object.getInt("1.4312"));
-        assertEquals("\"", object.getString("\""));
-        assertEquals("ন:4::,[{", object.getString("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#"));
-        reader.close();
-    }
-
-    @Test
-    public void specialWithStringAsByteArrayInputStream() {
-        final String s = "{\"নa\":\"hallo\u20acö\uffff \u08a5 থ?ߧ$%&´'`*+#\udbff\udfff\"}";
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(1, object.size());
-        assertEquals("hallo\u20acö\uffff \u08a5 থ?ߧ$%&´'`*+#\udbff\udfff", object.getString("নa"));
-        reader.close();
-    }
-    
-    @Test
-    public void specialKeysWithStringAsByteArrayInputStream() {
-        final String s = "{\"\\\"a\":\"\u0055\",\"\u0055\":\"test2\"}";
-        System.out.println(s);
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(2, object.size());
-        assertEquals("U", object.getString("\"a"));
-        assertEquals("test2", object.getString("U"));
-        reader.close();
-    }
-
-    @Test
-    public void specialWithStringReader() {
-        final String s = "{\"ন:4::,[{\u08a5\":\"থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\ua5a5\"}";
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new InputStreamReader(new ByteArrayInputStream(s.getBytes(utf8Charset)), utf8Charset));
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(1, object.size());
-        assertEquals("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\ua5a5", object.getString("ন:4::,[{\u08a5"));
-        reader.close();
-    }
-
-    @Test
-    public void unicode4Bytes() {
-        final int codepoint = 128149;
-        final char[] charPair = Character.toChars(codepoint);
-        assertNotNull(charPair);
-        assertEquals(2, charPair.length);
-        assertTrue(Character.isHighSurrogate(charPair[0]));
-        assertTrue(Character.isLowSurrogate(charPair[1]));
-        assertTrue(Character.isSurrogatePair(charPair[0], charPair[1]));
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                (new ByteArrayInputStream(("{\"\":\"Ö" + charPair[0] + charPair[1] + "\"}").getBytes(utf8Charset))),
-                utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-
-        assertEquals(codepoint, object.getString("").codePointAt(1));
-        assertEquals("Ö" + new String(charPair), object.getString(""));
-        assertEquals(1, object.size());
-        reader.close();
-    }
-
-    @Test
-    public void unicode3Bytes() {
-        final char[] charPair = Character.toChars("\uffff".codePointAt(0));
-        assertNotNull(charPair);
-        assertEquals(1, charPair.length);
-        assertTrue(!Character.isLowSurrogate(charPair[0]));
-        assertTrue(!Character.isHighSurrogate(charPair[0]));
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new ByteArrayInputStream(("{\"\":\"\uffff\"}").getBytes(utf8Charset)), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(String.valueOf('\uffff'), object.getString(""));
-        assertEquals(1, object.size());
-        reader.close();
-    }
-
-    @Test
-    public void unicode2Bytes() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new ByteArrayInputStream(("{\"\":\"Ö\u00d6\"}").getBytes(utf8Charset)), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals("Ö\u00d6", object.getString(""));
-        assertEquals(1, object.size());
-        reader.close();
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void unicodeFailAscii() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                new ByteArrayInputStream(
-                        "{\"ন:4::,[{\udbff\udfff\":\"থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\udbff\udfff\"}".getBytes(asciiCharset)),
-                utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(1, object.size());
-        assertEquals("থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#\udbff\udfff", object.getString("ন:4::,[{\udbff\udfff"));
-        reader.close();
-    }
-
-    @Test
-    public void parseHuge1MbJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/huge_1mb.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void parseBig600KbJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/big_600kb.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void parseLarge130KbJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/large_130kb.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void parseMedium11KbJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/medium_11kb.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void parseSmall3KbJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/small_3kb.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void parseTiny50BJsonFile() {
-        final JsonReader reader = Json.createReaderFactory(getFactoryConfig()).createReader(
-                Thread.currentThread().getContextClassLoader().getResourceAsStream("bench/tiny_50b.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonStructure object = reader.read();
-        assertNotNull(object);
-        reader.close();
-    }
-
-    @Test
-    public void simpleBadBufferSize8() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "8");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(3, object.size());
-        assertEquals("b", object.getString("a"));
-        assertEquals(4, object.getInt("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(2, array.size());
-        assertEquals(1, array.getInt(0));
-        assertEquals(-2, array.getInt(1));
-        reader.close();
-    }
-    
-    @Test
-    public void simple2BadBufferSize8() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "8");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple2.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(3, object.size());
-        assertEquals("b", object.getString("a"));
-        assertEquals(4, object.getInt("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(2, array.size());
-        assertEquals(1, array.getInt(0));
-        assertEquals(-2, array.getInt(1));
-        reader.close();
-    }
-
-    @Test
-    public void simpleBadBufferSize9() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "9");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/simple.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(3, object.size());
-        assertEquals("b", object.getString("a"));
-        assertEquals(4, object.getInt("c"));
-        assertThat(object.get("d"), instanceOf(JsonArray.class));
-        final JsonArray array = object.getJsonArray("d");
-        assertNotNull(array);
-        assertEquals(2, array.size());
-        assertEquals(1, array.getInt(0));
-        assertEquals(-2, array.getInt(1));
-        reader.close();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void emptyZeroCharBuffersize() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "0");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/empty.json"), utf8Charset);
-        assertNotNull(reader);
-        reader.readObject();
-        reader.close();
-    }
-
-    @Test
-    public void emptyOneCharBufferSize() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "1");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/empty.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonObject object = reader.readObject();
-        assertNotNull(object);
-        assertEquals(0, object.size());
-        reader.close();
-    }
-
-    @Test
-    public void emptyArrayOneCharBufferSize() {
-        final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-            {
-                put("org.apache.fleece.default-char-buffer", "1");
-            }
-        }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/emptyarray.json"), utf8Charset);
-        assertNotNull(reader);
-        final JsonArray array = reader.readArray();
-        assertNotNull(array);
-        assertEquals(0, array.size());
-        reader.close();
-    }
-
-    @Test
-    public void stringescapeVariousBufferSizes() {
-        final int[] buffersizes = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
-                26, 27, 28, 32, 64, 128, 1024, 8192 };
-
-        for (int i = 0; i < buffersizes.length; i++) {
-            final String value = String.valueOf(buffersizes[i]);
-            final JsonReader reader = Json.createReaderFactory(new HashMap<String, Object>() {
-                {
-                    put("org.apache.fleece.default-char-buffer", value);
-                }
-            }).createReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("json/stringescape.json"),
-                    utf8Charset);
-            assertNotNull(reader);
-            final JsonObject object = reader.readObject();
-            assertNotNull(object);
-            assertEquals(1, object.size());
-            assertEquals("s\"mit\"", object.getString("name"));
-            reader.close();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/JsonWriterImplTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/JsonWriterImplTest.java b/fleece-core/src/test/java/org/apache/fleece/core/JsonWriterImplTest.java
deleted file mode 100644
index cf5d18c..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/JsonWriterImplTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.ByteArrayOutputStream;
-
-import javax.json.Json;
-import javax.json.JsonObjectBuilder;
-import javax.json.JsonWriter;
-
-import org.junit.Test;
-
-public class JsonWriterImplTest {
-    @Test
-    public void writer() {
-        final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        final JsonWriter writer = Json.createWriter(out);
-        final JsonObjectBuilder ob = Json.createObjectBuilder();
-        ob.add("a", new JsonStringImpl("b"));
-        writer.write(ob.build());
-        writer.close();
-        assertEquals("{\"a\":\"b\"}", new String(out.toByteArray()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/java/org/apache/fleece/core/LocationTest.java
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/java/org/apache/fleece/core/LocationTest.java b/fleece-core/src/test/java/org/apache/fleece/core/LocationTest.java
deleted file mode 100644
index 313d56e..0000000
--- a/fleece-core/src/test/java/org/apache/fleece/core/LocationTest.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * 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.fleece.core;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.StringReader;
-import java.util.HashMap;
-
-import javax.json.Json;
-import javax.json.JsonReader;
-import javax.json.stream.JsonLocation;
-import javax.json.stream.JsonParser;
-import javax.json.stream.JsonParsingException;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class LocationTest {
-    @Test
-    public void failBytesInput() {
-  
-        try {
-            JsonReader reader = Json.createReader(new StringReader("{\"z\":nulll}"));
-            reader.read();
-            Assert.fail("Exception expected");
-        } catch (JsonParsingException e) {
-            JsonLocation location = e.getLocation();
-            Assert.assertNotNull(location);
-            Assert.assertEquals(new JsonLocationImpl(1, 11, 10), location);
-            
-        }
-        
-        
-        try {
-            JsonReader reader = Json.createReader(new StringReader("{\"z\":\nnulll}"));
-            reader.read();
-            Assert.fail("Exception expected");
-        } catch (JsonParsingException e) {
-            JsonLocation location = e.getLocation();
-            Assert.assertNotNull(location);
-            Assert.assertEquals(new JsonLocationImpl(2, 6, 11), location);
-            
-        }
-        
-        try {
-            JsonReader reader = Json.createReader(new StringReader("aaa"));
-            reader.read();
-            Assert.fail("Exception expected");
-        } catch (JsonParsingException e) {
-            JsonLocation location = e.getLocation();
-            Assert.assertNotNull(location);
-            Assert.assertEquals(new JsonLocationImpl(1, 2, 1), location);
-            
-        }
-    }
-    
-    
-    @Test
-    public void simpleLocation() {
-  
-  
-        JsonParser parser = Json.createParser(new StringReader("{\n    \"ö \uffff c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}"));
-        
-        /*
-         
-         
-{
-    "z a c": null ,
-    "test"  :"testval",
-    "num": 45.1e-12  //2 ws
-}
-         
-         
-         */
-        
-        Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
-        parser.next(); //after first {
-        Assert.assertEquals(new JsonLocationImpl(1, 2, 1), parser.getLocation());
-        parser.next(); //after "ö \uffff c"
-        Assert.assertEquals(new JsonLocationImpl(2, 12, 13), parser.getLocation());
-        parser.next(); //after null   
-        Assert.assertEquals(new JsonLocationImpl(2, 18, 19), parser.getLocation());
-        parser.next(); //after test
-        Assert.assertEquals(new JsonLocationImpl(3, 11, 32), parser.getLocation());    
-        parser.next(); //after testval
-        Assert.assertEquals(new JsonLocationImpl(3, 23, 44), parser.getLocation());    
-        parser.next(); //after num
-        Assert.assertEquals(new JsonLocationImpl(4, 10, 55), parser.getLocation());    
-        parser.next(); //after 45.1e-12
-        Assert.assertEquals(new JsonLocationImpl(4, 20, 65), parser.getLocation());    
-        parser.next(); //after }
-        Assert.assertEquals(new JsonLocationImpl(5, 2, 69), parser.getLocation());    
-       
-    }
-    
-    /*@Test
-    public void simpleLocationBytes() {
-  
-        JsonParser parser = Json.createParser(new ByteArrayInputStream("{\n    \"ö \uffff c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}".getBytes()));
-        
-        Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
-        parser.next(); //after first {
-        Assert.assertEquals(new JsonLocationImpl(1, 2, 2), parser.getLocation());
-        parser.next(); //after "ö \uffff c"
-        Assert.assertEquals(new JsonLocationImpl(2, 12, 26), parser.getLocation());
-        parser.next(); //after null   
-        Assert.assertEquals(new JsonLocationImpl(2, 18, 38), parser.getLocation());
-        parser.next(); //after test
-        Assert.assertEquals(new JsonLocationImpl(3, 11, 64), parser.getLocation());    
-        parser.next(); //after testval
-        Assert.assertEquals(new JsonLocationImpl(3, 23, 88), parser.getLocation());    
-        parser.next(); //after num
-        Assert.assertEquals(new JsonLocationImpl(4, 10, 110), parser.getLocation());    
-        parser.next(); //after 45.1e-12
-        Assert.assertEquals(new JsonLocationImpl(4, 20, 130), parser.getLocation());    
-        parser.next(); //after }
-        Assert.assertEquals(new JsonLocationImpl(5, 2, 138), parser.getLocation());    
-       
-    }*/
-    
-    @Test
-    public void simpleLocationCrossingBufferBoundaries() {
- 
-
-        for (int i = 1; i <= 100; i++) {
-            final String value = String.valueOf(i);
-            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {
-                {
-                    put("org.apache.fleece.default-char-buffer", value);
-                }
-            }).createParser(new StringReader("{\n    \"z a c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}"));
-
-             
-            /*
-             
-             
-    {
-        "z a c": null ,
-        "test"  :"testval",
-        "num": 45.1e-12  //2 ws
-    }
-             
-             
-             */
-            
-           
-            
-            Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
-            parser.next(); //after first {
-            Assert.assertEquals(new JsonLocationImpl(1, 2, 1), parser.getLocation());
-            parser.next(); //after "z a c"
-            Assert.assertEquals(new JsonLocationImpl(2, 12, 13), parser.getLocation());
-            parser.next(); //after null   
-            Assert.assertEquals(new JsonLocationImpl(2, 18, 19), parser.getLocation());
-            parser.next(); //after test
-            Assert.assertEquals(new JsonLocationImpl(3, 11, 32), parser.getLocation());    
-            parser.next(); //after testval
-            Assert.assertEquals(new JsonLocationImpl(3, 23, 44), parser.getLocation());    
-            parser.next(); //after num
-            Assert.assertEquals(new JsonLocationImpl(4, 10, 55), parser.getLocation());    
-            parser.next(); //after 45.1e-12
-            Assert.assertEquals(new JsonLocationImpl(4, 20, 65), parser.getLocation());    
-            parser.next(); //after }
-            Assert.assertEquals(new JsonLocationImpl(5, 2, 69), parser.getLocation());   
-            
-            Assert.assertFalse(parser.hasNext());
-            Assert.assertFalse(parser.hasNext());
-        }
-        
-        
-         
-       
-    }
-    
-    
-    
-    @Test
-    public void testLocationOnParsingException() {
-        //line number, column, offset (measured in chars)
-        //line number and column start at 1
-        //offset start at 0
-        assertJsonLocation("a", new JsonLocationImpl(1, 2, 1));
-        assertJsonLocation("aa", new JsonLocationImpl(1, 2, 1));
-        assertJsonLocation("asa", new JsonLocationImpl(1, 2, 1));
-        assertJsonLocation("{]", new JsonLocationImpl(1, 3, 2));
-        assertJsonLocation("[}", new JsonLocationImpl(1, 3, 2));
-        assertJsonLocation("[a", new JsonLocationImpl(1, 3, 2));
-        assertJsonLocation("[nuLl]", new JsonLocationImpl(1, 5, 4));
-        assertJsonLocation("[falsE]", new JsonLocationImpl(1, 7, 6));
-        assertJsonLocation("[][]", new JsonLocationImpl(1, 4, 3));
-        assertJsonLocation("[1234L]", new JsonLocationImpl(1, 7, 6));
-        assertJsonLocation("[null\n}", new JsonLocationImpl(2, 2, 7));
-        assertJsonLocation("[null\r\n}", new JsonLocationImpl(2, 2, 8));
-        assertJsonLocation("[null\n, null\n}", new JsonLocationImpl(3, 2, 14));
-        assertJsonLocation("[null\r\n, null\r\n}", new JsonLocationImpl(3, 2, 16));
-    }
-
-
-    private void assertJsonLocation(String jsonString, JsonLocation expectedLocation) {
-        JsonParser parser = Json.createParser(new StringReader(jsonString));
-        try {
-            while(parser.hasNext()) {
-                parser.next();
-            }
-            Assert.fail("Expected to throw JsonParsingException for "+jsonString);
-        } catch(JsonParsingException je) {
-            // Expected
-            if (expectedLocation != null) {
-                JsonLocation loc = je.getLocation();
-                assertEquals(expectedLocation.getLineNumber(), loc.getLineNumber());
-                assertEquals(expectedLocation.getColumnNumber(), loc.getColumnNumber());
-                assertEquals(expectedLocation.getStreamOffset(), loc.getStreamOffset());
-            }
-        } finally {
-            parser.close();
-        }
-    }
-}


[07/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
new file mode 100644
index 0000000..8bc2b60
--- /dev/null
+++ b/johnzon-core/src/test/java/org/apache/johnzon/core/LocationTest.java
@@ -0,0 +1,235 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+
+import java.io.StringReader;
+import java.util.HashMap;
+
+import javax.json.Json;
+import javax.json.JsonReader;
+import javax.json.stream.JsonLocation;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParsingException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LocationTest {
+    @Test
+    public void failBytesInput() {
+  
+        try {
+            JsonReader reader = Json.createReader(new StringReader("{\"z\":nulll}"));
+            reader.read();
+            Assert.fail("Exception expected");
+        } catch (JsonParsingException e) {
+            JsonLocation location = e.getLocation();
+            Assert.assertNotNull(location);
+            Assert.assertEquals(new JsonLocationImpl(1, 11, 10), location);
+            
+        }
+        
+        
+        try {
+            JsonReader reader = Json.createReader(new StringReader("{\"z\":\nnulll}"));
+            reader.read();
+            Assert.fail("Exception expected");
+        } catch (JsonParsingException e) {
+            JsonLocation location = e.getLocation();
+            Assert.assertNotNull(location);
+            Assert.assertEquals(new JsonLocationImpl(2, 6, 11), location);
+            
+        }
+        
+        try {
+            JsonReader reader = Json.createReader(new StringReader("aaa"));
+            reader.read();
+            Assert.fail("Exception expected");
+        } catch (JsonParsingException e) {
+            JsonLocation location = e.getLocation();
+            Assert.assertNotNull(location);
+            Assert.assertEquals(new JsonLocationImpl(1, 2, 1), location);
+            
+        }
+    }
+    
+    
+    @Test
+    public void simpleLocation() {
+  
+  
+        JsonParser parser = Json.createParser(new StringReader("{\n    \"ö \uffff c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}"));
+        
+        /*
+         
+         
+{
+    "z a c": null ,
+    "test"  :"testval",
+    "num": 45.1e-12  //2 ws
+}
+         
+         
+         */
+        
+        Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
+        parser.next(); //after first {
+        Assert.assertEquals(new JsonLocationImpl(1, 2, 1), parser.getLocation());
+        parser.next(); //after "ö \uffff c"
+        Assert.assertEquals(new JsonLocationImpl(2, 12, 13), parser.getLocation());
+        parser.next(); //after null   
+        Assert.assertEquals(new JsonLocationImpl(2, 18, 19), parser.getLocation());
+        parser.next(); //after test
+        Assert.assertEquals(new JsonLocationImpl(3, 11, 32), parser.getLocation());    
+        parser.next(); //after testval
+        Assert.assertEquals(new JsonLocationImpl(3, 23, 44), parser.getLocation());    
+        parser.next(); //after num
+        Assert.assertEquals(new JsonLocationImpl(4, 10, 55), parser.getLocation());    
+        parser.next(); //after 45.1e-12
+        Assert.assertEquals(new JsonLocationImpl(4, 20, 65), parser.getLocation());    
+        parser.next(); //after }
+        Assert.assertEquals(new JsonLocationImpl(5, 2, 69), parser.getLocation());    
+       
+    }
+    
+    /*@Test
+    public void simpleLocationBytes() {
+  
+        JsonParser parser = Json.createParser(new ByteArrayInputStream("{\n    \"ö \uffff c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}".getBytes()));
+        
+        Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
+        parser.next(); //after first {
+        Assert.assertEquals(new JsonLocationImpl(1, 2, 2), parser.getLocation());
+        parser.next(); //after "ö \uffff c"
+        Assert.assertEquals(new JsonLocationImpl(2, 12, 26), parser.getLocation());
+        parser.next(); //after null   
+        Assert.assertEquals(new JsonLocationImpl(2, 18, 38), parser.getLocation());
+        parser.next(); //after test
+        Assert.assertEquals(new JsonLocationImpl(3, 11, 64), parser.getLocation());    
+        parser.next(); //after testval
+        Assert.assertEquals(new JsonLocationImpl(3, 23, 88), parser.getLocation());    
+        parser.next(); //after num
+        Assert.assertEquals(new JsonLocationImpl(4, 10, 110), parser.getLocation());    
+        parser.next(); //after 45.1e-12
+        Assert.assertEquals(new JsonLocationImpl(4, 20, 130), parser.getLocation());    
+        parser.next(); //after }
+        Assert.assertEquals(new JsonLocationImpl(5, 2, 138), parser.getLocation());    
+       
+    }*/
+    
+    @Test
+    public void simpleLocationCrossingBufferBoundaries() {
+ 
+
+        for (int i = 1; i <= 100; i++) {
+            final String value = String.valueOf(i);
+            final JsonParser parser = Json.createParserFactory(new HashMap<String, Object>() {
+                {
+                    put("org.apache.johnzon.default-char-buffer", value);
+                }
+            }).createParser(new StringReader("{\n    \"z a c\": null ,\n    \"test\"  :\"testval\",\n    \"num\": 45.1e-12  \n}"));
+
+             
+            /*
+             
+             
+    {
+        "z a c": null ,
+        "test"  :"testval",
+        "num": 45.1e-12  //2 ws
+    }
+             
+             
+             */
+            
+           
+            
+            Assert.assertEquals(new JsonLocationImpl(1, 1, 0), parser.getLocation());
+            parser.next(); //after first {
+            Assert.assertEquals(new JsonLocationImpl(1, 2, 1), parser.getLocation());
+            parser.next(); //after "z a c"
+            Assert.assertEquals(new JsonLocationImpl(2, 12, 13), parser.getLocation());
+            parser.next(); //after null   
+            Assert.assertEquals(new JsonLocationImpl(2, 18, 19), parser.getLocation());
+            parser.next(); //after test
+            Assert.assertEquals(new JsonLocationImpl(3, 11, 32), parser.getLocation());    
+            parser.next(); //after testval
+            Assert.assertEquals(new JsonLocationImpl(3, 23, 44), parser.getLocation());    
+            parser.next(); //after num
+            Assert.assertEquals(new JsonLocationImpl(4, 10, 55), parser.getLocation());    
+            parser.next(); //after 45.1e-12
+            Assert.assertEquals(new JsonLocationImpl(4, 20, 65), parser.getLocation());    
+            parser.next(); //after }
+            Assert.assertEquals(new JsonLocationImpl(5, 2, 69), parser.getLocation());   
+            
+            Assert.assertFalse(parser.hasNext());
+            Assert.assertFalse(parser.hasNext());
+        }
+        
+        
+         
+       
+    }
+    
+    
+    
+    @Test
+    public void testLocationOnParsingException() {
+        //line number, column, offset (measured in chars)
+        //line number and column start at 1
+        //offset start at 0
+        assertJsonLocation("a", new JsonLocationImpl(1, 2, 1));
+        assertJsonLocation("aa", new JsonLocationImpl(1, 2, 1));
+        assertJsonLocation("asa", new JsonLocationImpl(1, 2, 1));
+        assertJsonLocation("{]", new JsonLocationImpl(1, 3, 2));
+        assertJsonLocation("[}", new JsonLocationImpl(1, 3, 2));
+        assertJsonLocation("[a", new JsonLocationImpl(1, 3, 2));
+        assertJsonLocation("[nuLl]", new JsonLocationImpl(1, 5, 4));
+        assertJsonLocation("[falsE]", new JsonLocationImpl(1, 7, 6));
+        assertJsonLocation("[][]", new JsonLocationImpl(1, 4, 3));
+        assertJsonLocation("[1234L]", new JsonLocationImpl(1, 7, 6));
+        assertJsonLocation("[null\n}", new JsonLocationImpl(2, 2, 7));
+        assertJsonLocation("[null\r\n}", new JsonLocationImpl(2, 2, 8));
+        assertJsonLocation("[null\n, null\n}", new JsonLocationImpl(3, 2, 14));
+        assertJsonLocation("[null\r\n, null\r\n}", new JsonLocationImpl(3, 2, 16));
+    }
+
+
+    private void assertJsonLocation(String jsonString, JsonLocation expectedLocation) {
+        JsonParser parser = Json.createParser(new StringReader(jsonString));
+        try {
+            while(parser.hasNext()) {
+                parser.next();
+            }
+            Assert.fail("Expected to throw JsonParsingException for "+jsonString);
+        } catch(JsonParsingException je) {
+            // Expected
+            if (expectedLocation != null) {
+                JsonLocation loc = je.getLocation();
+                assertEquals(expectedLocation.getLineNumber(), loc.getLineNumber());
+                assertEquals(expectedLocation.getColumnNumber(), loc.getColumnNumber());
+                assertEquals(expectedLocation.getStreamOffset(), loc.getStreamOffset());
+            }
+        } finally {
+            parser.close();
+        }
+    }
+}


[15/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/huge_1mb.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/huge_1mb.json b/fleece-core/src/test/resources/bench/huge_1mb.json
deleted file mode 100644
index 2ac39d0..0000000
--- a/fleece-core/src/test/resources/bench/huge_1mb.json
+++ /dev/null
@@ -1,44003 +0,0 @@
-{
-	"special-0":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 0":"\u5656",
-	"bigdecimal0":7817265.00000111,
-	"bigdecimal-2-0":127655512123456.761009E-123,
-	"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int0":4561,
-	"ints0":0,
-	"false0":false,
-	"nil0":false,
-	"n0":      null                ,
-	"obj0":
-		{
-			"special-0":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 0":"\u5656",
-	"bigdecimal0":7817265.00000111,
-			"bigdecimal-2-0":127655512123456.761009E-123,
-			"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int0":4561,
-			"ints0":0,
-			"false0":false,
-			"nil0":false,
-			"obj0":      null                ,
-			"obj0":
-				[    true    ,
-				{
-				"special-0":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 0":"\u5656",
-				"bigdecimal0":7817265.00000111,
-				"bigdecimal-2-0":127655512123456.761009E-123,
-				"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int0":4561,
-				"ints0":0,
-				"false0":false,
-				"nil0":false,
-				"obj0":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-1":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 1":"\u5656",
-	"bigdecimal1":7817265.00000111,
-	"bigdecimal-2-1":127655512123456.761009E-123,
-	"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int1":4561,
-	"ints1":0,
-	"false1":false,
-	"nil1":false,
-	"n1":      null                ,
-	"obj1":
-		{
-			"special-1":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 1":"\u5656",
-	"bigdecimal1":7817265.00000111,
-			"bigdecimal-2-1":127655512123456.761009E-123,
-			"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int1":4561,
-			"ints1":0,
-			"false1":false,
-			"nil1":false,
-			"obj1":      null                ,
-			"obj1":
-				[    true    ,
-				{
-				"special-1":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 1":"\u5656",
-				"bigdecimal1":7817265.00000111,
-				"bigdecimal-2-1":127655512123456.761009E-123,
-				"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int1":4561,
-				"ints1":0,
-				"false1":false,
-				"nil1":false,
-				"obj1":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-2":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 2":"\u5656",
-	"bigdecimal2":7817265.00000111,
-	"bigdecimal-2-2":127655512123456.761009E-123,
-	"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int2":4561,
-	"ints2":0,
-	"false2":false,
-	"nil2":false,
-	"n2":      null                ,
-	"obj2":
-		{
-			"special-2":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 2":"\u5656",
-	"bigdecimal2":7817265.00000111,
-			"bigdecimal-2-2":127655512123456.761009E-123,
-			"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int2":4561,
-			"ints2":0,
-			"false2":false,
-			"nil2":false,
-			"obj2":      null                ,
-			"obj2":
-				[    true    ,
-				{
-				"special-2":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 2":"\u5656",
-				"bigdecimal2":7817265.00000111,
-				"bigdecimal-2-2":127655512123456.761009E-123,
-				"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int2":4561,
-				"ints2":0,
-				"false2":false,
-				"nil2":false,
-				"obj2":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-3":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 3":"\u5656",
-	"bigdecimal3":7817265.00000111,
-	"bigdecimal-2-3":127655512123456.761009E-123,
-	"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int3":4561,
-	"ints3":0,
-	"false3":false,
-	"nil3":false,
-	"n3":      null                ,
-	"obj3":
-		{
-			"special-3":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 3":"\u5656",
-	"bigdecimal3":7817265.00000111,
-			"bigdecimal-2-3":127655512123456.761009E-123,
-			"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int3":4561,
-			"ints3":0,
-			"false3":false,
-			"nil3":false,
-			"obj3":      null                ,
-			"obj3":
-				[    true    ,
-				{
-				"special-3":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 3":"\u5656",
-				"bigdecimal3":7817265.00000111,
-				"bigdecimal-2-3":127655512123456.761009E-123,
-				"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int3":4561,
-				"ints3":0,
-				"false3":false,
-				"nil3":false,
-				"obj3":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-4":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 4":"\u5656",
-	"bigdecimal4":7817265.00000111,
-	"bigdecimal-2-4":127655512123456.761009E-123,
-	"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int4":4561,
-	"ints4":0,
-	"false4":false,
-	"nil4":false,
-	"n4":      null                ,
-	"obj4":
-		{
-			"special-4":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 4":"\u5656",
-	"bigdecimal4":7817265.00000111,
-			"bigdecimal-2-4":127655512123456.761009E-123,
-			"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int4":4561,
-			"ints4":0,
-			"false4":false,
-			"nil4":false,
-			"obj4":      null                ,
-			"obj4":
-				[    true    ,
-				{
-				"special-4":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 4":"\u5656",
-				"bigdecimal4":7817265.00000111,
-				"bigdecimal-2-4":127655512123456.761009E-123,
-				"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int4":4561,
-				"ints4":0,
-				"false4":false,
-				"nil4":false,
-				"obj4":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-5":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 5":"\u5656",
-	"bigdecimal5":7817265.00000111,
-	"bigdecimal-2-5":127655512123456.761009E-123,
-	"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int5":4561,
-	"ints5":0,
-	"false5":false,
-	"nil5":false,
-	"n5":      null                ,
-	"obj5":
-		{
-			"special-5":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 5":"\u5656",
-	"bigdecimal5":7817265.00000111,
-			"bigdecimal-2-5":127655512123456.761009E-123,
-			"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int5":4561,
-			"ints5":0,
-			"false5":false,
-			"nil5":false,
-			"obj5":      null                ,
-			"obj5":
-				[    true    ,
-				{
-				"special-5":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 5":"\u5656",
-				"bigdecimal5":7817265.00000111,
-				"bigdecimal-2-5":127655512123456.761009E-123,
-				"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int5":4561,
-				"ints5":0,
-				"false5":false,
-				"nil5":false,
-				"obj5":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-6":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 6":"\u5656",
-	"bigdecimal6":7817265.00000111,
-	"bigdecimal-2-6":127655512123456.761009E-123,
-	"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int6":4561,
-	"ints6":0,
-	"false6":false,
-	"nil6":false,
-	"n6":      null                ,
-	"obj6":
-		{
-			"special-6":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 6":"\u5656",
-	"bigdecimal6":7817265.00000111,
-			"bigdecimal-2-6":127655512123456.761009E-123,
-			"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int6":4561,
-			"ints6":0,
-			"false6":false,
-			"nil6":false,
-			"obj6":      null                ,
-			"obj6":
-				[    true    ,
-				{
-				"special-6":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 6":"\u5656",
-				"bigdecimal6":7817265.00000111,
-				"bigdecimal-2-6":127655512123456.761009E-123,
-				"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int6":4561,
-				"ints6":0,
-				"false6":false,
-				"nil6":false,
-				"obj6":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-7":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 7":"\u5656",
-	"bigdecimal7":7817265.00000111,
-	"bigdecimal-2-7":127655512123456.761009E-123,
-	"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int7":4561,
-	"ints7":0,
-	"false7":false,
-	"nil7":false,
-	"n7":      null                ,
-	"obj7":
-		{
-			"special-7":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 7":"\u5656",
-	"bigdecimal7":7817265.00000111,
-			"bigdecimal-2-7":127655512123456.761009E-123,
-			"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int7":4561,
-			"ints7":0,
-			"false7":false,
-			"nil7":false,
-			"obj7":      null                ,
-			"obj7":
-				[    true    ,
-				{
-				"special-7":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 7":"\u5656",
-				"bigdecimal7":7817265.00000111,
-				"bigdecimal-2-7":127655512123456.761009E-123,
-				"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int7":4561,
-				"ints7":0,
-				"false7":false,
-				"nil7":false,
-				"obj7":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-8":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 8":"\u5656",
-	"bigdecimal8":7817265.00000111,
-	"bigdecimal-2-8":127655512123456.761009E-123,
-	"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int8":4561,
-	"ints8":0,
-	"false8":false,
-	"nil8":false,
-	"n8":      null                ,
-	"obj8":
-		{
-			"special-8":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 8":"\u5656",
-	"bigdecimal8":7817265.00000111,
-			"bigdecimal-2-8":127655512123456.761009E-123,
-			"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int8":4561,
-			"ints8":0,
-			"false8":false,
-			"nil8":false,
-			"obj8":      null                ,
-			"obj8":
-				[    true    ,
-				{
-				"special-8":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 8":"\u5656",
-				"bigdecimal8":7817265.00000111,
-				"bigdecimal-2-8":127655512123456.761009E-123,
-				"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int8":4561,
-				"ints8":0,
-				"false8":false,
-				"nil8":false,
-				"obj8":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-9":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 9":"\u5656",
-	"bigdecimal9":7817265.00000111,
-	"bigdecimal-2-9":127655512123456.761009E-123,
-	"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int9":4561,
-	"ints9":0,
-	"false9":false,
-	"nil9":false,
-	"n9":      null                ,
-	"obj9":
-		{
-			"special-9":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 9":"\u5656",
-	"bigdecimal9":7817265.00000111,
-			"bigdecimal-2-9":127655512123456.761009E-123,
-			"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int9":4561,
-			"ints9":0,
-			"false9":false,
-			"nil9":false,
-			"obj9":      null                ,
-			"obj9":
-				[    true    ,
-				{
-				"special-9":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 9":"\u5656",
-				"bigdecimal9":7817265.00000111,
-				"bigdecimal-2-9":127655512123456.761009E-123,
-				"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int9":4561,
-				"ints9":0,
-				"false9":false,
-				"nil9":false,
-				"obj9":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-10":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 10":"\u5656",
-	"bigdecimal10":7817265.00000111,
-	"bigdecimal-2-10":127655512123456.761009E-123,
-	"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int10":4561,
-	"ints10":0,
-	"false10":false,
-	"nil10":false,
-	"n10":      null                ,
-	"obj10":
-		{
-			"special-10":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 10":"\u5656",
-	"bigdecimal10":7817265.00000111,
-			"bigdecimal-2-10":127655512123456.761009E-123,
-			"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int10":4561,
-			"ints10":0,
-			"false10":false,
-			"nil10":false,
-			"obj10":      null                ,
-			"obj10":
-				[    true    ,
-				{
-				"special-10":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 10":"\u5656",
-				"bigdecimal10":7817265.00000111,
-				"bigdecimal-2-10":127655512123456.761009E-123,
-				"string-10":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int10":4561,
-				"ints10":0,
-				"false10":false,
-				"nil10":false,
-				"obj10":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-11":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 11":"\u5656",
-	"bigdecimal11":7817265.00000111,
-	"bigdecimal-2-11":127655512123456.761009E-123,
-	"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int11":4561,
-	"ints11":0,
-	"false11":false,
-	"nil11":false,
-	"n11":      null                ,
-	"obj11":
-		{
-			"special-11":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 11":"\u5656",
-	"bigdecimal11":7817265.00000111,
-			"bigdecimal-2-11":127655512123456.761009E-123,
-			"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int11":4561,
-			"ints11":0,
-			"false11":false,
-			"nil11":false,
-			"obj11":      null                ,
-			"obj11":
-				[    true    ,
-				{
-				"special-11":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 11":"\u5656",
-				"bigdecimal11":7817265.00000111,
-				"bigdecimal-2-11":127655512123456.761009E-123,
-				"string-11":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int11":4561,
-				"ints11":0,
-				"false11":false,
-				"nil11":false,
-				"obj11":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-12":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 12":"\u5656",
-	"bigdecimal12":7817265.00000111,
-	"bigdecimal-2-12":127655512123456.761009E-123,
-	"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int12":4561,
-	"ints12":0,
-	"false12":false,
-	"nil12":false,
-	"n12":      null                ,
-	"obj12":
-		{
-			"special-12":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 12":"\u5656",
-	"bigdecimal12":7817265.00000111,
-			"bigdecimal-2-12":127655512123456.761009E-123,
-			"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int12":4561,
-			"ints12":0,
-			"false12":false,
-			"nil12":false,
-			"obj12":      null                ,
-			"obj12":
-				[    true    ,
-				{
-				"special-12":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 12":"\u5656",
-				"bigdecimal12":7817265.00000111,
-				"bigdecimal-2-12":127655512123456.761009E-123,
-				"string-12":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int12":4561,
-				"ints12":0,
-				"false12":false,
-				"nil12":false,
-				"obj12":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-13":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 13":"\u5656",
-	"bigdecimal13":7817265.00000111,
-	"bigdecimal-2-13":127655512123456.761009E-123,
-	"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int13":4561,
-	"ints13":0,
-	"false13":false,
-	"nil13":false,
-	"n13":      null                ,
-	"obj13":
-		{
-			"special-13":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 13":"\u5656",
-	"bigdecimal13":7817265.00000111,
-			"bigdecimal-2-13":127655512123456.761009E-123,
-			"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int13":4561,
-			"ints13":0,
-			"false13":false,
-			"nil13":false,
-			"obj13":      null                ,
-			"obj13":
-				[    true    ,
-				{
-				"special-13":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 13":"\u5656",
-				"bigdecimal13":7817265.00000111,
-				"bigdecimal-2-13":127655512123456.761009E-123,
-				"string-13":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int13":4561,
-				"ints13":0,
-				"false13":false,
-				"nil13":false,
-				"obj13":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-14":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 14":"\u5656",
-	"bigdecimal14":7817265.00000111,
-	"bigdecimal-2-14":127655512123456.761009E-123,
-	"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int14":4561,
-	"ints14":0,
-	"false14":false,
-	"nil14":false,
-	"n14":      null                ,
-	"obj14":
-		{
-			"special-14":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 14":"\u5656",
-	"bigdecimal14":7817265.00000111,
-			"bigdecimal-2-14":127655512123456.761009E-123,
-			"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int14":4561,
-			"ints14":0,
-			"false14":false,
-			"nil14":false,
-			"obj14":      null                ,
-			"obj14":
-				[    true    ,
-				{
-				"special-14":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 14":"\u5656",
-				"bigdecimal14":7817265.00000111,
-				"bigdecimal-2-14":127655512123456.761009E-123,
-				"string-14":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int14":4561,
-				"ints14":0,
-				"false14":false,
-				"nil14":false,
-				"obj14":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-15":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 15":"\u5656",
-	"bigdecimal15":7817265.00000111,
-	"bigdecimal-2-15":127655512123456.761009E-123,
-	"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int15":4561,
-	"ints15":0,
-	"false15":false,
-	"nil15":false,
-	"n15":      null                ,
-	"obj15":
-		{
-			"special-15":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 15":"\u5656",
-	"bigdecimal15":7817265.00000111,
-			"bigdecimal-2-15":127655512123456.761009E-123,
-			"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int15":4561,
-			"ints15":0,
-			"false15":false,
-			"nil15":false,
-			"obj15":      null                ,
-			"obj15":
-				[    true    ,
-				{
-				"special-15":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 15":"\u5656",
-				"bigdecimal15":7817265.00000111,
-				"bigdecimal-2-15":127655512123456.761009E-123,
-				"string-15":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int15":4561,
-				"ints15":0,
-				"false15":false,
-				"nil15":false,
-				"obj15":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-16":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 16":"\u5656",
-	"bigdecimal16":7817265.00000111,
-	"bigdecimal-2-16":127655512123456.761009E-123,
-	"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int16":4561,
-	"ints16":0,
-	"false16":false,
-	"nil16":false,
-	"n16":      null                ,
-	"obj16":
-		{
-			"special-16":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 16":"\u5656",
-	"bigdecimal16":7817265.00000111,
-			"bigdecimal-2-16":127655512123456.761009E-123,
-			"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int16":4561,
-			"ints16":0,
-			"false16":false,
-			"nil16":false,
-			"obj16":      null                ,
-			"obj16":
-				[    true    ,
-				{
-				"special-16":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 16":"\u5656",
-				"bigdecimal16":7817265.00000111,
-				"bigdecimal-2-16":127655512123456.761009E-123,
-				"string-16":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int16":4561,
-				"ints16":0,
-				"false16":false,
-				"nil16":false,
-				"obj16":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-17":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 17":"\u5656",
-	"bigdecimal17":7817265.00000111,
-	"bigdecimal-2-17":127655512123456.761009E-123,
-	"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int17":4561,
-	"ints17":0,
-	"false17":false,
-	"nil17":false,
-	"n17":      null                ,
-	"obj17":
-		{
-			"special-17":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 17":"\u5656",
-	"bigdecimal17":7817265.00000111,
-			"bigdecimal-2-17":127655512123456.761009E-123,
-			"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int17":4561,
-			"ints17":0,
-			"false17":false,
-			"nil17":false,
-			"obj17":      null                ,
-			"obj17":
-				[    true    ,
-				{
-				"special-17":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 17":"\u5656",
-				"bigdecimal17":7817265.00000111,
-				"bigdecimal-2-17":127655512123456.761009E-123,
-				"string-17":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int17":4561,
-				"ints17":0,
-				"false17":false,
-				"nil17":false,
-				"obj17":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-18":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 18":"\u5656",
-	"bigdecimal18":7817265.00000111,
-	"bigdecimal-2-18":127655512123456.761009E-123,
-	"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int18":4561,
-	"ints18":0,
-	"false18":false,
-	"nil18":false,
-	"n18":      null                ,
-	"obj18":
-		{
-			"special-18":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 18":"\u5656",
-	"bigdecimal18":7817265.00000111,
-			"bigdecimal-2-18":127655512123456.761009E-123,
-			"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int18":4561,
-			"ints18":0,
-			"false18":false,
-			"nil18":false,
-			"obj18":      null                ,
-			"obj18":
-				[    true    ,
-				{
-				"special-18":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 18":"\u5656",
-				"bigdecimal18":7817265.00000111,
-				"bigdecimal-2-18":127655512123456.761009E-123,
-				"string-18":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int18":4561,
-				"ints18":0,
-				"false18":false,
-				"nil18":false,
-				"obj18":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-19":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 19":"\u5656",
-	"bigdecimal19":7817265.00000111,
-	"bigdecimal-2-19":127655512123456.761009E-123,
-	"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int19":4561,
-	"ints19":0,
-	"false19":false,
-	"nil19":false,
-	"n19":      null                ,
-	"obj19":
-		{
-			"special-19":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 19":"\u5656",
-	"bigdecimal19":7817265.00000111,
-			"bigdecimal-2-19":127655512123456.761009E-123,
-			"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int19":4561,
-			"ints19":0,
-			"false19":false,
-			"nil19":false,
-			"obj19":      null                ,
-			"obj19":
-				[    true    ,
-				{
-				"special-19":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 19":"\u5656",
-				"bigdecimal19":7817265.00000111,
-				"bigdecimal-2-19":127655512123456.761009E-123,
-				"string-19":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int19":4561,
-				"ints19":0,
-				"false19":false,
-				"nil19":false,
-				"obj19":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-20":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 20":"\u5656",
-	"bigdecimal20":7817265.00000111,
-	"bigdecimal-2-20":127655512123456.761009E-123,
-	"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int20":4561,
-	"ints20":0,
-	"false20":false,
-	"nil20":false,
-	"n20":      null                ,
-	"obj20":
-		{
-			"special-20":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 20":"\u5656",
-	"bigdecimal20":7817265.00000111,
-			"bigdecimal-2-20":127655512123456.761009E-123,
-			"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int20":4561,
-			"ints20":0,
-			"false20":false,
-			"nil20":false,
-			"obj20":      null                ,
-			"obj20":
-				[    true    ,
-				{
-				"special-20":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 20":"\u5656",
-				"bigdecimal20":7817265.00000111,
-				"bigdecimal-2-20":127655512123456.761009E-123,
-				"string-20":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int20":4561,
-				"ints20":0,
-				"false20":false,
-				"nil20":false,
-				"obj20":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-21":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 21":"\u5656",
-	"bigdecimal21":7817265.00000111,
-	"bigdecimal-2-21":127655512123456.761009E-123,
-	"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int21":4561,
-	"ints21":0,
-	"false21":false,
-	"nil21":false,
-	"n21":      null                ,
-	"obj21":
-		{
-			"special-21":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 21":"\u5656",
-	"bigdecimal21":7817265.00000111,
-			"bigdecimal-2-21":127655512123456.761009E-123,
-			"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int21":4561,
-			"ints21":0,
-			"false21":false,
-			"nil21":false,
-			"obj21":      null                ,
-			"obj21":
-				[    true    ,
-				{
-				"special-21":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 21":"\u5656",
-				"bigdecimal21":7817265.00000111,
-				"bigdecimal-2-21":127655512123456.761009E-123,
-				"string-21":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int21":4561,
-				"ints21":0,
-				"false21":false,
-				"nil21":false,
-				"obj21":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-22":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 22":"\u5656",
-	"bigdecimal22":7817265.00000111,
-	"bigdecimal-2-22":127655512123456.761009E-123,
-	"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int22":4561,
-	"ints22":0,
-	"false22":false,
-	"nil22":false,
-	"n22":      null                ,
-	"obj22":
-		{
-			"special-22":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 22":"\u5656",
-	"bigdecimal22":7817265.00000111,
-			"bigdecimal-2-22":127655512123456.761009E-123,
-			"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int22":4561,
-			"ints22":0,
-			"false22":false,
-			"nil22":false,
-			"obj22":      null                ,
-			"obj22":
-				[    true    ,
-				{
-				"special-22":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 22":"\u5656",
-				"bigdecimal22":7817265.00000111,
-				"bigdecimal-2-22":127655512123456.761009E-123,
-				"string-22":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int22":4561,
-				"ints22":0,
-				"false22":false,
-				"nil22":false,
-				"obj22":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-23":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 23":"\u5656",
-	"bigdecimal23":7817265.00000111,
-	"bigdecimal-2-23":127655512123456.761009E-123,
-	"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int23":4561,
-	"ints23":0,
-	"false23":false,
-	"nil23":false,
-	"n23":      null                ,
-	"obj23":
-		{
-			"special-23":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 23":"\u5656",
-	"bigdecimal23":7817265.00000111,
-			"bigdecimal-2-23":127655512123456.761009E-123,
-			"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int23":4561,
-			"ints23":0,
-			"false23":false,
-			"nil23":false,
-			"obj23":      null                ,
-			"obj23":
-				[    true    ,
-				{
-				"special-23":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 23":"\u5656",
-				"bigdecimal23":7817265.00000111,
-				"bigdecimal-2-23":127655512123456.761009E-123,
-				"string-23":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int23":4561,
-				"ints23":0,
-				"false23":false,
-				"nil23":false,
-				"obj23":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-24":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 24":"\u5656",
-	"bigdecimal24":7817265.00000111,
-	"bigdecimal-2-24":127655512123456.761009E-123,
-	"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int24":4561,
-	"ints24":0,
-	"false24":false,
-	"nil24":false,
-	"n24":      null                ,
-	"obj24":
-		{
-			"special-24":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 24":"\u5656",
-	"bigdecimal24":7817265.00000111,
-			"bigdecimal-2-24":127655512123456.761009E-123,
-			"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int24":4561,
-			"ints24":0,
-			"false24":false,
-			"nil24":false,
-			"obj24":      null                ,
-			"obj24":
-				[    true    ,
-				{
-				"special-24":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 24":"\u5656",
-				"bigdecimal24":7817265.00000111,
-				"bigdecimal-2-24":127655512123456.761009E-123,
-				"string-24":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int24":4561,
-				"ints24":0,
-				"false24":false,
-				"nil24":false,
-				"obj24":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-25":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 25":"\u5656",
-	"bigdecimal25":7817265.00000111,
-	"bigdecimal-2-25":127655512123456.761009E-123,
-	"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int25":4561,
-	"ints25":0,
-	"false25":false,
-	"nil25":false,
-	"n25":      null                ,
-	"obj25":
-		{
-			"special-25":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 25":"\u5656",
-	"bigdecimal25":7817265.00000111,
-			"bigdecimal-2-25":127655512123456.761009E-123,
-			"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int25":4561,
-			"ints25":0,
-			"false25":false,
-			"nil25":false,
-			"obj25":      null                ,
-			"obj25":
-				[    true    ,
-				{
-				"special-25":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 25":"\u5656",
-				"bigdecimal25":7817265.00000111,
-				"bigdecimal-2-25":127655512123456.761009E-123,
-				"string-25":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int25":4561,
-				"ints25":0,
-				"false25":false,
-				"nil25":false,
-				"obj25":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-26":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 26":"\u5656",
-	"bigdecimal26":7817265.00000111,
-	"bigdecimal-2-26":127655512123456.761009E-123,
-	"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int26":4561,
-	"ints26":0,
-	"false26":false,
-	"nil26":false,
-	"n26":      null                ,
-	"obj26":
-		{
-			"special-26":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 26":"\u5656",
-	"bigdecimal26":7817265.00000111,
-			"bigdecimal-2-26":127655512123456.761009E-123,
-			"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int26":4561,
-			"ints26":0,
-			"false26":false,
-			"nil26":false,
-			"obj26":      null                ,
-			"obj26":
-				[    true    ,
-				{
-				"special-26":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 26":"\u5656",
-				"bigdecimal26":7817265.00000111,
-				"bigdecimal-2-26":127655512123456.761009E-123,
-				"string-26":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int26":4561,
-				"ints26":0,
-				"false26":false,
-				"nil26":false,
-				"obj26":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-27":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 27":"\u5656",
-	"bigdecimal27":7817265.00000111,
-	"bigdecimal-2-27":127655512123456.761009E-123,
-	"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int27":4561,
-	"ints27":0,
-	"false27":false,
-	"nil27":false,
-	"n27":      null                ,
-	"obj27":
-		{
-			"special-27":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 27":"\u5656",
-	"bigdecimal27":7817265.00000111,
-			"bigdecimal-2-27":127655512123456.761009E-123,
-			"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int27":4561,
-			"ints27":0,
-			"false27":false,
-			"nil27":false,
-			"obj27":      null                ,
-			"obj27":
-				[    true    ,
-				{
-				"special-27":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 27":"\u5656",
-				"bigdecimal27":7817265.00000111,
-				"bigdecimal-2-27":127655512123456.761009E-123,
-				"string-27":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int27":4561,
-				"ints27":0,
-				"false27":false,
-				"nil27":false,
-				"obj27":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-28":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 28":"\u5656",
-	"bigdecimal28":7817265.00000111,
-	"bigdecimal-2-28":127655512123456.761009E-123,
-	"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int28":4561,
-	"ints28":0,
-	"false28":false,
-	"nil28":false,
-	"n28":      null                ,
-	"obj28":
-		{
-			"special-28":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 28":"\u5656",
-	"bigdecimal28":7817265.00000111,
-			"bigdecimal-2-28":127655512123456.761009E-123,
-			"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int28":4561,
-			"ints28":0,
-			"false28":false,
-			"nil28":false,
-			"obj28":      null                ,
-			"obj28":
-				[    true    ,
-				{
-				"special-28":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 28":"\u5656",
-				"bigdecimal28":7817265.00000111,
-				"bigdecimal-2-28":127655512123456.761009E-123,
-				"string-28":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int28":4561,
-				"ints28":0,
-				"false28":false,
-				"nil28":false,
-				"obj28":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-29":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 29":"\u5656",
-	"bigdecimal29":7817265.00000111,
-	"bigdecimal-2-29":127655512123456.761009E-123,
-	"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int29":4561,
-	"ints29":0,
-	"false29":false,
-	"nil29":false,
-	"n29":      null                ,
-	"obj29":
-		{
-			"special-29":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 29":"\u5656",
-	"bigdecimal29":7817265.00000111,
-			"bigdecimal-2-29":127655512123456.761009E-123,
-			"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int29":4561,
-			"ints29":0,
-			"false29":false,
-			"nil29":false,
-			"obj29":      null                ,
-			"obj29":
-				[    true    ,
-				{
-				"special-29":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 29":"\u5656",
-				"bigdecimal29":7817265.00000111,
-				"bigdecimal-2-29":127655512123456.761009E-123,
-				"string-29":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int29":4561,
-				"ints29":0,
-				"false29":false,
-				"nil29":false,
-				"obj29":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-30":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 30":"\u5656",
-	"bigdecimal30":7817265.00000111,
-	"bigdecimal-2-30":127655512123456.761009E-123,
-	"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int30":4561,
-	"ints30":0,
-	"false30":false,
-	"nil30":false,
-	"n30":      null                ,
-	"obj30":
-		{
-			"special-30":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 30":"\u5656",
-	"bigdecimal30":7817265.00000111,
-			"bigdecimal-2-30":127655512123456.761009E-123,
-			"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int30":4561,
-			"ints30":0,
-			"false30":false,
-			"nil30":false,
-			"obj30":      null                ,
-			"obj30":
-				[    true    ,
-				{
-				"special-30":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 30":"\u5656",
-				"bigdecimal30":7817265.00000111,
-				"bigdecimal-2-30":127655512123456.761009E-123,
-				"string-30":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int30":4561,
-				"ints30":0,
-				"false30":false,
-				"nil30":false,
-				"obj30":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-31":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 31":"\u5656",
-	"bigdecimal31":7817265.00000111,
-	"bigdecimal-2-31":127655512123456.761009E-123,
-	"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int31":4561,
-	"ints31":0,
-	"false31":false,
-	"nil31":false,
-	"n31":      null                ,
-	"obj31":
-		{
-			"special-31":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 31":"\u5656",
-	"bigdecimal31":7817265.00000111,
-			"bigdecimal-2-31":127655512123456.761009E-123,
-			"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int31":4561,
-			"ints31":0,
-			"false31":false,
-			"nil31":false,
-			"obj31":      null                ,
-			"obj31":
-				[    true    ,
-				{
-				"special-31":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 31":"\u5656",
-				"bigdecimal31":7817265.00000111,
-				"bigdecimal-2-31":127655512123456.761009E-123,
-				"string-31":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int31":4561,
-				"ints31":0,
-				"false31":false,
-				"nil31":false,
-				"obj31":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-32":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 32":"\u5656",
-	"bigdecimal32":7817265.00000111,
-	"bigdecimal-2-32":127655512123456.761009E-123,
-	"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int32":4561,
-	"ints32":0,
-	"false32":false,
-	"nil32":false,
-	"n32":      null                ,
-	"obj32":
-		{
-			"special-32":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 32":"\u5656",
-	"bigdecimal32":7817265.00000111,
-			"bigdecimal-2-32":127655512123456.761009E-123,
-			"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int32":4561,
-			"ints32":0,
-			"false32":false,
-			"nil32":false,
-			"obj32":      null                ,
-			"obj32":
-				[    true    ,
-				{
-				"special-32":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 32":"\u5656",
-				"bigdecimal32":7817265.00000111,
-				"bigdecimal-2-32":127655512123456.761009E-123,
-				"string-32":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int32":4561,
-				"ints32":0,
-				"false32":false,
-				"nil32":false,
-				"obj32":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-33":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 33":"\u5656",
-	"bigdecimal33":7817265.00000111,
-	"bigdecimal-2-33":127655512123456.761009E-123,
-	"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int33":4561,
-	"ints33":0,
-	"false33":false,
-	"nil33":false,
-	"n33":      null                ,
-	"obj33":
-		{
-			"special-33":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 33":"\u5656",
-	"bigdecimal33":7817265.00000111,
-			"bigdecimal-2-33":127655512123456.761009E-123,
-			"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int33":4561,
-			"ints33":0,
-			"false33":false,
-			"nil33":false,
-			"obj33":      null                ,
-			"obj33":
-				[    true    ,
-				{
-				"special-33":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 33":"\u5656",
-				"bigdecimal33":7817265.00000111,
-				"bigdecimal-2-33":127655512123456.761009E-123,
-				"string-33":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int33":4561,
-				"ints33":0,
-				"false33":false,
-				"nil33":false,
-				"obj33":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-34":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 34":"\u5656",
-	"bigdecimal34":7817265.00000111,
-	"bigdecimal-2-34":127655512123456.761009E-123,
-	"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int34":4561,
-	"ints34":0,
-	"false34":false,
-	"nil34":false,
-	"n34":      null                ,
-	"obj34":
-		{
-			"special-34":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 34":"\u5656",
-	"bigdecimal34":7817265.00000111,
-			"bigdecimal-2-34":127655512123456.761009E-123,
-			"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int34":4561,
-			"ints34":0,
-			"false34":false,
-			"nil34":false,
-			"obj34":      null                ,
-			"obj34":
-				[    true    ,
-				{
-				"special-34":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 34":"\u5656",
-				"bigdecimal34":7817265.00000111,
-				"bigdecimal-2-34":127655512123456.761009E-123,
-				"string-34":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int34":4561,
-				"ints34":0,
-				"false34":false,
-				"nil34":false,
-				"obj34":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-35":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 35":"\u5656",
-	"bigdecimal35":7817265.00000111,
-	"bigdecimal-2-35":127655512123456.761009E-123,
-	"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int35":4561,
-	"ints35":0,
-	"false35":false,
-	"nil35":false,
-	"n35":      null                ,
-	"obj35":
-		{
-			"special-35":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 35":"\u5656",
-	"bigdecimal35":7817265.00000111,
-			"bigdecimal-2-35":127655512123456.761009E-123,
-			"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int35":4561,
-			"ints35":0,
-			"false35":false,
-			"nil35":false,
-			"obj35":      null                ,
-			"obj35":
-				[    true    ,
-				{
-				"special-35":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 35":"\u5656",
-				"bigdecimal35":7817265.00000111,
-				"bigdecimal-2-35":127655512123456.761009E-123,
-				"string-35":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int35":4561,
-				"ints35":0,
-				"false35":false,
-				"nil35":false,
-				"obj35":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-36":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 36":"\u5656",
-	"bigdecimal36":7817265.00000111,
-	"bigdecimal-2-36":127655512123456.761009E-123,
-	"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int36":4561,
-	"ints36":0,
-	"false36":false,
-	"nil36":false,
-	"n36":      null                ,
-	"obj36":
-		{
-			"special-36":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 36":"\u5656",
-	"bigdecimal36":7817265.00000111,
-			"bigdecimal-2-36":127655512123456.761009E-123,
-			"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int36":4561,
-			"ints36":0,
-			"false36":false,
-			"nil36":false,
-			"obj36":      null                ,
-			"obj36":
-				[    true    ,
-				{
-				"special-36":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 36":"\u5656",
-				"bigdecimal36":7817265.00000111,
-				"bigdecimal-2-36":127655512123456.761009E-123,
-				"string-36":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int36":4561,
-				"ints36":0,
-				"false36":false,
-				"nil36":false,
-				"obj36":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-37":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 37":"\u5656",
-	"bigdecimal37":7817265.00000111,
-	"bigdecimal-2-37":127655512123456.761009E-123,
-	"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int37":4561,
-	"ints37":0,
-	"false37":false,
-	"nil37":false,
-	"n37":      null                ,
-	"obj37":
-		{
-			"special-37":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 37":"\u5656",
-	"bigdecimal37":7817265.00000111,
-			"bigdecimal-2-37":127655512123456.761009E-123,
-			"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int37":4561,
-			"ints37":0,
-			"false37":false,
-			"nil37":false,
-			"obj37":      null                ,
-			"obj37":
-				[    true    ,
-				{
-				"special-37":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 37":"\u5656",
-				"bigdecimal37":7817265.00000111,
-				"bigdecimal-2-37":127655512123456.761009E-123,
-				"string-37":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int37":4561,
-				"ints37":0,
-				"false37":false,
-				"nil37":false,
-				"obj37":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-38":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 38":"\u5656",
-	"bigdecimal38":7817265.00000111,
-	"bigdecimal-2-38":127655512123456.761009E-123,
-	"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int38":4561,
-	"ints38":0,
-	"false38":false,
-	"nil38":false,
-	"n38":      null                ,
-	"obj38":
-		{
-			"special-38":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 38":"\u5656",
-	"bigdecimal38":7817265.00000111,
-			"bigdecimal-2-38":127655512123456.761009E-123,
-			"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int38":4561,
-			"ints38":0,
-			"false38":false,
-			"nil38":false,
-			"obj38":      null                ,
-			"obj38":
-				[    true    ,
-				{
-				"special-38":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 38":"\u5656",
-				"bigdecimal38":7817265.00000111,
-				"bigdecimal-2-38":127655512123456.761009E-123,
-				"string-38":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int38":4561,
-				"ints38":0,
-				"false38":false,
-				"nil38":false,
-				"obj38":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-39":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 39":"\u5656",
-	"bigdecimal39":7817265.00000111,
-	"bigdecimal-2-39":127655512123456.761009E-123,
-	"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int39":4561,
-	"ints39":0,
-	"false39":false,
-	"nil39":false,
-	"n39":      null                ,
-	"obj39":
-		{
-			"special-39":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 39":"\u5656",
-	"bigdecimal39":7817265.00000111,
-			"bigdecimal-2-39":127655512123456.761009E-123,
-			"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int39":4561,
-			"ints39":0,
-			"false39":false,
-			"nil39":false,
-			"obj39":      null                ,
-			"obj39":
-				[    true    ,
-				{
-				"special-39":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 39":"\u5656",
-				"bigdecimal39":7817265.00000111,
-				"bigdecimal-2-39":127655512123456.761009E-123,
-				"string-39":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int39":4561,
-				"ints39":0,
-				"false39":false,
-				"nil39":false,
-				"obj39":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-40":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 40":"\u5656",
-	"bigdecimal40":7817265.00000111,
-	"bigdecimal-2-40":127655512123456.761009E-123,
-	"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int40":4561,
-	"ints40":0,
-	"false40":false,
-	"nil40":false,
-	"n40":      null                ,
-	"obj40":
-		{
-			"special-40":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 40":"\u5656",
-	"bigdecimal40":7817265.00000111,
-			"bigdecimal-2-40":127655512123456.761009E-123,
-			"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int40":4561,
-			"ints40":0,
-			"false40":false,
-			"nil40":false,
-			"obj40":      null                ,
-			"obj40":
-				[    true    ,
-				{
-				"special-40":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 40":"\u5656",
-				"bigdecimal40":7817265.00000111,
-				"bigdecimal-2-40":127655512123456.761009E-123,
-				"string-40":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int40":4561,
-				"ints40":0,
-				"false40":false,
-				"nil40":false,
-				"obj40":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-41":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 41":"\u5656",
-	"bigdecimal41":7817265.00000111,
-	"bigdecimal-2-41":127655512123456.761009E-123,
-	"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int41":4561,
-	"ints41":0,
-	"false41":false,
-	"nil41":false,
-	"n41":      null                ,
-	"obj41":
-		{
-			"special-41":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 41":"\u5656",
-	"bigdecimal41":7817265.00000111,
-			"bigdecimal-2-41":127655512123456.761009E-123,
-			"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int41":4561,
-			"ints41":0,
-			"false41":false,
-			"nil41":false,
-			"obj41":      null                ,
-			"obj41":
-				[    true    ,
-				{
-				"special-41":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 41":"\u5656",
-				"bigdecimal41":7817265.00000111,
-				"bigdecimal-2-41":127655512123456.761009E-123,
-				"string-41":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int41":4561,
-				"ints41":0,
-				"false41":false,
-				"nil41":false,
-				"obj41":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-42":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 42":"\u5656",
-	"bigdecimal42":7817265.00000111,
-	"bigdecimal-2-42":127655512123456.761009E-123,
-	"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int42":4561,
-	"ints42":0,
-	"false42":false,
-	"nil42":false,
-	"n42":      null                ,
-	"obj42":
-		{
-			"special-42":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 42":"\u5656",
-	"bigdecimal42":7817265.00000111,
-			"bigdecimal-2-42":127655512123456.761009E-123,
-			"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int42":4561,
-			"ints42":0,
-			"false42":false,
-			"nil42":false,
-			"obj42":      null                ,
-			"obj42":
-				[    true    ,
-				{
-				"special-42":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 42":"\u5656",
-				"bigdecimal42":7817265.00000111,
-				"bigdecimal-2-42":127655512123456.761009E-123,
-				"string-42":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int42":4561,
-				"ints42":0,
-				"false42":false,
-				"nil42":false,
-				"obj42":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-43":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 43":"\u5656",
-	"bigdecimal43":7817265.00000111,
-	"bigdecimal-2-43":127655512123456.761009E-123,
-	"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int43":4561,
-	"ints43":0,
-	"false43":false,
-	"nil43":false,
-	"n43":      null                ,
-	"obj43":
-		{
-			"special-43":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 43":"\u5656",
-	"bigdecimal43":7817265.00000111,
-			"bigdecimal-2-43":127655512123456.761009E-123,
-			"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int43":4561,
-			"ints43":0,
-			"false43":false,
-			"nil43":false,
-			"obj43":      null                ,
-			"obj43":
-				[    true    ,
-				{
-				"special-43":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 43":"\u5656",
-				"bigdecimal43":7817265.00000111,
-				"bigdecimal-2-43":127655512123456.761009E-123,
-				"string-43":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int43":4561,
-				"ints43":0,
-				"false43":false,
-				"nil43":false,
-				"obj43":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-44":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 44":"\u5656",
-	"bigdecimal44":7817265.00000111,
-	"bigdecimal-2-44":127655512123456.761009E-123,
-	"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int44":4561,
-	"ints44":0,
-	"false44":false,
-	"nil44":false,
-	"n44":      null                ,
-	"obj44":
-		{
-			"special-44":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 44":"\u5656",
-	"bigdecimal44":7817265.00000111,
-			"bigdecimal-2-44":127655512123456.761009E-123,
-			"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int44":4561,
-			"ints44":0,
-			"false44":false,
-			"nil44":false,
-			"obj44":      null                ,
-			"obj44":
-				[    true    ,
-				{
-				"special-44":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 44":"\u5656",
-				"bigdecimal44":7817265.00000111,
-				"bigdecimal-2-44":127655512123456.761009E-123,
-				"string-44":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int44":4561,
-				"ints44":0,
-				"false44":false,
-				"nil44":false,
-				"obj44":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-45":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 45":"\u5656",
-	"bigdecimal45":7817265.00000111,
-	"bigdecimal-2-45":127655512123456.761009E-123,
-	"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int45":4561,
-	"ints45":0,
-	"false45":false,
-	"nil45":false,
-	"n45":      null                ,
-	"obj45":
-		{
-			"special-45":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 45":"\u5656",
-	"bigdecimal45":7817265.00000111,
-			"bigdecimal-2-45":127655512123456.761009E-123,
-			"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int45":4561,
-			"ints45":0,
-			"false45":false,
-			"nil45":false,
-			"obj45":      null                ,
-			"obj45":
-				[    true    ,
-				{
-				"special-45":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 45":"\u5656",
-				"bigdecimal45":7817265.00000111,
-				"bigdecimal-2-45":127655512123456.761009E-123,
-				"string-45":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int45":4561,
-				"ints45":0,
-				"false45":false,
-				"nil45":false,
-				"obj45":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-46":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 46":"\u5656",
-	"bigdecimal46":7817265.00000111,
-	"bigdecimal-2-46":127655512123456.761009E-123,
-	"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int46":4561,
-	"ints46":0,
-	"false46":false,
-	"nil46":false,
-	"n46":      null                ,
-	"obj46":
-		{
-			"special-46":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 46":"\u5656",
-	"bigdecimal46":7817265.00000111,
-			"bigdecimal-2-46":127655512123456.761009E-123,
-			"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int46":4561,
-			"ints46":0,
-			"false46":false,
-			"nil46":false,
-			"obj46":      null                ,
-			"obj46":
-				[    true    ,
-				{
-				"special-46":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 46":"\u5656",
-				"bigdecimal46":7817265.00000111,
-				"bigdecimal-2-46":127655512123456.761009E-123,
-				"string-46":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int46":4561,
-				"ints46":0,
-				"false46":false,
-				"nil46":false,
-				"obj46":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-47":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 47":"\u5656",
-	"bigdecimal47":7817265.00000111,
-	"bigdecimal-2-47":127655512123456.761009E-123,
-	"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int47":4561,
-	"ints47":0,
-	"false47":false,
-	"nil47":false,
-	"n47":      null                ,
-	"obj47":
-		{
-			"special-47":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 47":"\u5656",
-	"bigdecimal47":7817265.00000111,
-			"bigdecimal-2-47":127655512123456.761009E-123,
-			"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int47":4561,
-			"ints47":0,
-			"false47":false,
-			"nil47":false,
-			"obj47":      null                ,
-			"obj47":
-				[    true    ,
-				{
-				"special-47":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 47":"\u5656",
-				"bigdecimal47":7817265.00000111,
-				"bigdecimal-2-47":127655512123456.761009E-123,
-				"string-47":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int47":4561,
-				"ints47":0,
-				"false47":false,
-				"nil47":false,
-				"obj47":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-48":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 48":"\u5656",
-	"bigdecimal48":7817265.00000111,
-	"bigdecimal-2-48":127655512123456.761009E-123,
-	"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int48":4561,
-	"ints48":0,
-	"false48":false,
-	"nil48":false,
-	"n48":      null                ,
-	"obj48":
-		{
-			"special-48":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 48":"\u5656",
-	"bigdecimal48":7817265.00000111,
-			"bigdecimal-2-48":127655512123456.761009E-123,
-			"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int48":4561,
-			"ints48":0,
-			"false48":false,
-			"nil48":false,
-			"obj48":      null                ,
-			"obj48":
-				[    true    ,
-				{
-				"special-48":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 48":"\u5656",
-				"bigdecimal48":7817265.00000111,
-				"bigdecimal-2-48":127655512123456.761009E-123,
-				"string-48":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int48":4561,
-				"ints48":0,
-				"false48":false,
-				"nil48":false,
-				"obj48":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-49":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 49":"\u5656",
-	"bigdecimal49":7817265.00000111,
-	"bigdecimal-2-49":127655512123456.761009E-123,
-	"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int49":4561,
-	"ints49":0,
-	"false49":false,
-	"nil49":false,
-	"n49":      null                ,
-	"obj49":
-		{
-			"special-49":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 49":"\u5656",
-	"bigdecimal49":7817265.00000111,
-			"bigdecimal-2-49":127655512123456.761009E-123,
-			"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int49":4561,
-			"ints49":0,
-			"false49":false,
-			"nil49":false,
-			"obj49":      null                ,
-			"obj49":
-				[    true    ,
-				{
-				"special-49":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 49":"\u5656",
-				"bigdecimal49":7817265.00000111,
-				"bigdecimal-2-49":127655512123456.761009E-123,
-				"string-49":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int49":4561,
-				"ints49":0,
-				"false49":false,
-				"nil49":false,
-				"obj49":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-50":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 50":"\u5656",
-	"bigdecimal50":7817265.00000111,
-	"bigdecimal-2-50":127655512123456.761009E-123,
-	"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int50":4561,
-	"ints50":0,
-	"false50":false,
-	"nil50":false,
-	"n50":      null                ,
-	"obj50":
-		{
-			"special-50":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 50":"\u5656",
-	"bigdecimal50":7817265.00000111,
-			"bigdecimal-2-50":127655512123456.761009E-123,
-			"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int50":4561,
-			"ints50":0,
-			"false50":false,
-			"nil50":false,
-			"obj50":      null                ,
-			"obj50":
-				[    true    ,
-				{
-				"special-50":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 50":"\u5656",
-				"bigdecimal50":7817265.00000111,
-				"bigdecimal-2-50":127655512123456.761009E-123,
-				"string-50":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int50":4561,
-				"ints50":0,
-				"false50":false,
-				"nil50":false,
-				"obj50":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-51":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 51":"\u5656",
-	"bigdecimal51":7817265.00000111,
-	"bigdecimal-2-51":127655512123456.761009E-123,
-	"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int51":4561,
-	"ints51":0,
-	"false51":false,
-	"nil51":false,
-	"n51":      null                ,
-	"obj51":
-		{
-			"special-51":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 51":"\u5656",
-	"bigdecimal51":7817265.00000111,
-			"bigdecimal-2-51":127655512123456.761009E-123,
-			"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int51":4561,
-			"ints51":0,
-			"false51":false,
-			"nil51":false,
-			"obj51":      null                ,
-			"obj51":
-				[    true    ,
-				{
-				"special-51":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 51":"\u5656",
-				"bigdecimal51":7817265.00000111,
-				"bigdecimal-2-51":127655512123456.761009E-123,
-				"string-51":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int51":4561,
-				"ints51":0,
-				"false51":false,
-				"nil51":false,
-				"obj51":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-52":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 52":"\u5656",
-	"bigdecimal52":7817265.00000111,
-	"bigdecimal-2-52":127655512123456.761009E-123,
-	"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int52":4561,
-	"ints52":0,
-	"false52":false,
-	"nil52":false,
-	"n52":      null                ,
-	"obj52":
-		{
-			"special-52":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 52":"\u5656",
-	"bigdecimal52":7817265.00000111,
-			"bigdecimal-2-52":127655512123456.761009E-123,
-			"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int52":4561,
-			"ints52":0,
-			"false52":false,
-			"nil52":false,
-			"obj52":      null                ,
-			"obj52":
-				[    true    ,
-				{
-				"special-52":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 52":"\u5656",
-				"bigdecimal52":7817265.00000111,
-				"bigdecimal-2-52":127655512123456.761009E-123,
-				"string-52":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int52":4561,
-				"ints52":0,
-				"false52":false,
-				"nil52":false,
-				"obj52":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-53":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 53":"\u5656",
-	"bigdecimal53":7817265.00000111,
-	"bigdecimal-2-53":127655512123456.761009E-123,
-	"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int53":4561,
-	"ints53":0,
-	"false53":false,
-	"nil53":false,
-	"n53":      null                ,
-	"obj53":
-		{
-			"special-53":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 53":"\u5656",
-	"bigdecimal53":7817265.00000111,
-			"bigdecimal-2-53":127655512123456.761009E-123,
-			"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int53":4561,
-			"ints53":0,
-			"false53":false,
-			"nil53":false,
-			"obj53":      null                ,
-			"obj53":
-				[    true    ,
-				{
-				"special-53":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 53":"\u5656",
-				"bigdecimal53":7817265.00000111,
-				"bigdecimal-2-53":127655512123456.761009E-123,
-				"string-53":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int53":4561,
-				"ints53":0,
-				"false53":false,
-				"nil53":false,
-				"obj53":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-54":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 54":"\u5656",
-	"bigdecimal54":7817265.00000111,
-	"bigdecimal-2-54":127655512123456.761009E-123,
-	"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int54":4561,
-	"ints54":0,
-	"false54":false,
-	"nil54":false,
-	"n54":      null                ,
-	"obj54":
-		{
-			"special-54":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 54":"\u5656",
-	"bigdecimal54":7817265.00000111,
-			"bigdecimal-2-54":127655512123456.761009E-123,
-			"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int54":4561,
-			"ints54":0,
-			"false54":false,
-			"nil54":false,
-			"obj54":      null                ,
-			"obj54":
-				[    true    ,
-				{
-				"special-54":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 54":"\u5656",
-				"bigdecimal54":7817265.00000111,
-				"bigdecimal-2-54":127655512123456.761009E-123,
-				"string-54":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int54":4561,
-				"ints54":0,
-				"false54":false,
-				"nil54":false,
-				"obj54":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-55":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 55":"\u5656",
-	"bigdecimal55":7817265.00000111,
-	"bigdecimal-2-55":127655512123456.761009E-123,
-	"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int55":4561,
-	"ints55":0,
-	"false55":false,
-	"nil55":false,
-	"n55":      null                ,
-	"obj55":
-		{
-			"special-55":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 55":"\u5656",
-	"bigdecimal55":7817265.00000111,
-			"bigdecimal-2-55":127655512123456.761009E-123,
-			"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int55":4561,
-			"ints55":0,
-			"false55":false,
-			"nil55":false,
-			"obj55":      null                ,
-			"obj55":
-				[    true    ,
-				{
-				"special-55":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 55":"\u5656",
-				"bigdecimal55":7817265.00000111,
-				"bigdecimal-2-55":127655512123456.761009E-123,
-				"string-55":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int55":4561,
-				"ints55":0,
-				"false55":false,
-				"nil55":false,
-				"obj55":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-56":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 56":"\u5656",
-	"bigdecimal56":7817265.00000111,
-	"bigdecimal-2-56":127655512123456.761009E-123,
-	"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int56":4561,
-	"ints56":0,
-	"false56":false,
-	"nil56":false,
-	"n56":      null                ,
-	"obj56":
-		{
-			"special-56":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 56":"\u5656",
-	"bigdecimal56":7817265.00000111,
-			"bigdecimal-2-56":127655512123456.761009E-123,
-			"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int56":4561,
-			"ints56":0,
-			"false56":false,
-			"nil56":false,
-			"obj56":      null                ,
-			"obj56":
-				[    true    ,
-				{
-				"special-56":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 56":"\u5656",
-				"bigdecimal56":7817265.00000111,
-				"bigdecimal-2-56":127655512123456.761009E-123,
-				"string-56":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int56":4561,
-				"ints56":0,
-				"false56":false,
-				"nil56":false,
-				"obj56":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-57":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 57":"\u5656",
-	"bigdecimal57":7817265.00000111,
-	"bigdecimal-2-57":127655512123456.761009E-123,
-	"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int57":4561,
-	"ints57":0,
-	"false57":false,
-	"nil57":false,
-	"n57":      null                ,
-	"obj57":
-		{
-			"special-57":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 57":"\u5656",
-	"bigdecimal57":7817265.00000111,
-			"bigdecimal-2-57":127655512123456.761009E-123,
-			"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int57":4561,
-			"ints57":0,
-			"false57":false,
-			"nil57":false,
-			"obj57":      null                ,
-			"obj57":
-				[    true    ,
-				{
-				"special-57":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 57":"\u5656",
-				"bigdecimal57":7817265.00000111,
-				"bigdecimal-2-57":127655512123456.761009E-123,
-				"string-57":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int57":4561,
-				"ints57":0,
-				"false57":false,
-				"nil57":false,
-				"obj57":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-58":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 58":"\u5656",
-	"bigdecimal58":7817265.00000111,
-	"bigdecimal-2-58":127655512123456.761009E-123,
-	"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int58":4561,
-	"ints58":0,
-	"false58":false,
-	"nil58":false,
-	"n58":      null                ,
-	"obj58":
-		{
-			"special-58":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 58":"\u5656",
-	"bigdecimal58":7817265.00000111,
-			"bigdecimal-2-58":127655512123456.761009E-123,
-			"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int58":4561,
-			"ints58":0,
-			"false58":false,
-			"nil58":false,
-			"obj58":      null                ,
-			"obj58":
-				[    true    ,
-				{
-				"special-58":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 58":"\u5656",
-				"bigdecimal58":7817265.00000111,
-				"bigdecimal-2-58":127655512123456.761009E-123,
-				"string-58":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int58":4561,
-				"ints58":0,
-				"false58":false,
-				"nil58":false,
-				"obj58":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-59":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 59":"\u5656",
-	"bigdecimal59":7817265.00000111,
-	"bigdecimal-2-59":127655512123456.761009E-123,
-	"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int59":4561,
-	"ints59":0,
-	"false59":false,
-	"nil59":false,
-	"n59":      null                ,
-	"obj59":
-		{
-			"special-59":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 59":"\u5656",
-	"bigdecimal59":7817265.00000111,
-			"bigdecimal-2-59":127655512123456.761009E-123,
-			"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int59":4561,
-			"ints59":0,
-			"false59":false,
-			"nil59":false,
-			"obj59":      null                ,
-			"obj59":
-				[    true    ,
-				{
-				"special-59":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 59":"\u5656",
-				"bigdecimal59":7817265.00000111,
-				"bigdecimal-2-59":127655512123456.761009E-123,
-				"string-59":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int59":4561,
-				"ints59":0,
-				"false59":false,
-				"nil59":false,
-				"obj59":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-60":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 60":"\u5656",
-	"bigdecimal60":7817265.00000111,
-	"bigdecimal-2-60":127655512123456.761009E-123,
-	"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int60":4561,
-	"ints60":0,
-	"false60":false,
-	"nil60":false,
-	"n60":      null                ,
-	"obj60":
-		{
-			"special-60":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 60":"\u5656",
-	"bigdecimal60":7817265.00000111,
-			"bigdecimal-2-60":127655512123456.761009E-123,
-			"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int60":4561,
-			"ints60":0,
-			"false60":false,
-			"nil60":false,
-			"obj60":      null                ,
-			"obj60":
-				[    true    ,
-				{
-				"special-60":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 60":"\u5656",
-				"bigdecimal60":7817265.00000111,
-				"bigdecimal-2-60":127655512123456.761009E-123,
-				"string-60":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int60":4561,
-				"ints60":0,
-				"false60":false,
-				"nil60":false,
-				"obj60":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-61":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 61":"\u5656",
-	"bigdecimal61":7817265.00000111,
-	"bigdecimal-2-61":127655512123456.761009E-123,
-	"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int61":4561,
-	"ints61":0,
-	"false61":false,
-	"nil61":false,
-	"n61":      null                ,
-	"obj61":
-		{
-			"special-61":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 61":"\u5656",
-	"bigdecimal61":7817265.00000111,
-			"bigdecimal-2-61":127655512123456.761009E-123,
-			"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int61":4561,
-			"ints61":0,
-			"false61":false,
-			"nil61":false,
-			"obj61":      null                ,
-			"obj61":
-				[    true    ,
-				{
-				"special-61":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 61":"\u5656",
-				"bigdecimal61":7817265.00000111,
-				"bigdecimal-2-61":127655512123456.761009E-123,
-				"string-61":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int61":4561,
-				"ints61":0,
-				"false61":false,
-				"nil61":false,
-				"obj61":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-62":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 62":"\u5656",
-	"bigdecimal62":7817265.00000111,
-	"bigdecimal-2-62":127655512123456.761009E-123,
-	"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int62":4561,
-	"ints62":0,
-	"false62":false,
-	"nil62":false,
-	"n62":      null                ,
-	"obj62":
-		{
-			"special-62":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 62":"\u5656",
-	"bigdecimal62":7817265.00000111,
-			"bigdecimal-2-62":127655512123456.761009E-123,
-			"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int62":4561,
-			"ints62":0,
-			"false62":false,
-			"nil62":false,
-			"obj62":      null                ,
-			"obj62":
-				[    true    ,
-				{
-				"special-62":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 62":"\u5656",
-				"bigdecimal62":7817265.00000111,
-				"bigdecimal-2-62":127655512123456.761009E-123,
-				"string-62":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int62":4561,
-				"ints62":0,
-				"false62":false,
-				"nil62":false,
-				"obj62":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-63":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 63":"\u5656",
-	"bigdecimal63":7817265.00000111,
-	"bigdecimal-2-63":127655512123456.761009E-123,
-	"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int63":4561,
-	"ints63":0,
-	"false63":false,
-	"nil63":false,
-	"n63":      null                ,
-	"obj63":
-		{
-			"special-63":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 63":"\u5656",
-	"bigdecimal63":7817265.00000111,
-			"bigdecimal-2-63":127655512123456.761009E-123,
-			"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int63":4561,
-			"ints63":0,
-			"false63":false,
-			"nil63":false,
-			"obj63":      null                ,
-			"obj63":
-				[    true    ,
-				{
-				"special-63":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 63":"\u5656",
-				"bigdecimal63":7817265.00000111,
-				"bigdecimal-2-63":127655512123456.761009E-123,
-				"string-63":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int63":4561,
-				"ints63":0,
-				"false63":false,
-				"nil63":false,
-				"obj63":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-64":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 64":"\u5656",
-	"bigdecimal64":7817265.00000111,
-	"bigdecimal-2-64":127655512123456.761009E-123,
-	"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int64":4561,
-	"ints64":0,
-	"false64":false,
-	"nil64":false,
-	"n64":      null                ,
-	"obj64":
-		{
-			"special-64":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 64":"\u5656",
-	"bigdecimal64":7817265.00000111,
-			"bigdecimal-2-64":127655512123456.761009E-123,
-			"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int64":4561,
-			"ints64":0,
-			"false64":false,
-			"nil64":false,
-			"obj64":      null                ,
-			"obj64":
-				[    true    ,
-				{
-				"special-64":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 64":"\u5656",
-				"bigdecimal64":7817265.00000111,
-				"bigdecimal-2-64":127655512123456.761009E-123,
-				"string-64":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int64":4561,
-				"ints64":0,
-				"false64":false,
-				"nil64":false,
-				"obj64":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-65":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 65":"\u5656",
-	"bigdecimal65":7817265.00000111,
-	"bigdecimal-2-65":127655512123456.761009E-123,
-	"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int65":4561,
-	"ints65":0,
-	"false65":false,
-	"nil65":false,
-	"n65":      null                ,
-	"obj65":
-		{
-			"special-65":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 65":"\u5656",
-	"bigdecimal65":7817265.00000111,
-			"bigdecimal-2-65":127655512123456.761009E-123,
-			"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int65":4561,
-			"ints65":0,
-			"false65":false,
-			"nil65":false,
-			"obj65":      null                ,
-			"obj65":
-				[    true    ,
-				{
-				"special-65":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 65":"\u5656",
-				"bigdecimal65":7817265.00000111,
-				"bigdecimal-2-65":127655512123456.761009E-123,
-				"string-65":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int65":4561,
-				"ints65":0,
-				"false65":false,
-				"nil65":false,
-				"obj65":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-66":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 66":"\u5656",
-	"bigdecimal66":7817265.00000111,
-	"bigdecimal-2-66":127655512123456.761009E-123,
-	"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int66":4561,
-	"ints66":0,
-	"false66":false,
-	"nil66":false,
-	"n66":      null                ,
-	"obj66":
-		{
-			"special-66":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 66":"\u5656",
-	"bigdecimal66":7817265.00000111,
-			"bigdecimal-2-66":127655512123456.761009E-123,
-			"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int66":4561,
-			"ints66":0,
-			"false66":false,
-			"nil66":false,
-			"obj66":      null                ,
-			"obj66":
-				[    true    ,
-				{
-				"special-66":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 66":"\u5656",
-				"bigdecimal66":7817265.00000111,
-				"bigdecimal-2-66":127655512123456.761009E-123,
-				"string-66":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int66":4561,
-				"ints66":0,
-				"false66":false,
-				"nil66":false,
-				"obj66":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-67":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 67":"\u5656",
-	"bigdecimal67":7817265.00000111,
-	"bigdecimal-2-67":127655512123456.761009E-123,
-	"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int67":4561,
-	"ints67":0,
-	"false67":false,
-	"nil67":false,
-	"n67":      null                ,
-	"obj67":
-		{
-			"special-67":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 67":"\u5656",
-	"bigdecimal67":7817265.00000111,
-			"bigdecimal-2-67":127655512123456.761009E-123,
-			"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int67":4561,
-			"ints67":0,
-			"false67":false,
-			"nil67":false,
-			"obj67":      null                ,
-			"obj67":
-				[    true    ,
-				{
-				"special-67":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 67":"\u5656",
-				"bigdecimal67":7817265.00000111,
-				"bigdecimal-2-67":127655512123456.761009E-123,
-				"string-67":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int67":4561,
-				"ints67":0,
-				"false67":false,
-				"nil67":false,
-				"obj67":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-68":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 68":"\u5656",
-	"bigdecimal68":7817265.00000111,
-	"bigdecimal-2-68":127655512123456.761009E-123,
-	"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int68":4561,
-	"ints68":0,
-	"false68":false,
-	"nil68":false,
-	"n68":      null                ,
-	"obj68":
-		{
-			"special-68":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 68":"\u5656",
-	"bigdecimal68":7817265.00000111,
-			"bigdecimal-2-68":127655512123456.761009E-123,
-			"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int68":4561,
-			"ints68":0,
-			"false68":false,
-			"nil68":false,
-			"obj68":      null                ,
-			"obj68":
-				[    true    ,
-				{
-				"special-68":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 68":"\u5656",
-				"bigdecimal68":7817265.00000111,
-				"bigdecimal-2-68":127655512123456.761009E-123,
-				"string-68":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int68":4561,
-				"ints68":0,
-				"false68":false,
-				"nil68":false,
-				"obj68":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-69":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 69":"\u5656",
-	"bigdecimal69":7817265.00000111,
-	"bigdecimal-2-69":127655512123456.761009E-123,
-	"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int69":4561,
-	"ints69":0,
-	"false69":false,
-	"nil69":false,
-	"n69":      null                ,
-	"obj69":
-		{
-			"special-69":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 69":"\u5656",
-	"bigdecimal69":7817265.00000111,
-			"bigdecimal-2-69":127655512123456.761009E-123,
-			"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int69":4561,
-			"ints69":0,
-			"false69":false,
-			"nil69":false,
-			"obj69":      null                ,
-			"obj69":
-				[    true    ,
-				{
-				"special-69":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 69":"\u5656",
-				"bigdecimal69":7817265.00000111,
-				"bigdecimal-2-69":127655512123456.761009E-123,
-				"string-69":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int69":4561,
-				"ints69":0,
-				"false69":false,
-				"nil69":false,
-				"obj69":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-70":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 70":"\u5656",
-	"bigdecimal70":7817265.00000111,
-	"bigdecimal-2-70":127655512123456.761009E-123,
-	"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int70":4561,
-	"ints70":0,
-	"false70":false,
-	"nil70":false,
-	"n70":      null                ,
-	"obj70":
-		{
-			"special-70":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 70":"\u5656",
-	"bigdecimal70":7817265.00000111,
-			"bigdecimal-2-70":127655512123456.761009E-123,
-			"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int70":4561,
-			"ints70":0,
-			"false70":false,
-			"nil70":false,
-			"obj70":      null                ,
-			"obj70":
-				[    true    ,
-				{
-				"special-70":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 70":"\u5656",
-				"bigdecimal70":7817265.00000111,
-				"bigdecimal-2-70":127655512123456.761009E-123,
-				"string-70":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int70":4561,
-				"ints70":0,
-				"false70":false,
-				"nil70":false,
-				"obj70":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-71":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 71":"\u5656",
-	"bigdecimal71":7817265.00000111,
-	"bigdecimal-2-71":127655512123456.761009E-123,
-	"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int71":4561,
-	"ints71":0,
-	"false71":false,
-	"nil71":false,
-	"n71":      null                ,
-	"obj71":
-		{
-			"special-71":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 71":"\u5656",
-	"bigdecimal71":7817265.00000111,
-			"bigdecimal-2-71":127655512123456.761009E-123,
-			"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int71":4561,
-			"ints71":0,
-			"false71":false,
-			"nil71":false,
-			"obj71":      null                ,
-			"obj71":
-				[    true    ,
-				{
-				"special-71":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 71":"\u5656",
-				"bigdecimal71":7817265.00000111,
-				"bigdecimal-2-71":127655512123456.761009E-123,
-				"string-71":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int71":4561,
-				"ints71":0,
-				"false71":false,
-				"nil71":false,
-				"obj71":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-72":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 72":"\u5656",
-	"bigdecimal72":7817265.00000111,
-	"bigdecimal-2-72":127655512123456.761009E-123,
-	"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int72":4561,
-	"ints72":0,
-	"false72":false,
-	"nil72":false,
-	"n72":      null                ,
-	"obj72":
-		{
-			"special-72":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 72":"\u5656",
-	"bigdecimal72":7817265.00000111,
-			"bigdecimal-2-72":127655512123456.761009E-123,
-			"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int72":4561,
-			"ints72":0,
-			"false72":false,
-			"nil72":false,
-			"obj72":      null                ,
-			"obj72":
-				[    true    ,
-				{
-				"special-72":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 72":"\u5656",
-				"bigdecimal72":7817265.00000111,
-				"bigdecimal-2-72":127655512123456.761009E-123,
-				"string-72":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int72":4561,
-				"ints72":0,
-				"false72":false,
-				"nil72":false,
-				"obj72":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-73":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 73":"\u5656",
-	"bigdecimal73":7817265.00000111,
-	"bigdecimal-2-73":127655512123456.761009E-123,
-	"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int73":4561,
-	"ints73":0,
-	"false73":false,
-	"nil73":false,
-	"n73":      null                ,
-	"obj73":
-		{
-			"special-73":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 73":"\u5656",
-	"bigdecimal73":7817265.00000111,
-			"bigdecimal-2-73":127655512123456.761009E-123,
-			"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int73":4561,
-			"ints73":0,
-			"false73":false,
-			"nil73":false,
-			"obj73":      null                ,
-			"obj73":
-				[    true    ,
-				{
-				"special-73":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 73":"\u5656",
-				"bigdecimal73":7817265.00000111,
-				"bigdecimal-2-73":127655512123456.761009E-123,
-				"string-73":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int73":4561,
-				"ints73":0,
-				"false73":false,
-				"nil73":false,
-				"obj73":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-74":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 74":"\u5656",
-	"bigdecimal74":7817265.00000111,
-	"bigdecimal-2-74":127655512123456.761009E-123,
-	"string-74":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int74":4561,
-	"ints74":0,
-	"false74":false,
-	"nil74":false,
-	"n74":      null                ,
-	"obj74":
-		{
-			"special-74":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 74":"\u5656",
-	"bigdecimal74":7817265.00000111,
-			"bigdecimal-2-74":127655512123456.761009E-123,
-			"string-74":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int74":4561,
-			"ints74":0,
-			"false74":false,
-			"nil74":false,
-			"obj74":      null                ,
-			"obj74":
-				[    true    ,
-				{
-				"special-74":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 74":"\u5656",
-				"bigdecimal74":7817265.00000111,
-				"bigdecimal-2-74":127655512123456.761009E-123,
-				"string-74":"lorem ipsum, Ä

<TRUNCATED>

[10/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..9ddfd58
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java
@@ -0,0 +1,102 @@
+/*
+ * 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 java.math.BigDecimal;
+import java.math.BigInteger;
+
+import javax.json.JsonNumber;
+
+final class JsonDoubleImpl implements JsonNumber {
+    private final double value;
+
+    JsonDoubleImpl(final double value) {
+        
+        if(Double.isInfinite(value) || Double.isNaN(value)) {
+            throw new NumberFormatException("double value must to be NaN or Infinite");
+        }
+        
+        this.value = value;
+    }
+
+    @Override
+    public boolean isIntegral() {
+        return false;
+    }
+
+    @Override
+    public int intValue() {
+        return (int) value;
+    }
+
+    @Override
+    public int intValueExact() {
+        return intValue();
+    }
+
+    @Override
+    public long longValue() {
+        return (long) value;
+    }
+
+    @Override
+    public long longValueExact() {
+        return (long) value;
+    }
+
+    @Override
+    public BigInteger bigIntegerValue() {
+        return new BigDecimal(toString()).toBigInteger();
+    }
+
+    @Override
+    public BigInteger bigIntegerValueExact() {
+        return new BigDecimal(toString()).toBigIntegerExact();
+    }
+
+    @Override
+    public double doubleValue() {
+        return value;
+    }
+
+    @Override
+    public BigDecimal bigDecimalValue() {
+        return new BigDecimal(toString());
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.NUMBER;
+    }
+
+    @Override
+    public String toString() {
+        return Double.toString(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return Double.valueOf(value).hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).doubleValue() == value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
new file mode 100644
index 0000000..bdc19fb
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorFactoryImpl.java
@@ -0,0 +1,121 @@
+/*
+ * 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 java.io.OutputStream;
+import java.io.Serializable;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+
+public class JsonGeneratorFactoryImpl implements JsonGeneratorFactory, Serializable {    
+    public static final String BUFFER_LENGTH = "org.apache.johnzon.default-char-buffer-generator";
+    public static final int DEFAULT_BUFFER_LENGTH = Integer.getInteger(BUFFER_LENGTH, 1024); //TODO check default string length/buffer size
+    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
+    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
+        
+        JsonGenerator.PRETTY_PRINTING, BUFFER_LENGTH, JsonParserFactoryImpl.BUFFER_STRATEGY 
+        
+    };
+    //key caching currently disabled
+    private final ConcurrentMap<String, String> cache = null;//new ConcurrentHashMap<String, String>();
+    private final boolean pretty;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
+
+    public JsonGeneratorFactoryImpl(final Map<String, ?> config) {
+        
+          if(config != null) {
+          
+              for (String configKey : SUPPORTED_CONFIG_KEYS) {
+                  if(config.containsKey(configKey)) {
+                      internalConfig.put(configKey, config.get(configKey));
+                  }
+              }
+          } 
+
+          if(internalConfig.containsKey(JsonGenerator.PRETTY_PRINTING)) {
+              this.pretty = Boolean.TRUE.equals(internalConfig.get(JsonGenerator.PRETTY_PRINTING)) || "true".equals(internalConfig.get(JsonGenerator.PRETTY_PRINTING));
+          } else {
+              this.pretty = false;
+          }
+          
+          final int bufferSize = getInt(BUFFER_LENGTH);
+          if (bufferSize <= 0) {
+              throw new IllegalArgumentException("buffer length must be greater than zero");
+          }
+
+          this.bufferProvider = getBufferProvider().newCharProvider(bufferSize);
+    }
+    
+    private BufferStrategy getBufferProvider() {
+        final Object name = internalConfig.get(JsonParserFactoryImpl.BUFFER_STRATEGY);
+        if (name != null) {
+            return BufferStrategy.valueOf(name.toString().toUpperCase(Locale.ENGLISH));
+        }
+        return BufferStrategy.QUEUE;
+    }
+
+    private int getInt(final String key) {
+        final Object maxStringSize = internalConfig.get(key);
+        if (maxStringSize == null) {
+            return DEFAULT_BUFFER_LENGTH;
+        } else if (Number.class.isInstance(maxStringSize)) {
+            return Number.class.cast(maxStringSize).intValue();
+        }
+        return Integer.parseInt(maxStringSize.toString());
+    }
+
+    @Override
+    public JsonGenerator createGenerator(final Writer writer) {
+        if (pretty) {
+            return new JsonPrettyGeneratorImpl(writer, bufferProvider, cache);
+        }
+        return new JsonGeneratorImpl(writer, bufferProvider, cache);
+    }
+
+   
+
+    @Override
+    public JsonGenerator createGenerator(final OutputStream out) {
+        if (pretty) {
+            return new JsonPrettyGeneratorImpl(out, bufferProvider, cache);
+        }
+        return new JsonGeneratorImpl(out, bufferProvider, cache);
+    }
+
+    @Override
+    public JsonGenerator createGenerator(final OutputStream out, final Charset charset) {
+        if (pretty) {
+            return new JsonPrettyGeneratorImpl(out,charset, bufferProvider, cache);
+        }
+        return new JsonGeneratorImpl(out,charset, bufferProvider, cache);
+    }
+
+    @Override
+    public Map<String, ?> getConfigInUse() {
+        return Collections.unmodifiableMap(internalConfig);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java
new file mode 100644
index 0000000..6b539ad
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonGeneratorImpl.java
@@ -0,0 +1,870 @@
+/*
+ * 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 java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.Writer;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.json.JsonArray;
+import javax.json.JsonException;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonStructure;
+import javax.json.JsonValue;
+import javax.json.stream.JsonGenerationException;
+import javax.json.stream.JsonGenerator;
+
+class JsonGeneratorImpl implements JsonGenerator, JsonChars, Serializable {
+    private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+
+    private final Writer writer;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
+    private final char[] buffer;
+    private int bufferPos = 0;
+    //private final ConcurrentMap<String, String> cache;
+    protected boolean needComma = false;
+
+    private StructureElement currentStructureElement = null;
+    private boolean valid = false;
+    protected int depth = 0;
+
+    //minimal stack implementation
+    private static final class StructureElement {
+        final StructureElement previous;
+        final boolean isArray;
+
+        StructureElement(final StructureElement previous, final boolean isArray) {
+            super();
+            this.previous = previous;
+            this.isArray = isArray;
+        }
+    }
+
+    JsonGeneratorImpl(final Writer writer, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final ConcurrentMap<String, String> cache) {
+        this.writer = writer;
+        //this.cache = cache;
+        this.buffer = bufferProvider.newBuffer();
+        this.bufferProvider = bufferProvider;
+    }
+
+    JsonGeneratorImpl(final OutputStream out, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final ConcurrentMap<String, String> cache) {
+        this(new OutputStreamWriter(out, UTF8_CHARSET), bufferProvider, cache);
+    }
+
+    JsonGeneratorImpl(final OutputStream out, final Charset encoding, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final ConcurrentMap<String, String> cache) {
+        this(new OutputStreamWriter(out, encoding), bufferProvider, cache);
+    }
+
+    protected void addCommaIfNeeded() {
+        if (needComma) {
+            justWrite(COMMA_CHAR);
+            needComma = false;
+        }
+
+    }
+
+    //caching currently disabled
+    //two problems:
+    // 1) not easy to get the escaped value efficiently wen its streamed and the buffer is full and needs to be flushed
+    // 2) we have to use a kind of bounded threadsafe map to let the cache not grow indefinitely
+    private void writeCachedOrEscape(final String name) {
+      /*  String k = cache.get(name);
+        
+        if (k == null) {
+                
+                justWrite(QUOTE_CHAR);
+                int start = bufferPos;
+                writeEscaped0(name);
+                int end = bufferPos;
+                String escaped= get from buffer
+                ---
+                //FIXME if buffer is flushed this will not work here
+                cache.putIfAbsent(name, escaped);
+                justWrite(QUOTE_CHAR);
+                justWrite(KEY_SEPARATOR);
+        }else*/
+        {
+            justWrite(QUOTE_CHAR);
+            writeEscaped0(name);
+            justWrite(QUOTE_CHAR);
+            justWrite(KEY_SEPARATOR);
+        }
+
+    }
+
+    @Override
+    public JsonGenerator writeStartObject() {
+
+        if (currentStructureElement == null && valid) {
+            throw new JsonGenerationException("Method must not be called more than once in no context");
+        }
+
+        if (currentStructureElement != null && !currentStructureElement.isArray) {
+            throw new JsonGenerationException("Method must not be called within an object context");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, false);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
+            currentStructureElement = localStructureElement;
+        }
+
+        if (!valid) {
+            valid = true;
+        }
+
+        noCheckWrite(START_OBJECT_CHAR);
+        depth++;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeStartObject(final String name) {
+        if (currentStructureElement == null || currentStructureElement.isArray) {
+            throw new JsonGenerationException("Method must not be called within an array context");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, false);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, false);
+            currentStructureElement = localStructureElement;
+        }
+
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWrite(START_OBJECT_CHAR);
+        depth++;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeStartArray() {
+        if (currentStructureElement == null && valid) {
+            throw new JsonGenerationException("Method must not be called more than once in no context");
+        }
+
+        if (currentStructureElement != null && !currentStructureElement.isArray) {
+            throw new JsonGenerationException("Method must not be called within an object context");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, true);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
+            currentStructureElement = localStructureElement;
+        }
+
+        if (!valid) {
+            valid = true;
+        }
+
+        noCheckWrite(START_ARRAY_CHAR);
+        depth++;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeStartArray(final String name) {
+        if (currentStructureElement == null || currentStructureElement.isArray) {
+            throw new JsonGenerationException("Method must not be called within an array context");
+        }
+
+        //push upon the stack
+        if (currentStructureElement == null) {
+            currentStructureElement = new StructureElement(null, true);
+        } else {
+            final StructureElement localStructureElement = new StructureElement(currentStructureElement, true);
+            currentStructureElement = localStructureElement;
+        }
+
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWrite(START_ARRAY_CHAR);
+        depth++;
+        return this;
+    }
+
+    private void writeJsonValue(final String name, final JsonValue value) {
+        if (currentStructureElement != null) {
+            checkObject();
+        }
+        //TODO check null handling
+        switch (value.getValueType()) {
+            case ARRAY:
+                writeStartArray(name);
+                final JsonArray array = JsonArray.class.cast(value);
+                final Iterator<JsonValue> ait = array.iterator();
+                while (ait.hasNext()) {
+                    write(ait.next());
+                }
+                writeEnd();
+
+                break;
+            case OBJECT:
+                writeStartObject(name);
+                final JsonObject object = JsonObject.class.cast(value);
+                final Iterator<Map.Entry<String, JsonValue>> oit = object.entrySet().iterator();
+                while (oit.hasNext()) {
+                    final Map.Entry<String, JsonValue> keyval = oit.next();
+                    write(keyval.getKey(), keyval.getValue());
+                }
+                writeEnd();
+
+                break;
+            case STRING:
+                write(name, JsonString.class.cast(value).getString());
+                break;
+            case NUMBER:
+                //TODO optimize
+                final JsonNumber number = JsonNumber.class.cast(value);
+                if (number.isIntegral()) {
+                    write(name, number.longValueExact());
+                } else {
+                    write(name, number.bigDecimalValue());
+                }
+                break;
+            case TRUE:
+                write(name, true);
+                break;
+            case FALSE:
+                write(name, false);
+                break;
+            case NULL:
+                writeNull(name);
+                break;
+            default:
+                throw new JsonGenerationException("Unknown JsonValue type");
+        }
+    }
+
+    private void writeJsonValue(final JsonValue value) {
+        if (currentStructureElement != null) {
+            checkArray();
+        }
+        //TODO check null handling
+        switch (value.getValueType()) {
+            case ARRAY:
+                writeStartArray();
+                final JsonArray array = JsonArray.class.cast(value);
+                final Iterator<JsonValue> ait = array.iterator();
+                while (ait.hasNext()) {
+                    write(ait.next());
+                }
+                writeEnd();
+
+                break;
+            case OBJECT:
+                writeStartObject();
+                final JsonObject object = JsonObject.class.cast(value);
+                final Iterator<Map.Entry<String, JsonValue>> oit = object.entrySet().iterator();
+                while (oit.hasNext()) {
+                    final Map.Entry<String, JsonValue> keyval = oit.next();
+                    write(keyval.getKey(), keyval.getValue());
+                }
+                writeEnd();
+
+                break;
+            case STRING:
+                write(JsonString.class.cast(value).getString());
+                break;
+            case NUMBER:
+                //TODO optimize
+                final JsonNumber number = JsonNumber.class.cast(value);
+                if (number.isIntegral()) {
+                    write(number.longValueExact());
+                } else {
+                    write(number.bigDecimalValue());
+                }
+                break;
+            case TRUE:
+                write(true);
+                break;
+            case FALSE:
+                write(false);
+                break;
+            case NULL:
+                writeNull();
+                break;
+            default:
+                throw new JsonGenerationException("Unknown JsonValue type");
+        }
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final JsonValue value) {
+        writeJsonValue(name, value);
+        return this;
+    }
+
+
+    @Override
+    public JsonGenerator write(final String name, final String value) {
+        checkObject();
+
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+
+        addCommaIfNeeded();
+        justWrite(QUOTE_CHAR);
+        writeEscaped0(value);
+        justWrite(QUOTE_CHAR);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final BigInteger value) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWriteAndForceComma(String.valueOf(value));
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final BigDecimal value) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWriteAndForceComma(String.valueOf(value));
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final int value) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        addCommaIfNeeded();
+        writeInt0(value);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final long value) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        addCommaIfNeeded();
+        writeLong0(value);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final double value) {
+        checkObject();
+        checkDoubleRange(value);
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWriteAndForceComma(String.valueOf(value));
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final boolean value) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWriteAndForceComma(String.valueOf(value));
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeNull(final String name) {
+        checkObject();
+        addCommaIfNeeded();
+        writeCachedOrEscape(name);
+        noCheckWriteAndForceComma(NULL);
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeEnd() {
+        if (currentStructureElement == null) {
+            throw new JsonGenerationException("Method must not be called in no context");
+        }
+
+        writeEnd(currentStructureElement.isArray ? END_ARRAY_CHAR : END_OBJECT_CHAR);
+
+        //pop from stack
+        currentStructureElement = currentStructureElement.previous;
+        depth--;
+
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final JsonValue value) {
+        writeJsonValue(value);
+
+        if (JsonStructure.class.isInstance(value)) {
+            valid = true;
+        }
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final String value) {
+        checkArray();
+        addCommaIfNeeded();
+        justWrite(QUOTE_CHAR);
+        writeEscaped0(value);
+        justWrite(QUOTE_CHAR);
+        needComma = true;
+        return this;
+    }
+
+
+    @Override
+    public JsonGenerator write(final BigDecimal value) {
+        checkArray();
+        noCheckWrite(String.valueOf(value));
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final BigInteger value) {
+        checkArray();
+        noCheckWrite(String.valueOf(value));
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final int value) {
+        checkArray();
+        addCommaIfNeeded();
+        writeInt0(value);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final long value) {
+        checkArray();
+        addCommaIfNeeded();
+        writeLong0(value);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final double value) {
+        checkArray();
+        checkDoubleRange(value);
+        noCheckWrite(Double.toString(value));
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator write(final boolean value) {
+        checkArray();
+        noCheckWrite(Boolean.toString(value));
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public JsonGenerator writeNull() {
+        checkArray();
+        noCheckWriteAndForceComma(NULL);
+        needComma = true;
+        return this;
+    }
+
+    @Override
+    public void close() {
+
+        try {
+            if (currentStructureElement != null || !valid) {
+
+                throw new JsonGenerationException("Invalid json " + currentStructureElement + " " + valid);
+            }
+        } finally {
+
+            flushBuffer();
+
+            try {
+                writer.close();
+            } catch (final IOException e) {
+                throw new JsonException(e.getMessage(), e);
+            }
+
+            bufferProvider.release(buffer);
+        }
+    }
+
+    @Override
+    public void flush() {
+
+        flushBuffer();
+
+        try {
+            writer.flush();
+        } catch (final IOException e) {
+            throw new JsonException(e.getMessage(), e);
+        }
+    }
+
+    private JsonGenerator noCheckWriteAndForceComma(final String value) {
+        noCheckWrite(value);
+        needComma = true;
+        return this;
+    }
+
+    protected JsonGenerator writeEnd(final char value) {
+        justWrite(value);
+        needComma = true;
+        return this;
+    }
+
+    protected void noCheckWrite(final String value) {
+        addCommaIfNeeded();
+        justWrite(value);
+    }
+
+    protected void noCheckWrite(final char value) {
+        addCommaIfNeeded();
+        justWrite(value);
+    }
+
+    private void flushBuffer() {
+
+        if (bufferPos > 0) {
+
+            try {
+                writer.write(buffer, 0, bufferPos);
+                bufferPos = 0;
+            } catch (final IOException e) {
+                throw new JsonException(e.getMessage(), e);
+            }
+
+        }
+    }
+
+    private void writeEscaped0(final String value) {
+        int len = 0;
+        if (value == null || (len = value.length()) == 0) {
+            return;
+        }
+
+        for (int i = 0; i < value.length(); i++) {
+            char c = value.charAt(i);
+
+            while (c != ESCAPE_CHAR && c != QUOTE_CHAR && c >= SPACE) {
+                
+                //read fast
+                justWrite(c);
+
+                if (i >= len - 1) {
+                    return;
+                }
+
+                i++;
+                c = value.charAt(i);
+            }
+
+            switch (c) {
+                case QUOTE_CHAR:
+                case ESCAPE_CHAR:
+                    justWrite(ESCAPE_CHAR);
+                    justWrite(c);
+                    break;
+                default:
+                    if (c < SPACE) {
+                        switch (c) {
+                            case EOL:
+                                justWrite("\\n");
+                                break;
+                            case '\r':
+                                justWrite("\\r");
+                                break;
+                            case '\t':
+                                justWrite("\\t");
+                                break;
+                            case '\b':
+                                justWrite("\\b");
+                                break;
+                            case '\f':
+                                justWrite("\\f");
+                                break;
+                            default:
+                                justWrite(toUnicode(c));
+                        }
+                    } else if ((c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')) {
+                        justWrite(toUnicode(c));
+                    } else {
+                        justWrite(c);
+                    }
+            }
+        }
+
+    }
+
+    private static final String UNICODE_PREFIX = "\\u";
+    private static final String UNICODE_PREFIX_HELPER = "000";
+
+    private static String toUnicode(final char c) {
+
+        final String hex = UNICODE_PREFIX_HELPER + Integer.toHexString(c);
+        final String s = UNICODE_PREFIX + hex.substring(hex.length() - 4);
+
+        return s;
+    }
+
+    protected void justWrite(final char[] chars) {
+
+        if (bufferPos + chars.length >= buffer.length) {
+
+            int start = 0;
+            int len = buffer.length - bufferPos;
+
+            while (true) {
+                int end = start + len;
+                if (end > chars.length) {
+                    end = chars.length;
+                }
+
+                System.arraycopy(chars, start, buffer, bufferPos, end - start);
+
+                bufferPos += (end - start);
+                start += (len);
+
+                if (start >= chars.length) {
+                    return;
+                }
+
+                if (bufferPos >= buffer.length) {
+                    flushBuffer();
+                    len = buffer.length;
+                }
+
+            }
+
+        } else {
+            //fits completely into the buffer
+            System.arraycopy(chars, 0, buffer, bufferPos, chars.length);
+            bufferPos += chars.length;
+        }
+
+    }
+
+    protected void justWrite(final String value) {
+        final int valueLength = value.length();
+
+        if (bufferPos + valueLength >= buffer.length) {
+
+            int start = 0;
+            int len = buffer.length - bufferPos;
+
+            while (true) {
+                int end = start + len;
+                if (end > valueLength) {
+                    end = valueLength;
+                }
+
+                value.getChars(start, end, buffer, bufferPos);
+
+                bufferPos += (end - start);
+                start += (len);
+
+                if (start >= valueLength) {
+                    return;
+                }
+
+                if (bufferPos >= buffer.length) {
+                    flushBuffer();
+                    len = buffer.length;
+                }
+
+            }
+
+        } else {
+            //fits completely into the buffer
+            value.getChars(0, valueLength, buffer, bufferPos);
+            bufferPos += valueLength;
+        }
+
+    }
+
+    protected void justWrite(final char value) {
+
+        if (bufferPos >= buffer.length) {
+            flushBuffer();
+        }
+
+        buffer[bufferPos++] = value;
+
+    }
+    
+    private void checkObject() {
+        if (currentStructureElement == null || currentStructureElement.isArray) {
+            throw new JsonGenerationException("write(name, param) is only valid in objects");
+        }
+    }
+
+    private void checkArray() {
+        if (currentStructureElement == null || !currentStructureElement.isArray) {
+            throw new JsonGenerationException("write(param) is only valid in arrays");
+        }
+    }
+
+    private static void checkDoubleRange(final double value) {
+        if (Double.isInfinite(value) || Double.isNaN(value)) {
+            throw new NumberFormatException("double can't be infinite or NaN");
+        }
+    }
+    
+    
+    //unopitimized, see below
+    private void writeLong0(final long i) {
+
+        justWrite(String.valueOf(i));
+    }
+
+    //unopitimized, see below
+    private void writeInt0(final int i) {
+
+        justWrite(String.valueOf(i));
+    }
+    
+    //optimized number optimizations
+/*
+    private void writeLong0(final long i) {
+        if (i == Long.MIN_VALUE) {
+            justWrite("-9223372036854775808");
+            return;
+        }
+        final int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
+        final char[] buf = new char[size];
+        getChars(i, size, buf);
+        justWrite(buf);
+    }
+
+    private void writeInt0(final int i) {
+        if (i == Integer.MIN_VALUE) {
+            justWrite("-2147483648");
+            return;
+        }
+        final int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
+        final char[] buf = new char[size];
+        getChars(i, size, buf);
+        justWrite(buf);
+    }
+
+    private final static char[] DIGIT_TENS = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1',
+            '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4',
+            '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6',
+            '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9',
+            '9', '9', '9', '9', '9', '9', '9', };
+
+    private final static char[] DIGIT_ONES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
+            '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2',
+            '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
+            '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2',
+            '3', '4', '5', '6', '7', '8', '9', };
+
+    private final static char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
+            'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
+
+    // Requires positive x
+    private static int stringSize(final long x) {
+        long p = 10;
+        for (int i = 1; i < 19; i++) {
+            if (x < p) {
+                return i;
+            }
+            p = 10 * p;
+        }
+        return 19;
+    }
+
+    private static void getChars(long i, final int index, final char[] buf) {
+        long q;
+        int r;
+        int charPos = index;
+        char sign = 0;
+
+        if (i < 0) {
+            sign = '-';
+            i = -i;
+        }
+
+        // Get 2 digits/iteration using longs until quotient fits into an int
+        while (i > Integer.MAX_VALUE) {
+            q = i / 100;
+            // really: r = i - (q * 100);
+            r = (int) (i - ((q << 6) + (q << 5) + (q << 2)));
+            i = q;
+            buf[--charPos] = DIGIT_ONES[r];
+            buf[--charPos] = DIGIT_TENS[r];
+        }
+
+        // Get 2 digits/iteration using ints
+        int q2;
+        int i2 = (int) i;
+        while (i2 >= 65536) {
+            q2 = i2 / 100;
+            // really: r = i2 - (q * 100);
+            r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
+            i2 = q2;
+            buf[--charPos] = DIGIT_ONES[r];
+            buf[--charPos] = DIGIT_TENS[r];
+        }
+
+        // Fall thru to fast mode for smaller numbers
+        // assert(i2 <= 65536, i2);
+        for (;;) {
+            q2 = (i2 * 52429) >>> (16 + 3);
+            r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ...
+            buf[--charPos] = DIGITS[r];
+            i2 = q2;
+            if (i2 == 0) {
+                break;
+            }
+        }
+        if (sign != 0) {
+            buf[--charPos] = sign;
+        }
+    }
+*/
+   
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
new file mode 100644
index 0000000..b3709a8
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonInMemoryParser.java
@@ -0,0 +1,180 @@
+/*
+ * 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 java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+import javax.json.stream.JsonLocation;
+import javax.json.stream.JsonParser;
+
+// we don't use visitor pattern to ensure we work with other impl of JsonObject and JsonArray
+class JsonInMemoryParser implements JsonParser {
+    private final Iterator<Entry> iterator;
+
+    private Entry next = null;
+
+    JsonInMemoryParser(final JsonObject object) {
+        final List<Entry> events = new LinkedList<Entry>();
+        generateObjectEvents(events, object);
+        iterator = events.iterator();
+    }
+
+    JsonInMemoryParser(final JsonArray array) {
+        final List<Entry> events = new LinkedList<Entry>();
+        generateArrayEvents(events, array);
+        iterator = events.iterator();
+    }
+
+    private static void generateObjectEvents(final List<Entry> events, final JsonObject object) {
+        events.add(Entry.START_OBJECT_ENTRY);
+        for (final Map.Entry<String, JsonValue> entry : object.entrySet()) {
+            events.add(new Entry(Event.KEY_NAME, new JsonStringImpl(entry.getKey())));
+            final JsonValue value = entry.getValue();
+            addValueEvents(events, value);
+        }
+        events.add(Entry.END_OBJECT_ENTRY);
+    }
+
+    private static void generateArrayEvents(final List<Entry> events, final JsonArray array) {
+        events.add(Entry.START_ARRAY_ENTRY);
+        for (final JsonValue value : array) {
+            addValueEvents(events, value);
+        }
+        events.add(Entry.END_ARRAY_ENTRY);
+    }
+
+    private static void addValueEvents(final List<Entry> events, final JsonValue value) {
+        
+        switch(value.getValueType()) {
+            case ARRAY:
+                generateArrayEvents(events, JsonArray.class.cast(value));
+                break;
+            case OBJECT:
+                generateObjectEvents(events, JsonObject.class.cast(value));
+                break;
+            case NUMBER:
+                events.add(new Entry(Event.VALUE_NUMBER, value));
+                break;
+            case STRING:
+                events.add(new Entry(Event.VALUE_STRING, value));
+                break;
+            case FALSE:
+                events.add(Entry.VALUE_FALSE_ENTRY);
+                break;
+            case NULL:
+                events.add(Entry.VALUE_NULL_ENTRY);
+                break;
+            case TRUE:
+                events.add(Entry.VALUE_TRUE_ENTRY);
+                break;
+            default: throw new IllegalArgumentException(value + " not supported");
+                
+        }
+        
+    }
+
+    @Override
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
+
+    @Override
+    public Event next() {
+        next = iterator.next();
+        return next.event;
+    }
+
+    @Override
+    public String getString() {
+        if (next.event != Event.KEY_NAME && next.event != Event.VALUE_STRING) {
+            throw new IllegalStateException("String is for numbers and strings");
+        }
+        return JsonString.class.cast(next.value).getString();
+    }
+
+    @Override
+    public boolean isIntegralNumber() {
+        if (next.event != Event.VALUE_NUMBER) {
+            throw new IllegalStateException("isIntegralNumber is for numbers");
+        }
+        return JsonNumber.class.cast(next.value).isIntegral();
+    }
+
+    @Override
+    public int getInt() {
+        if (next.event != Event.VALUE_NUMBER) {
+            throw new IllegalStateException("getInt is for numbers");
+        }
+        return JsonNumber.class.cast(next.value).intValue();
+    }
+
+    @Override
+    public long getLong() {
+        if (next.event != Event.VALUE_NUMBER) {
+            throw new IllegalStateException("getLong is for numbers");
+        }
+        return JsonNumber.class.cast(next.value).longValue();
+    }
+
+    @Override
+    public BigDecimal getBigDecimal() {
+        if (next.event != Event.VALUE_NUMBER) {
+            throw new IllegalStateException("getBigDecimal is for numbers");
+        }
+        return JsonNumber.class.cast(next.value).bigDecimalValue();
+    }
+
+    @Override
+    public JsonLocation getLocation() { // no location for in memory parsers
+        return JsonLocationImpl.UNKNOW_LOCATION;
+    }
+
+    @Override
+    public void close() {
+        // no-op
+    }
+
+    private static class Entry {
+        
+        static final Entry VALUE_FALSE_ENTRY = new Entry(Event.VALUE_FALSE, null);
+        static final Entry VALUE_TRUE_ENTRY = new Entry(Event.VALUE_TRUE, null);
+        static final Entry VALUE_NULL_ENTRY = new Entry(Event.VALUE_NULL, null);
+        static final Entry START_OBJECT_ENTRY = new Entry(Event.START_OBJECT, null);
+        static final Entry END_OBJECT_ENTRY = new Entry(Event.END_OBJECT, null);
+        static final Entry START_ARRAY_ENTRY = new Entry(Event.START_ARRAY, null);
+        static final Entry END_ARRAY_ENTRY = new Entry(Event.END_ARRAY, null);
+        
+        final Event event;
+        final JsonValue value;
+
+        Entry(final Event event, final JsonValue value) {
+            this.event = event;
+            this.value = value;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLocationImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLocationImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLocationImpl.java
new file mode 100644
index 0000000..0c9e37b
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLocationImpl.java
@@ -0,0 +1,80 @@
+/*
+ * 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 java.io.Serializable;
+
+import javax.json.stream.JsonLocation;
+
+final class JsonLocationImpl implements JsonLocation, Serializable {
+    
+    public static final JsonLocation UNKNOW_LOCATION = new JsonLocationImpl(-1, -1, -1);
+    
+    private final long lineNumber;
+    private final long columnNumber;
+    private final long streamOffset;
+
+    JsonLocationImpl(final long lineNumber, final long columnNumber, final long streamOffset) {
+        this.lineNumber = lineNumber;
+        this.columnNumber = columnNumber;
+        this.streamOffset = streamOffset;
+    }
+
+    @Override
+    public long getLineNumber() {
+        return lineNumber;
+    }
+
+    @Override
+    public long getColumnNumber() {
+        return columnNumber;
+    }
+
+    @Override
+    public long getStreamOffset() {
+        return streamOffset;
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final JsonLocationImpl that = JsonLocationImpl.class.cast(o);
+        return columnNumber == that.columnNumber && lineNumber == that.lineNumber && streamOffset == that.streamOffset;
+
+    }
+
+    @Override
+    public int hashCode() {
+        int result = (int) (lineNumber ^ (lineNumber >>> 32));
+        result = 31 * result + (int) (columnNumber ^ (columnNumber >>> 32));
+        result = 31 * result + (int) (streamOffset ^ (streamOffset >>> 32));
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "[lineNumber=" + lineNumber + ", columnNumber=" + columnNumber + ", streamOffset=" + streamOffset + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..2f013f7
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.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 java.math.BigDecimal;
+import java.math.BigInteger;
+
+import javax.json.JsonNumber;
+
+final class JsonLongImpl implements JsonNumber {
+    private final long value;
+
+    JsonLongImpl(final long value) {
+        this.value = value;
+    }
+
+    @Override
+    public boolean isIntegral() {
+        return true;
+    }
+
+    @Override
+    public int intValue() {
+        return (int) value;
+    }
+
+    @Override
+    public int intValueExact() {
+        return intValue();
+    }
+
+    @Override
+    public long longValue() {
+        return value;
+    }
+
+    @Override
+    public long longValueExact() {
+        return value;
+    }
+
+    @Override
+    public BigInteger bigIntegerValue() {
+        return new BigInteger(toString());
+    }
+
+    @Override
+    public BigInteger bigIntegerValueExact() {
+        return bigIntegerValue();
+    }
+
+    @Override
+    public double doubleValue() {
+        return value;
+    }
+
+    @Override
+    public BigDecimal bigDecimalValue() {
+        return new BigDecimal(toString());
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.NUMBER;
+    }
+
+    @Override
+    public String toString() {
+        return Long.toString(value);
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) value;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).longValue() == value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..8b560ed
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonNumberImpl.java
@@ -0,0 +1,107 @@
+/*
+ * 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 java.math.BigDecimal;
+import java.math.BigInteger;
+
+import javax.json.JsonNumber;
+
+final class JsonNumberImpl implements JsonNumber {
+    private final BigDecimal value;
+    private Integer hashCode = null;
+
+    JsonNumberImpl(final BigDecimal decimal) {
+        if(decimal == null) {
+            throw new NullPointerException("decimal must not be null");
+        }
+        
+        this.value = decimal;
+    }
+
+    @Override
+    public boolean isIntegral() {
+        return value.scale() == 0;
+    }
+
+    @Override
+    public int intValue() {
+        return value.intValue();
+    }
+
+    @Override
+    public int intValueExact() {
+        return value.intValueExact();
+    }
+
+    @Override
+    public long longValue() {
+        return value.longValue();
+    }
+
+    @Override
+    public long longValueExact() {
+        return value.longValueExact();
+    }
+
+    @Override
+    public BigInteger bigIntegerValue() {
+        return value.toBigInteger();
+    }
+
+    @Override
+    public BigInteger bigIntegerValueExact() {
+        return value.toBigIntegerExact();
+    }
+
+    @Override
+    public double doubleValue() {
+        return value.doubleValue();
+    }
+
+    @Override
+    public BigDecimal bigDecimalValue() {
+        return value;
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.NUMBER;
+    }
+
+    @Override
+    public String toString() {
+        return value.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        Integer h=hashCode;
+        if (h == null) {
+            h = value.hashCode();
+            hashCode=h;
+        }
+        return h;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonNumber.class.isInstance(obj) && JsonNumber.class.cast(obj).bigDecimalValue().equals(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..ea15a17
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectBuilderImpl.java
@@ -0,0 +1,131 @@
+/*
+ * 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 java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonValue;
+
+class JsonObjectBuilderImpl implements JsonObjectBuilder, Serializable {
+    private Map<String, JsonValue> tmpMap;
+
+    @Override
+    public JsonObjectBuilder add(final String name, final JsonValue value) {
+        putValue(name, value);
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final String value) {
+        putValue(name, new JsonStringImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final BigInteger value) {
+        putValue(name, new JsonNumberImpl(new BigDecimal(value)));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final BigDecimal value) {
+        putValue(name, new JsonNumberImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final int value) {
+        putValue(name, new JsonLongImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final long value) {
+        putValue(name, new JsonLongImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final double value) {
+        putValue(name, new JsonDoubleImpl(value));
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final boolean value) {
+        putValue(name, value ? JsonValue.TRUE : JsonValue.FALSE);
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder addNull(final String name) {
+        putValue(name, JsonValue.NULL);
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final JsonObjectBuilder builder) {
+        putValue(name, builder.build());
+        return this;
+    }
+
+    @Override
+    public JsonObjectBuilder add(final String name, final JsonArrayBuilder builder) {
+        putValue(name, builder.build());
+        return this;
+    }
+    
+    private void putValue(String name, JsonValue value){
+        if(name == null || value == null) {
+            throw npe();
+        }
+        
+        if(tmpMap==null){
+            tmpMap=new LinkedHashMap<String, JsonValue>();
+        }
+        
+        tmpMap.put(name, value);
+    }
+    
+    private static NullPointerException npe() {
+        return new NullPointerException("name or value/builder must not be null");
+    }
+
+    @Override
+    public JsonObject build() {
+        
+        if(tmpMap==null) {
+            return new JsonObjectImpl(Collections.EMPTY_MAP);
+        } else {
+            Map<String, JsonValue> dump = (Collections.unmodifiableMap(tmpMap));
+            tmpMap=null;
+            return new JsonObjectImpl(dump);
+        }
+        
+        
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/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
new file mode 100644
index 0000000..863f173
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java
@@ -0,0 +1,167 @@
+/*
+ * 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 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;
+
+public final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject, Serializable {
+    private Integer hashCode = null;
+    private final Map<String, JsonValue> unmodifieableBackingMap;
+
+    private <T> T value(final String name, final Class<T> clazz) {
+        final Object v = unmodifieableBackingMap.get(name);
+        if (v != null) {
+            return clazz.cast(v);
+        }
+        throw new NullPointerException("no mapping for " + name);
+    }
+   
+    public JsonObjectImpl(Map<String, JsonValue> backingMap) {
+        super();
+        this.unmodifieableBackingMap = backingMap;
+    }
+
+
+    @Override
+    public JsonArray getJsonArray(final String name) {
+        return value(name, JsonArray.class);
+    }
+
+    @Override
+    public JsonObject getJsonObject(final String name) {
+        return value(name, JsonObject.class);
+    }
+
+    @Override
+    public JsonNumber getJsonNumber(final String name) {
+        return value(name, JsonNumber.class);
+    }
+
+    @Override
+    public JsonString getJsonString(final String name) {
+        return value(name, JsonString.class);
+    }
+
+    @Override
+    public String getString(final String name) {
+        final JsonString str = getJsonString(name);
+        return str != null ? str.getString() : null;
+    }
+
+    @Override
+    public String getString(final String name, final String defaultValue) {
+        try {
+            return getJsonString(name).getString();
+        } catch (final NullPointerException npe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public int getInt(final String name) {
+        return getJsonNumber(name).intValue();
+    }
+
+    @Override
+    public int getInt(final String name, final int defaultValue) {
+        try {
+            return getJsonNumber(name).intValue();
+        } catch (final NullPointerException npe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public boolean getBoolean(final String name) {
+        return value(name, JsonValue.class) == JsonValue.TRUE;
+    }
+
+    @Override
+    public boolean getBoolean(final String name, final boolean defaultValue) {
+        try {
+            return getBoolean(name);
+        } catch (final NullPointerException npe) {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public boolean isNull(final String name) {
+        return value(name, JsonValue.class) == JsonValue.NULL;
+    }
+
+    @Override
+    public ValueType getValueType() {
+        return ValueType.OBJECT;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder builder = new StringBuilder("{");
+        final Iterator<Map.Entry<String, JsonValue>> it = unmodifieableBackingMap.entrySet().iterator();
+        boolean hasNext = it.hasNext();
+        while (hasNext) {
+            final Map.Entry<String, JsonValue> entry = it.next();
+
+            builder.append('"').append(entry.getKey()).append("\":");
+
+            final JsonValue value = entry.getValue();
+            if (JsonString.class.isInstance(value)) {
+                builder.append(value.toString());
+            } else {
+                builder.append(value != JsonValue.NULL ? value.toString() : JsonChars.NULL);
+            }
+
+            hasNext = it.hasNext();
+            if (hasNext) {
+                builder.append(",");
+            }
+        }
+        return builder.append('}').toString();
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return JsonObjectImpl.class.isInstance(obj) && unmodifieableBackingMap.equals(JsonObjectImpl.class.cast(obj).unmodifieableBackingMap);
+    }
+
+
+    @Override
+    public int hashCode() {
+        if (hashCode == null) {
+            hashCode = unmodifieableBackingMap.hashCode();
+        }
+        return hashCode;
+    }
+
+    @Override
+    public Set<java.util.Map.Entry<String, JsonValue>> entrySet() {
+        return unmodifieableBackingMap.entrySet();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
new file mode 100644
index 0000000..85d09d2
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonParserFactoryImpl.java
@@ -0,0 +1,149 @@
+/*
+ * 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 java.io.InputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParserFactory;
+
+class JsonParserFactoryImpl implements JsonParserFactory, Serializable {
+    public static final String BUFFER_STRATEGY = "org.apache.johnzon.buffer-strategy";
+    public static final String MAX_STRING_LENGTH = "org.apache.johnzon.max-string-length";
+    public static final String BUFFER_LENGTH = "org.apache.johnzon.default-char-buffer";
+    public static final int DEFAULT_MAX_SIZE = Integer.getInteger(MAX_STRING_LENGTH, 8192*32); //TODO check default string length/buffer size
+
+    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
+    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
+        
+        BUFFER_STRATEGY, MAX_STRING_LENGTH, BUFFER_LENGTH
+        
+    };
+      
+    private final int maxSize;
+    private final BufferStrategy.BufferProvider<char[]> bufferProvider;
+    private final BufferStrategy.BufferProvider<char[]> valueBufferProvider;
+
+    JsonParserFactoryImpl(final Map<String, ?> config) {
+        
+
+        if(config != null) {
+            
+            for (String configKey : SUPPORTED_CONFIG_KEYS) {
+                if(config.containsKey(configKey)) {
+                    internalConfig.put(configKey, config.get(configKey));
+                }
+            }
+        } 
+        
+
+        final int bufferSize = getInt(BUFFER_LENGTH);
+        if (bufferSize <= 0) {
+            throw new IllegalArgumentException("buffer length must be greater than zero");
+        }
+
+        this.maxSize = getInt(MAX_STRING_LENGTH);
+        this.bufferProvider = getBufferProvider().newCharProvider(bufferSize);
+        this.valueBufferProvider = getBufferProvider().newCharProvider(maxSize);
+    }
+
+    private BufferStrategy getBufferProvider() {
+        final Object name = internalConfig.get(BUFFER_STRATEGY);
+        if (name != null) {
+            return BufferStrategy.valueOf(name.toString().toUpperCase(Locale.ENGLISH));
+        }
+        return BufferStrategy.QUEUE;
+    }
+
+    private int getInt(final String key) {
+        final Object maxStringSize = internalConfig.get(key);
+        if (maxStringSize == null) {
+            return DEFAULT_MAX_SIZE;
+        } else if (Number.class.isInstance(maxStringSize)) {
+            return Number.class.cast(maxStringSize).intValue();
+        }
+        return Integer.parseInt(maxStringSize.toString());
+    }
+
+    private JsonParser getDefaultJsonParserImpl(final InputStream in) {
+        //UTF Auto detection RFC 4627
+        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider);
+    }
+
+    private JsonParser getDefaultJsonParserImpl(final InputStream in, final Charset charset) {
+        //use provided charset
+        return new JsonStreamParserImpl(in, charset, maxSize, bufferProvider, valueBufferProvider);
+    }
+
+    private JsonParser getDefaultJsonParserImpl(final Reader in) {
+        //no charset necessary
+        return new JsonStreamParserImpl(in, maxSize, bufferProvider, valueBufferProvider);
+    }
+
+    @Override
+    public JsonParser createParser(final Reader reader) {
+        return getDefaultJsonParserImpl(reader);
+    }
+
+    @Override
+    public JsonParser createParser(final InputStream in) {
+        return getDefaultJsonParserImpl(in);
+    }
+
+    @Override
+    public JsonParser createParser(final InputStream in, final Charset charset) {
+        return getDefaultJsonParserImpl(in, charset);
+    }
+
+    @Override
+    public JsonParser createParser(final JsonObject obj) {
+        return new JsonInMemoryParser(obj);
+    }
+
+    @Override
+    public JsonParser createParser(final JsonArray array) {
+        return new JsonInMemoryParser(array);
+    }
+
+    @Override
+    public Map<String, ?> getConfigInUse() {
+        return Collections.unmodifiableMap(internalConfig);
+    }
+
+    public JsonParser createInternalParser(final InputStream in) {
+        return getDefaultJsonParserImpl(in);
+    }
+    
+    public JsonParser createInternalParser(final InputStream in, final Charset charset) {
+        return getDefaultJsonParserImpl(in, charset);
+    }
+
+    public JsonParser createInternalParser(final Reader reader) {
+        return getDefaultJsonParserImpl(reader);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPrettyGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPrettyGeneratorImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPrettyGeneratorImpl.java
new file mode 100644
index 0000000..9ec038e
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonPrettyGeneratorImpl.java
@@ -0,0 +1,305 @@
+/*
+ * 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 java.io.OutputStream;
+import java.io.Writer;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.util.concurrent.ConcurrentMap;
+
+import javax.json.JsonValue;
+import javax.json.stream.JsonGenerator;
+
+final class JsonPrettyGeneratorImpl extends JsonGeneratorImpl {
+    private static final String DEFAULT_INDENTATION = "  ";
+    private final String indent;
+
+    public JsonPrettyGeneratorImpl(final Writer writer, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final ConcurrentMap<String, String> cache) {
+        super(writer, bufferProvider, cache);
+        indent = DEFAULT_INDENTATION;
+    }
+
+    public JsonPrettyGeneratorImpl(final OutputStream out, final Charset encoding,
+            final BufferStrategy.BufferProvider<char[]> bufferProvider, final ConcurrentMap<String, String> cache) {
+        super(out, encoding, bufferProvider, cache);
+        indent = DEFAULT_INDENTATION;
+    }
+
+    public JsonPrettyGeneratorImpl(final OutputStream out, final BufferStrategy.BufferProvider<char[]> bufferProvider,
+            final ConcurrentMap<String, String> cache) {
+        super(out, bufferProvider, cache);
+        indent = DEFAULT_INDENTATION;
+    }
+
+    private void writeEOL() {
+        justWrite(EOL);
+    }
+
+    private void writeIndent(final int correctionOffset) {
+        for (int i = 0; i < depth + correctionOffset; i++) {
+            justWrite(indent);
+        }
+    }
+
+    @Override
+    protected void addCommaIfNeeded() {
+        if (needComma) {
+            justWrite(COMMA_CHAR);
+            writeEOL();
+            writeIndent(0);
+            needComma = false;
+        }
+
+    }
+
+    @Override
+    public JsonGenerator writeStartObject() {
+        if (depth > 0 && !needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeStartObject();
+
+    }
+
+    @Override
+    public JsonGenerator writeStartObject(final String name) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeStartObject(name);
+
+    }
+
+    @Override
+    public JsonGenerator writeStartArray() {
+        if (depth > 0 && !needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeStartArray();
+
+    }
+
+    @Override
+    public JsonGenerator writeStartArray(final String name) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeStartArray(name);
+
+    }
+
+    //end
+
+    @Override
+    public JsonGenerator writeEnd() {
+        writeEOL();
+        writeIndent(-1);
+        return super.writeEnd();
+
+    }
+
+    //normal
+
+    @Override
+    public JsonGenerator write(final String name, final JsonValue value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final String value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final BigInteger value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final BigDecimal value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final int value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final long value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final double value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String name, final boolean value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(name, value);
+
+    }
+
+    @Override
+    public JsonGenerator writeNull(final String name) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeNull(name);
+
+    }
+
+    @Override
+    public JsonGenerator write(final JsonValue value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final String value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final BigDecimal value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final BigInteger value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final int value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final long value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final double value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator write(final boolean value) {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.write(value);
+
+    }
+
+    @Override
+    public JsonGenerator writeNull() {
+        if (!needComma) {
+            writeEOL();
+            writeIndent(0);
+        }
+        return super.writeNull();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
new file mode 100644
index 0000000..273d0db
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonProviderImpl.java
@@ -0,0 +1,205 @@
+/*
+ * 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 java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.Map;
+
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonBuilderFactory;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+import javax.json.JsonWriter;
+import javax.json.JsonWriterFactory;
+import javax.json.spi.JsonProvider;
+import javax.json.stream.JsonGenerator;
+import javax.json.stream.JsonGeneratorFactory;
+import javax.json.stream.JsonParser;
+import javax.json.stream.JsonParserFactory;
+
+public class JsonProviderImpl extends JsonProvider implements Serializable {
+    private static final JsonProvider DELEGATE = new JsonProviderDelegate();
+    
+
+    @Override
+    public JsonParser createParser(final Reader reader) {
+        return DELEGATE.createParser(reader);
+    }
+
+    @Override
+    public JsonParser createParser(final InputStream inputStream) {
+        return DELEGATE.createParser(inputStream);
+    }
+
+    @Override
+    public JsonParserFactory createParserFactory(final Map<String, ?> stringMap) {
+        return DELEGATE.createParserFactory(stringMap);
+    }
+
+    @Override
+    public JsonGenerator createGenerator(final Writer writer) {
+        return DELEGATE.createGenerator(writer);
+    }
+
+    @Override
+    public JsonGenerator createGenerator(final OutputStream outputStream) {
+        return DELEGATE.createGenerator(outputStream);
+    }
+
+    @Override
+    public JsonGeneratorFactory createGeneratorFactory(final Map<String, ?> stringMap) {
+        return DELEGATE.createGeneratorFactory(stringMap);
+    }
+
+    @Override
+    public JsonReader createReader(final Reader reader) {
+        return DELEGATE.createReader(reader);
+    }
+
+    @Override
+    public JsonReader createReader(final InputStream inputStream) {
+        return DELEGATE.createReader(inputStream);
+    }
+
+    @Override
+    public JsonWriter createWriter(final Writer writer) {
+        return DELEGATE.createWriter(writer);
+    }
+
+    @Override
+    public JsonWriter createWriter(final OutputStream outputStream) {
+        return DELEGATE.createWriter(outputStream);
+    }
+
+    @Override
+    public JsonWriterFactory createWriterFactory(final Map<String, ?> stringMap) {
+        return DELEGATE.createWriterFactory(stringMap);
+    }
+
+    @Override
+    public JsonReaderFactory createReaderFactory(final Map<String, ?> stringMap) {
+        return DELEGATE.createReaderFactory(stringMap);
+    }
+
+    @Override
+    public JsonObjectBuilder createObjectBuilder() {
+        return DELEGATE.createObjectBuilder();
+    }
+
+    @Override
+    public JsonArrayBuilder createArrayBuilder() {
+        return DELEGATE.createArrayBuilder();
+    }
+
+    @Override
+    public JsonBuilderFactory createBuilderFactory(Map<String, ?> stringMap) {
+        return DELEGATE.createBuilderFactory(stringMap);
+    }
+
+    static class JsonProviderDelegate extends JsonProvider {
+        private final JsonReaderFactory readerFactory = new JsonReaderFactoryImpl(Collections.<String, Object>emptyMap());
+        private final JsonParserFactory parserFactory = new JsonParserFactoryImpl(Collections.<String, Object>emptyMap());
+        private final JsonGeneratorFactory generatorFactory = new JsonGeneratorFactoryImpl(Collections.<String, Object>emptyMap());
+        private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+
+        @Override
+        public JsonParser createParser(final InputStream in) {
+            return parserFactory.createParser(in);
+        }
+
+        @Override
+        public JsonParser createParser(final Reader reader) {
+            return parserFactory.createParser(reader);
+        }
+
+        @Override
+        public JsonReader createReader(final InputStream in) {
+            return readerFactory.createReader(in);
+        }
+
+        @Override
+        public JsonReader createReader(final Reader reader) {
+            return readerFactory.createReader(reader);
+        }
+
+        @Override
+        public JsonParserFactory createParserFactory(final Map<String, ?> config) {
+            return new JsonParserFactoryImpl(config);
+        }
+
+        @Override
+        public JsonReaderFactory createReaderFactory(final Map<String, ?> config) {
+            return new JsonReaderFactoryImpl(config);
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public JsonGenerator createGenerator(final Writer writer) {
+            return generatorFactory.createGenerator(writer);
+        }
+
+        @Override
+        public JsonGenerator createGenerator(final OutputStream out) {
+            return generatorFactory.createGenerator(out);
+        }
+
+        @Override
+        public JsonGeneratorFactory createGeneratorFactory(final Map<String, ?> config) {
+            return new JsonGeneratorFactoryImpl(config);
+        }
+
+        @Override
+        public JsonWriter createWriter(final Writer writer) {
+            return new JsonWriterImpl(createGenerator(writer));
+        }
+
+        @Override
+        public JsonWriter createWriter(final OutputStream out) {
+            return createWriter(new OutputStreamWriter(out, UTF8_CHARSET));
+        }
+
+        @Override
+        public JsonWriterFactory createWriterFactory(final Map<String, ?> config) {
+            return new JsonWriterFactoryImpl(config);
+        }
+
+        @Override
+        public JsonObjectBuilder createObjectBuilder() {
+            return new JsonObjectBuilderImpl();
+        }
+
+        @Override
+        public JsonArrayBuilder createArrayBuilder() {
+            return new JsonArrayBuilderImpl();
+        }
+
+        @Override
+        public JsonBuilderFactory createBuilderFactory(final Map<String, ?> config) {
+            return new JsonBuilderFactoryImpl(config);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
new file mode 100644
index 0000000..65549ac
--- /dev/null
+++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonReaderFactoryImpl.java
@@ -0,0 +1,72 @@
+/*
+ * 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 java.io.InputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+
+class JsonReaderFactoryImpl implements JsonReaderFactory, Serializable {
+    private final Map<String, Object> internalConfig = new HashMap<String, Object>();
+    private static final String[] SUPPORTED_CONFIG_KEYS = new String[] {
+        JsonParserFactoryImpl.BUFFER_STRATEGY, JsonParserFactoryImpl.MAX_STRING_LENGTH, JsonParserFactoryImpl.BUFFER_LENGTH
+    };
+    private final JsonParserFactoryImpl parserFactory;
+
+    JsonReaderFactoryImpl(final Map<String, ?> config) {
+
+        if(config != null) {
+            
+            for (String configKey : SUPPORTED_CONFIG_KEYS) {
+                if(config.containsKey(configKey)) {
+                    internalConfig.put(configKey, config.get(configKey));
+                }
+            }
+        } 
+        
+        this.parserFactory = new JsonParserFactoryImpl(internalConfig);
+    }
+
+    @Override
+    public JsonReader createReader(final Reader reader) {
+        return new JsonReaderImpl(parserFactory.createInternalParser(reader));
+    }
+
+    @Override
+    public JsonReader createReader(final InputStream in) {
+        return new JsonReaderImpl(parserFactory.createInternalParser(in));
+    }
+
+    @Override
+    public JsonReader createReader(final InputStream in, final Charset charset) {
+        return new JsonReaderImpl(parserFactory.createInternalParser(in, charset));
+    }
+
+    @Override
+    public Map<String, ?> getConfigInUse() {
+        return Collections.unmodifiableMap(internalConfig);
+    }
+}


[06/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/big_600kb.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/big_600kb.json b/johnzon-core/src/test/resources/bench/big_600kb.json
new file mode 100644
index 0000000..794933d
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/big_600kb.json
@@ -0,0 +1,21170 @@
+[
+  {
+    "id": 0,
+    "guid": "90909455-75ff-47b7-869c-05c24b21b29c",
+    "isActive": false,
+    "balance": "$3,117.06",
+    "picture": "http://placehold.it/32x32",
+    "age": 37,
+    "eyeColor": "brown",
+    "name": "Gill Alvarado",
+    "gender": "male",
+    "company": "ZENSUS",
+    "address": "606 Holmes Lane, Hardyville, Louisiana, 2829",
+    "about": "Voluptate minim ad pariatur qui commodo elit veniam deserunt ex proident ad veniam. Consectetur consectetur consequat tempor dolore id consequat officia. Do ullamco dolore sint est deserunt reprehenderit esse. Est consectetur excepteur eiusmod enim eu ad sunt. Veniam aliqua id cupidatat reprehenderit et ullamco culpa magna culpa deserunt nisi dolor consequat duis. Dolore commodo nisi sit in velit pariatur consequat commodo. Nisi do enim sint consectetur amet dolore laborum labore ullamco.\r\n",
+    "registered": "2014-05-01T05:52:56 -02:00",
+    "latitude": -24.379027,
+    "longitude": 21.69924,
+    "tags": [
+      "velit",
+      "incididunt",
+      "duis",
+      "quis",
+      "elit",
+      "laboris",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lora Middleton"
+      },
+      {
+        "id": 1,
+        "name": "Mccall Mckay"
+      },
+      {
+        "id": 2,
+        "name": "Nash Brennan"
+      }
+    ],
+    "greeting": "Hello, Gill Alvarado! You have 9 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 1,
+    "guid": "627b8274-05d7-4f33-a316-835d57cba4fe",
+    "isActive": true,
+    "balance": "$3,477.42",
+    "picture": "http://placehold.it/32x32",
+    "age": 23,
+    "eyeColor": "brown",
+    "name": "Elvira Maddox",
+    "gender": "female",
+    "company": "UNDERTAP",
+    "address": "154 Locust Street, Chapin, Missouri, 4712",
+    "about": "Occaecat pariatur do minim mollit aute do nostrud id sunt. Dolore enim irure est ad adipisicing labore est. Adipisicing officia consectetur Lorem pariatur adipisicing qui ad officia aute. Est id laborum aliqua minim aliquip eiusmod officia.\r\n",
+    "registered": "2014-06-04T01:19:55 -02:00",
+    "latitude": -26.425596,
+    "longitude": 139.328657,
+    "tags": [
+      "nisi",
+      "laborum",
+      "sunt",
+      "minim",
+      "in",
+      "elit",
+      "ut"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Obrien Harris"
+      },
+      {
+        "id": 1,
+        "name": "Muriel Finch"
+      },
+      {
+        "id": 2,
+        "name": "Jeanie Hobbs"
+      }
+    ],
+    "greeting": "Hello, Elvira Maddox! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 2,
+    "guid": "f6ac5b23-67f6-40c5-a8fd-c3f0e18c0dc4",
+    "isActive": false,
+    "balance": "$2,987.75",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "blue",
+    "name": "Miranda Bowen",
+    "gender": "male",
+    "company": "PORTICO",
+    "address": "960 Harbor Court, Bluetown, Arkansas, 6598",
+    "about": "Commodo consectetur dolore aute laboris veniam et. Anim nulla aute voluptate pariatur occaecat dolor laborum exercitation irure magna exercitation officia fugiat magna. Amet anim exercitation voluptate veniam. Cupidatat incididunt nostrud Lorem irure laboris duis irure labore ad amet aliqua ex pariatur et. Cillum pariatur ipsum anim culpa esse non qui fugiat irure ipsum Lorem adipisicing. Labore excepteur aliqua nostrud ad sunt officia. Pariatur nisi dolore quis cillum consequat qui excepteur minim pariatur magna nisi commodo.\r\n",
+    "registered": "2014-05-28T00:14:04 -02:00",
+    "latitude": -74.237441,
+    "longitude": -140.084515,
+    "tags": [
+      "velit",
+      "culpa",
+      "incididunt",
+      "dolore",
+      "nulla",
+      "Lorem",
+      "et"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Kelly Flowers"
+      },
+      {
+        "id": 1,
+        "name": "Farmer Sanchez"
+      },
+      {
+        "id": 2,
+        "name": "Branch Tanner"
+      }
+    ],
+    "greeting": "Hello, Miranda Bowen! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 3,
+    "guid": "191c141e-2b21-4fed-8287-6ec8b3e5cc71",
+    "isActive": true,
+    "balance": "$1,002.25",
+    "picture": "http://placehold.it/32x32",
+    "age": 37,
+    "eyeColor": "green",
+    "name": "Dee Freeman",
+    "gender": "female",
+    "company": "HAWKSTER",
+    "address": "356 Amity Street, Trail, California, 3332",
+    "about": "Labore ipsum exercitation ipsum ipsum voluptate commodo fugiat est id et mollit veniam. Irure ipsum ut aliqua et id eiusmod in eiusmod labore excepteur sit eu aliquip. Labore nostrud consectetur enim mollit fugiat ex exercitation quis irure cillum duis pariatur qui ipsum. Aliqua culpa et amet ea incididunt consequat. Cillum reprehenderit enim cillum proident eiusmod. Exercitation Lorem do nulla veniam aliqua enim. Ipsum minim veniam deserunt quis anim cupidatat.\r\n",
+    "registered": "2014-06-13T08:25:12 -02:00",
+    "latitude": -40.507152,
+    "longitude": -46.43242,
+    "tags": [
+      "nisi",
+      "proident",
+      "anim",
+      "do",
+      "consectetur",
+      "dolore",
+      "qui"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Langley Osborn"
+      },
+      {
+        "id": 1,
+        "name": "Tammy Mckenzie"
+      },
+      {
+        "id": 2,
+        "name": "Lidia Adkins"
+      }
+    ],
+    "greeting": "Hello, Dee Freeman! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 4,
+    "guid": "62552a32-d411-43be-8ece-ff083a31cf8f",
+    "isActive": true,
+    "balance": "$3,722.18",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "blue",
+    "name": "Mcfadden Terrell",
+    "gender": "male",
+    "company": "VALREDA",
+    "address": "175 Auburn Place, Welda, Kansas, 6118",
+    "about": "Non exercitation deserunt minim ipsum qui elit occaecat magna fugiat veniam eiusmod anim. Ad aute esse proident id consectetur cillum adipisicing sint Lorem enim ex laboris laborum deserunt. Qui ea proident nulla eu dolore. Cillum excepteur nulla ad incididunt aliqua esse incididunt magna laboris dolore culpa consectetur dolor id. Aliqua labore elit sit sint enim veniam. Consequat do enim laborum reprehenderit cupidatat laborum fugiat ullamco deserunt.\r\n",
+    "registered": "2014-01-22T22:48:37 -01:00",
+    "latitude": 2.71901,
+    "longitude": -75.747338,
+    "tags": [
+      "mollit",
+      "et",
+      "dolore",
+      "pariatur",
+      "minim",
+      "magna",
+      "ex"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Parks Bauer"
+      },
+      {
+        "id": 1,
+        "name": "Head Rollins"
+      },
+      {
+        "id": 2,
+        "name": "Hopkins Singleton"
+      }
+    ],
+    "greeting": "Hello, Mcfadden Terrell! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 5,
+    "guid": "aead779c-2a36-4342-994a-4974eb929a7c",
+    "isActive": false,
+    "balance": "$3,984.58",
+    "picture": "http://placehold.it/32x32",
+    "age": 20,
+    "eyeColor": "green",
+    "name": "Little Hurley",
+    "gender": "male",
+    "company": "SATIANCE",
+    "address": "301 Flatbush Avenue, Statenville, Maine, 8754",
+    "about": "Duis excepteur laboris ex adipisicing. Et dolor officia velit duis laborum consequat Lorem anim in. Sunt velit amet ad cillum magna. Reprehenderit excepteur ipsum in nisi ad pariatur nostrud ullamco in laborum consectetur eiusmod adipisicing consectetur.\r\n",
+    "registered": "2014-05-05T15:54:25 -02:00",
+    "latitude": 69.423196,
+    "longitude": -94.350728,
+    "tags": [
+      "et",
+      "quis",
+      "tempor",
+      "aute",
+      "aliqua",
+      "sit",
+      "aute"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Carolina Jimenez"
+      },
+      {
+        "id": 1,
+        "name": "Amanda Mathis"
+      },
+      {
+        "id": 2,
+        "name": "Annie Fuller"
+      }
+    ],
+    "greeting": "Hello, Little Hurley! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 6,
+    "guid": "7ca92bd5-e732-407f-ad24-ad143d9b9ec1",
+    "isActive": false,
+    "balance": "$3,707.35",
+    "picture": "http://placehold.it/32x32",
+    "age": 25,
+    "eyeColor": "blue",
+    "name": "Faye Olson",
+    "gender": "female",
+    "company": "COMTREK",
+    "address": "902 Bradford Street, Holcombe, Northern Mariana Islands, 5003",
+    "about": "Et non ullamco consectetur voluptate sint anim incididunt. Minim sunt minim reprehenderit exercitation consectetur. Sit mollit excepteur qui cillum esse laboris consequat nisi. Amet ea et ut tempor aliqua qui do culpa sit dolore. Est mollit ex cupidatat pariatur eiusmod culpa fugiat laborum ut incididunt dolore nostrud ipsum.\r\n",
+    "registered": "2014-01-18T01:31:34 -01:00",
+    "latitude": -64.058845,
+    "longitude": -94.333028,
+    "tags": [
+      "ea",
+      "duis",
+      "esse",
+      "magna",
+      "dolore",
+      "aliqua",
+      "cillum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sheppard Butler"
+      },
+      {
+        "id": 1,
+        "name": "Stokes Woodward"
+      },
+      {
+        "id": 2,
+        "name": "Hendrix Baxter"
+      }
+    ],
+    "greeting": "Hello, Faye Olson! You have 6 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 7,
+    "guid": "bb6e0a12-c5b9-4817-8aee-27b43649cbc7",
+    "isActive": true,
+    "balance": "$1,164.27",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "green",
+    "name": "Kelley Trevino",
+    "gender": "male",
+    "company": "GENMOM",
+    "address": "387 Stuart Street, Bodega, Guam, 1672",
+    "about": "Fugiat laboris cupidatat reprehenderit velit excepteur sunt aliquip Lorem. Sunt sit laboris veniam mollit. Ea consectetur labore aute commodo qui ullamco reprehenderit amet. Duis pariatur culpa nostrud adipisicing commodo pariatur. Anim pariatur magna aute ea magna do ea excepteur sint ad officia nisi.\r\n",
+    "registered": "2014-02-22T14:06:37 -01:00",
+    "latitude": 52.294677,
+    "longitude": -141.875032,
+    "tags": [
+      "dolor",
+      "ipsum",
+      "sunt",
+      "deserunt",
+      "qui",
+      "adipisicing",
+      "irure"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Queen Ferrell"
+      },
+      {
+        "id": 1,
+        "name": "Alfreda Lane"
+      },
+      {
+        "id": 2,
+        "name": "Anderson Benson"
+      }
+    ],
+    "greeting": "Hello, Kelley Trevino! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 8,
+    "guid": "8ba230e6-055c-46d4-989a-9ed765941d67",
+    "isActive": true,
+    "balance": "$2,213.32",
+    "picture": "http://placehold.it/32x32",
+    "age": 30,
+    "eyeColor": "green",
+    "name": "Marietta Stout",
+    "gender": "female",
+    "company": "KROG",
+    "address": "251 Court Square, Emerald, North Carolina, 2349",
+    "about": "Aliquip sint laboris ut Lorem ipsum amet dolor esse. Excepteur est officia consectetur et. Incididunt pariatur dolor magna culpa labore deserunt duis. Cupidatat consequat occaecat ad esse pariatur ex anim proident. Tempor consequat laboris tempor enim occaecat. Labore ex deserunt est sunt sunt mollit laboris ex in.\r\n",
+    "registered": "2014-05-17T04:06:24 -02:00",
+    "latitude": 37.56671,
+    "longitude": -116.19298,
+    "tags": [
+      "nulla",
+      "quis",
+      "aliquip",
+      "magna",
+      "ad",
+      "exercitation",
+      "pariatur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Hallie Vargas"
+      },
+      {
+        "id": 1,
+        "name": "Desiree Maxwell"
+      },
+      {
+        "id": 2,
+        "name": "Mayer Arnold"
+      }
+    ],
+    "greeting": "Hello, Marietta Stout! You have 1 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 9,
+    "guid": "7e4aee63-9a75-4aa8-af6b-01bcd5e16a20",
+    "isActive": false,
+    "balance": "$3,286.68",
+    "picture": "http://placehold.it/32x32",
+    "age": 21,
+    "eyeColor": "blue",
+    "name": "Viola Rivers",
+    "gender": "female",
+    "company": "HELIXO",
+    "address": "807 Amber Street, Aberdeen, West Virginia, 562",
+    "about": "Magna eiusmod commodo est do duis do. Ullamco ad do dolor reprehenderit ipsum irure. Ex nostrud officia laborum duis proident cillum est fugiat. Consectetur labore tempor dolor duis nisi proident amet incididunt sunt ad ea non. Laboris dolor magna adipisicing eiusmod.\r\n",
+    "registered": "2014-02-13T22:44:55 -01:00",
+    "latitude": 41.971903,
+    "longitude": -81.734388,
+    "tags": [
+      "proident",
+      "tempor",
+      "duis",
+      "excepteur",
+      "aute",
+      "laboris",
+      "minim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Mcdonald Mcguire"
+      },
+      {
+        "id": 1,
+        "name": "Adrienne Hinton"
+      },
+      {
+        "id": 2,
+        "name": "Dorothea Santos"
+      }
+    ],
+    "greeting": "Hello, Viola Rivers! You have 3 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 10,
+    "guid": "c5b167f5-823f-4889-9b8e-4594c4082cff",
+    "isActive": false,
+    "balance": "$3,547.76",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "blue",
+    "name": "Ollie Hyde",
+    "gender": "female",
+    "company": "INTERFIND",
+    "address": "627 Bevy Court, Nadine, Connecticut, 3643",
+    "about": "Dolore in qui veniam qui do labore enim proident reprehenderit. Pariatur fugiat non id aliquip non reprehenderit. Amet sint in cillum irure laborum dolore culpa aliquip deserunt. Duis deserunt pariatur non exercitation minim non cupidatat sunt labore mollit. Exercitation ea sit incididunt est nostrud esse consectetur et commodo deserunt nostrud minim ullamco in.\r\n",
+    "registered": "2014-04-06T23:34:04 -02:00",
+    "latitude": -69.599214,
+    "longitude": 168.519498,
+    "tags": [
+      "duis",
+      "labore",
+      "voluptate",
+      "quis",
+      "non",
+      "magna",
+      "officia"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Dolly Jarvis"
+      },
+      {
+        "id": 1,
+        "name": "Leon Burns"
+      },
+      {
+        "id": 2,
+        "name": "Underwood Livingston"
+      }
+    ],
+    "greeting": "Hello, Ollie Hyde! You have 3 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 11,
+    "guid": "2e7590d5-7e93-4d26-9155-520d5cf29a4b",
+    "isActive": false,
+    "balance": "$1,448.29",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "brown",
+    "name": "Kim Fox",
+    "gender": "female",
+    "company": "GEEKMOSIS",
+    "address": "854 Monroe Street, Bethpage, Michigan, 2679",
+    "about": "Aliqua in laborum sit adipisicing elit mollit ex eiusmod est. Culpa veniam dolor elit nostrud anim deserunt exercitation eiusmod amet. Consequat magna dolore proident aute nostrud nostrud. Veniam incididunt nisi cillum anim sit sint est proident commodo reprehenderit eiusmod ullamco. Non quis elit laboris minim fugiat in labore eiusmod pariatur labore magna do enim dolor. Aliquip reprehenderit qui enim quis velit adipisicing. Quis in eiusmod ipsum enim aliquip non deserunt nisi anim ex.\r\n",
+    "registered": "2014-01-28T18:39:52 -01:00",
+    "latitude": -81.998284,
+    "longitude": -88.055618,
+    "tags": [
+      "nisi",
+      "exercitation",
+      "reprehenderit",
+      "tempor",
+      "anim",
+      "eu",
+      "amet"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lara Salas"
+      },
+      {
+        "id": 1,
+        "name": "Erin Jones"
+      },
+      {
+        "id": 2,
+        "name": "Rivera Perkins"
+      }
+    ],
+    "greeting": "Hello, Kim Fox! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 12,
+    "guid": "5c675780-defd-49e9-9cab-bd2a2622b3f1",
+    "isActive": true,
+    "balance": "$1,028.15",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "green",
+    "name": "Brenda Merritt",
+    "gender": "female",
+    "company": "DANCERITY",
+    "address": "289 Royce Street, Interlochen, Nevada, 7469",
+    "about": "Eiusmod deserunt aliquip aliquip laboris non. Laborum occaecat aute et anim sit sunt proident Lorem incididunt nisi. Ut consectetur id est eiusmod dolore voluptate deserunt officia aliqua duis adipisicing consequat quis. Velit Lorem dolor nisi ex.\r\n",
+    "registered": "2014-03-23T14:31:05 -01:00",
+    "latitude": -1.992419,
+    "longitude": -109.503804,
+    "tags": [
+      "duis",
+      "aliquip",
+      "mollit",
+      "fugiat",
+      "magna",
+      "ipsum",
+      "culpa"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Page Marsh"
+      },
+      {
+        "id": 1,
+        "name": "Katie Callahan"
+      },
+      {
+        "id": 2,
+        "name": "Ruth Francis"
+      }
+    ],
+    "greeting": "Hello, Brenda Merritt! You have 3 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 13,
+    "guid": "437e75d6-2ac5-4ea6-8063-88708c2b8227",
+    "isActive": false,
+    "balance": "$1,374.74",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "blue",
+    "name": "Deirdre Keller",
+    "gender": "female",
+    "company": "GREEKER",
+    "address": "438 Onderdonk Avenue, Glenbrook, Wisconsin, 9551",
+    "about": "Non do cupidatat proident id minim. Velit est officia cupidatat dolor aliquip non et nulla quis et eiusmod eiusmod ullamco ipsum. Dolor ex excepteur sunt non quis anim. Voluptate cillum cupidatat consectetur ipsum amet.\r\n",
+    "registered": "2014-06-14T22:20:04 -02:00",
+    "latitude": 87.768462,
+    "longitude": 22.530136,
+    "tags": [
+      "do",
+      "cillum",
+      "nulla",
+      "veniam",
+      "proident",
+      "adipisicing",
+      "Lorem"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Quinn Rutledge"
+      },
+      {
+        "id": 1,
+        "name": "Eva Cervantes"
+      },
+      {
+        "id": 2,
+        "name": "Sylvia Tillman"
+      }
+    ],
+    "greeting": "Hello, Deirdre Keller! You have 4 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 14,
+    "guid": "96a02585-1723-4515-935d-0cede27c0846",
+    "isActive": false,
+    "balance": "$1,779.14",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "green",
+    "name": "Shanna Baker",
+    "gender": "female",
+    "company": "AVIT",
+    "address": "788 Nostrand Avenue, Saranap, District Of Columbia, 5974",
+    "about": "In commodo in aute esse occaecat eu sit esse. Exercitation qui id proident officia aute aliquip aliqua reprehenderit nulla adipisicing occaecat elit. Cupidatat exercitation duis nulla minim id eu veniam ut pariatur consectetur veniam non labore aliquip. Consectetur velit ipsum id quis labore eiusmod. Lorem proident eiusmod ea ullamco mollit laborum esse anim mollit. Aute dolore est anim qui proident elit incididunt. Ad labore esse amet voluptate qui aute quis ipsum aute duis adipisicing.\r\n",
+    "registered": "2014-04-10T03:51:29 -02:00",
+    "latitude": -13.861562,
+    "longitude": -27.313199,
+    "tags": [
+      "adipisicing",
+      "velit",
+      "Lorem",
+      "quis",
+      "sint",
+      "qui",
+      "adipisicing"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Carla Hopper"
+      },
+      {
+        "id": 1,
+        "name": "Richards Noel"
+      },
+      {
+        "id": 2,
+        "name": "Snider Cotton"
+      }
+    ],
+    "greeting": "Hello, Shanna Baker! You have 7 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 15,
+    "guid": "ec8191f7-6f03-4cf7-91da-3024fb9ea38a",
+    "isActive": true,
+    "balance": "$3,633.64",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "blue",
+    "name": "Imogene Britt",
+    "gender": "female",
+    "company": "COMVEY",
+    "address": "436 Stillwell Place, Tyhee, Arizona, 4963",
+    "about": "Velit ex ea non consectetur Lorem eu voluptate aliqua est voluptate. Irure nostrud nisi incididunt tempor proident officia id nisi duis enim. Non aliquip magna sint exercitation incididunt reprehenderit cillum commodo Lorem reprehenderit enim sunt eiusmod.\r\n",
+    "registered": "2014-05-09T16:14:08 -02:00",
+    "latitude": 52.374659,
+    "longitude": 30.332988,
+    "tags": [
+      "aute",
+      "quis",
+      "quis",
+      "dolore",
+      "deserunt",
+      "fugiat",
+      "aliquip"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Chan Whitney"
+      },
+      {
+        "id": 1,
+        "name": "Minnie Randolph"
+      },
+      {
+        "id": 2,
+        "name": "Beard Christensen"
+      }
+    ],
+    "greeting": "Hello, Imogene Britt! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 16,
+    "guid": "63b67c06-e945-42a0-85e8-8e15ad1a732d",
+    "isActive": true,
+    "balance": "$1,006.45",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "green",
+    "name": "Sheryl Cochran",
+    "gender": "female",
+    "company": "COMVOY",
+    "address": "770 Stryker Street, Hollins, Vermont, 3360",
+    "about": "Ad sint esse laborum exercitation eu id irure veniam aliquip dolore voluptate est. Cupidatat irure ut exercitation ipsum nulla laborum enim proident sunt laboris magna in. Incididunt eu magna cupidatat ut sit deserunt deserunt.\r\n",
+    "registered": "2014-05-07T00:50:42 -02:00",
+    "latitude": -37.208466,
+    "longitude": -114.220095,
+    "tags": [
+      "nostrud",
+      "non",
+      "cupidatat",
+      "irure",
+      "ullamco",
+      "cillum",
+      "commodo"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Cook Rowe"
+      },
+      {
+        "id": 1,
+        "name": "Marla Cooke"
+      },
+      {
+        "id": 2,
+        "name": "Brandi Mccray"
+      }
+    ],
+    "greeting": "Hello, Sheryl Cochran! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 17,
+    "guid": "41ac5392-ca10-475e-a1c6-c8d11aaa8fe6",
+    "isActive": true,
+    "balance": "$3,784.16",
+    "picture": "http://placehold.it/32x32",
+    "age": 25,
+    "eyeColor": "blue",
+    "name": "Christine Flynn",
+    "gender": "female",
+    "company": "PETICULAR",
+    "address": "842 Nova Court, Hegins, Colorado, 1207",
+    "about": "Ullamco est amet id anim ut velit. Commodo laboris duis amet occaecat irure mollit cillum aliquip cillum occaecat dolore ea excepteur aliquip. Irure consequat enim eu laboris ut mollit exercitation enim quis laboris est incididunt tempor. Eiusmod enim ad irure exercitation id deserunt eiusmod nostrud officia pariatur consectetur exercitation anim incididunt. Nisi aliqua incididunt duis est. Commodo cillum enim elit enim voluptate qui sint cillum eiusmod. Eu ea dolor est irure proident deserunt fugiat duis cillum.\r\n",
+    "registered": "2014-06-03T15:42:25 -02:00",
+    "latitude": 65.061089,
+    "longitude": 3.219881,
+    "tags": [
+      "commodo",
+      "duis",
+      "voluptate",
+      "veniam",
+      "ipsum",
+      "ipsum",
+      "labore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Jefferson Berry"
+      },
+      {
+        "id": 1,
+        "name": "Alston Weiss"
+      },
+      {
+        "id": 2,
+        "name": "Marina Boone"
+      }
+    ],
+    "greeting": "Hello, Christine Flynn! You have 1 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 18,
+    "guid": "a89d01d0-37d5-41a1-be54-25d6bf98e092",
+    "isActive": false,
+    "balance": "$2,946.08",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "brown",
+    "name": "Sheena Hill",
+    "gender": "female",
+    "company": "RECRISYS",
+    "address": "358 Billings Place, Villarreal, Mississippi, 1510",
+    "about": "Aute sint consectetur dolor elit do cillum aute cupidatat. Id nisi commodo dolor labore culpa aliqua labore. Amet reprehenderit tempor ut nulla minim. Laborum amet dolore sunt laboris laboris do aute. Dolor amet cupidatat aliqua duis consectetur nostrud velit veniam. Amet sunt exercitation aute cupidatat consequat cillum commodo.\r\n",
+    "registered": "2014-06-07T17:24:39 -02:00",
+    "latitude": 15.059534,
+    "longitude": 9.648239,
+    "tags": [
+      "duis",
+      "excepteur",
+      "ea",
+      "aute",
+      "mollit",
+      "labore",
+      "ad"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Katheryn Sims"
+      },
+      {
+        "id": 1,
+        "name": "Williamson Collier"
+      },
+      {
+        "id": 2,
+        "name": "Kathy Paul"
+      }
+    ],
+    "greeting": "Hello, Sheena Hill! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 19,
+    "guid": "7f6333ba-03d9-45e8-b1ac-4dd50bc466e0",
+    "isActive": true,
+    "balance": "$2,323.89",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "brown",
+    "name": "Maryellen Bryan",
+    "gender": "female",
+    "company": "GLUID",
+    "address": "826 Portland Avenue, Bordelonville, American Samoa, 8848",
+    "about": "Aliquip nostrud do minim ut qui commodo enim cillum enim. Incididunt non mollit reprehenderit laborum officia adipisicing in id consectetur eu eiusmod in irure. Nulla esse dolore incididunt cillum eu mollit nulla. Elit qui ea voluptate consectetur.\r\n",
+    "registered": "2014-06-21T15:30:13 -02:00",
+    "latitude": 45.789266,
+    "longitude": -169.609702,
+    "tags": [
+      "exercitation",
+      "occaecat",
+      "adipisicing",
+      "enim",
+      "sunt",
+      "fugiat",
+      "nostrud"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Hodge Gates"
+      },
+      {
+        "id": 1,
+        "name": "Beatriz Gallegos"
+      },
+      {
+        "id": 2,
+        "name": "Marks Byrd"
+      }
+    ],
+    "greeting": "Hello, Maryellen Bryan! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 20,
+    "guid": "c5f6beae-5920-4cb5-b8b8-d737c6776d3a",
+    "isActive": true,
+    "balance": "$3,270.86",
+    "picture": "http://placehold.it/32x32",
+    "age": 37,
+    "eyeColor": "blue",
+    "name": "Ursula Rich",
+    "gender": "female",
+    "company": "TERASCAPE",
+    "address": "779 Duffield Street, Waterloo, Alaska, 7054",
+    "about": "Proident veniam enim qui nisi minim commodo voluptate dolor Lorem. Quis sunt id ipsum est laboris aliquip eiusmod quis. Nisi eu id culpa ullamco mollit nulla mollit sint esse velit irure. Velit eiusmod sit sint ut incididunt nisi eiusmod aliqua.\r\n",
+    "registered": "2014-01-14T01:08:24 -01:00",
+    "latitude": 14.985632,
+    "longitude": 101.677198,
+    "tags": [
+      "eu",
+      "excepteur",
+      "velit",
+      "duis",
+      "commodo",
+      "quis",
+      "adipisicing"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bernadine Holland"
+      },
+      {
+        "id": 1,
+        "name": "Walters Park"
+      },
+      {
+        "id": 2,
+        "name": "Vance Parsons"
+      }
+    ],
+    "greeting": "Hello, Ursula Rich! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 21,
+    "guid": "d1cf2bcd-22a0-4611-b4a9-77aedd830181",
+    "isActive": false,
+    "balance": "$1,641.39",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "blue",
+    "name": "Nguyen Bush",
+    "gender": "male",
+    "company": "ELENTRIX",
+    "address": "244 Front Street, Roulette, Maryland, 1741",
+    "about": "Proident sint esse cillum ullamco irure sint deserunt ipsum. Sit laboris ullamco non exercitation incididunt incididunt commodo irure consectetur. Velit aute voluptate dolore mollit aliquip sit.\r\n",
+    "registered": "2014-05-16T09:42:47 -02:00",
+    "latitude": 56.019327,
+    "longitude": 33.678678,
+    "tags": [
+      "cupidatat",
+      "excepteur",
+      "culpa",
+      "sit",
+      "voluptate",
+      "laborum",
+      "eiusmod"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Carole Gregory"
+      },
+      {
+        "id": 1,
+        "name": "Clark Green"
+      },
+      {
+        "id": 2,
+        "name": "Christensen Holloway"
+      }
+    ],
+    "greeting": "Hello, Nguyen Bush! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 22,
+    "guid": "a2bb311f-c76f-451a-afa6-6089011aad51",
+    "isActive": true,
+    "balance": "$3,456.55",
+    "picture": "http://placehold.it/32x32",
+    "age": 20,
+    "eyeColor": "blue",
+    "name": "Misty Baird",
+    "gender": "female",
+    "company": "BIFLEX",
+    "address": "275 Liberty Avenue, Sabillasville, Nebraska, 2219",
+    "about": "Dolor tempor nulla dolore id laboris dolor labore voluptate mollit dolore aliquip. Minim esse adipisicing aliquip voluptate minim reprehenderit consequat et nisi proident tempor magna. Anim quis enim culpa mollit quis enim. Proident eiusmod reprehenderit et commodo ex est voluptate aliqua sint duis cillum anim ea amet.\r\n",
+    "registered": "2014-04-22T15:08:23 -02:00",
+    "latitude": 32.986275,
+    "longitude": -157.543912,
+    "tags": [
+      "adipisicing",
+      "laborum",
+      "sint",
+      "ut",
+      "minim",
+      "enim",
+      "non"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Meadows White"
+      },
+      {
+        "id": 1,
+        "name": "Velma Carr"
+      },
+      {
+        "id": 2,
+        "name": "Shepard Mcdonald"
+      }
+    ],
+    "greeting": "Hello, Misty Baird! You have 6 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 23,
+    "guid": "d7a25c26-3cd8-48fe-946c-259932c19c71",
+    "isActive": false,
+    "balance": "$3,304.19",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "blue",
+    "name": "Pena Hodges",
+    "gender": "male",
+    "company": "MARQET",
+    "address": "233 Battery Avenue, Fairacres, Tennessee, 5113",
+    "about": "Laborum nulla nisi occaecat consectetur velit sit proident ea tempor nulla eiusmod. Est irure dolor duis non ea in labore dolore ad eiusmod Lorem velit. Aliqua laborum ut sit excepteur duis ad duis do minim sunt pariatur. Ut qui elit velit adipisicing est. Aliquip excepteur sit velit nisi sunt sit aliquip nisi do reprehenderit. Lorem voluptate sunt reprehenderit aliqua. Exercitation ipsum consectetur mollit et aliqua sint.\r\n",
+    "registered": "2014-01-21T00:55:28 -01:00",
+    "latitude": -32.041115,
+    "longitude": 97.517042,
+    "tags": [
+      "dolore",
+      "in",
+      "eiusmod",
+      "voluptate",
+      "sit",
+      "eu",
+      "irure"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Benita Huber"
+      },
+      {
+        "id": 1,
+        "name": "Wolfe Mckinney"
+      },
+      {
+        "id": 2,
+        "name": "Morrow England"
+      }
+    ],
+    "greeting": "Hello, Pena Hodges! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 24,
+    "guid": "4f09a217-f861-4f92-9696-f24f02ab091e",
+    "isActive": true,
+    "balance": "$1,603.10",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "green",
+    "name": "Allie Dickson",
+    "gender": "female",
+    "company": "KONGENE",
+    "address": "351 Imlay Street, Enlow, Minnesota, 2988",
+    "about": "Veniam qui magna Lorem aliqua deserunt elit sint reprehenderit. Ex proident officia enim sit reprehenderit elit cillum exercitation est laborum et. Reprehenderit nisi irure nulla ad dolor.\r\n",
+    "registered": "2014-01-25T01:14:31 -01:00",
+    "latitude": -36.986396,
+    "longitude": 41.443775,
+    "tags": [
+      "adipisicing",
+      "mollit",
+      "proident",
+      "ut",
+      "culpa",
+      "aliquip",
+      "sint"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Reese Pacheco"
+      },
+      {
+        "id": 1,
+        "name": "Helen Boyd"
+      },
+      {
+        "id": 2,
+        "name": "Schroeder Robles"
+      }
+    ],
+    "greeting": "Hello, Allie Dickson! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 25,
+    "guid": "7d0ab9aa-83b6-4abe-9f0f-656bf9edd597",
+    "isActive": false,
+    "balance": "$3,674.50",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "blue",
+    "name": "Fern Mosley",
+    "gender": "female",
+    "company": "RODEOLOGY",
+    "address": "851 Hoyts Lane, Crucible, Delaware, 9435",
+    "about": "Cupidatat ipsum excepteur occaecat irure et in non mollit. Ex magna quis cupidatat ea dolore enim reprehenderit dolor. Deserunt in fugiat enim non id est velit laborum velit eu. Consectetur et ullamco magna ea esse. Consectetur do fugiat cillum magna mollit quis non cupidatat ut fugiat est nulla.\r\n",
+    "registered": "2014-01-17T08:45:48 -01:00",
+    "latitude": 18.755477,
+    "longitude": -59.863641,
+    "tags": [
+      "aliqua",
+      "non",
+      "tempor",
+      "labore",
+      "do",
+      "elit",
+      "ipsum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Torres Farrell"
+      },
+      {
+        "id": 1,
+        "name": "Hollie Harding"
+      },
+      {
+        "id": 2,
+        "name": "Maldonado Valencia"
+      }
+    ],
+    "greeting": "Hello, Fern Mosley! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 26,
+    "guid": "634a5ee8-5eef-40da-aae5-1f0bb69791be",
+    "isActive": true,
+    "balance": "$3,338.34",
+    "picture": "http://placehold.it/32x32",
+    "age": 38,
+    "eyeColor": "blue",
+    "name": "Adkins Norris",
+    "gender": "male",
+    "company": "EGYPTO",
+    "address": "673 Interborough Parkway, Williams, Washington, 938",
+    "about": "Exercitation ipsum voluptate ex qui aliquip excepteur deserunt deserunt eu. Anim cupidatat anim ea in laborum aute minim elit. Reprehenderit et minim id reprehenderit quis ea in mollit minim ex consequat. Id sunt laborum consequat anim. Nulla nostrud ad est irure non ad ad veniam sint nostrud.\r\n",
+    "registered": "2014-01-13T04:01:53 -01:00",
+    "latitude": 20.973319,
+    "longitude": 42.160184,
+    "tags": [
+      "magna",
+      "id",
+      "commodo",
+      "commodo",
+      "mollit",
+      "eu",
+      "labore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Glenn Lucas"
+      },
+      {
+        "id": 1,
+        "name": "Ferguson Bruce"
+      },
+      {
+        "id": 2,
+        "name": "Shaw Bryant"
+      }
+    ],
+    "greeting": "Hello, Adkins Norris! You have 7 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 27,
+    "guid": "0f4f9679-5bec-401e-9214-0c58ddaec860",
+    "isActive": true,
+    "balance": "$3,256.24",
+    "picture": "http://placehold.it/32x32",
+    "age": 37,
+    "eyeColor": "green",
+    "name": "Lucas Witt",
+    "gender": "male",
+    "company": "DEMINIMUM",
+    "address": "263 Blake Court, Lemoyne, Marshall Islands, 7505",
+    "about": "Ad non id aliquip esse exercitation adipisicing et fugiat ea exercitation labore occaecat ea. Esse ad veniam tempor incididunt Lorem. Magna deserunt est commodo quis dolor nulla tempor. Fugiat do enim Lorem commodo. Cupidatat veniam aliqua aliqua eiusmod do deserunt tempor est eu. Nostrud reprehenderit aute occaecat ipsum eu eu reprehenderit incididunt commodo excepteur excepteur id sint. Nulla pariatur officia quis occaecat ad nulla aute.\r\n",
+    "registered": "2014-07-03T05:32:05 -02:00",
+    "latitude": -39.775538,
+    "longitude": 124.81375,
+    "tags": [
+      "nulla",
+      "ipsum",
+      "aliquip",
+      "reprehenderit",
+      "amet",
+      "excepteur",
+      "anim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Harmon Chase"
+      },
+      {
+        "id": 1,
+        "name": "Benjamin Castillo"
+      },
+      {
+        "id": 2,
+        "name": "Kate Campos"
+      }
+    ],
+    "greeting": "Hello, Lucas Witt! You have 6 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 28,
+    "guid": "0d21d082-aaf4-43a0-a291-2b1fc30a4d07",
+    "isActive": true,
+    "balance": "$2,729.57",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "green",
+    "name": "Leanna Forbes",
+    "gender": "female",
+    "company": "ACCRUEX",
+    "address": "100 Madoc Avenue, Whitmer, Palau, 6963",
+    "about": "Irure nisi proident pariatur qui exercitation. Duis pariatur consectetur ullamco eiusmod adipisicing veniam laborum reprehenderit aliquip fugiat veniam. Labore commodo officia dolor labore veniam reprehenderit laborum labore magna. Sit magna velit duis Lorem cillum ad.\r\n",
+    "registered": "2014-06-10T06:18:18 -02:00",
+    "latitude": 85.683019,
+    "longitude": 154.192477,
+    "tags": [
+      "amet",
+      "ut",
+      "esse",
+      "incididunt",
+      "incididunt",
+      "est",
+      "adipisicing"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Anne Whitaker"
+      },
+      {
+        "id": 1,
+        "name": "Campos Frye"
+      },
+      {
+        "id": 2,
+        "name": "Solomon Davis"
+      }
+    ],
+    "greeting": "Hello, Leanna Forbes! You have 9 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 29,
+    "guid": "1e6777a9-629b-4963-8aa9-a534be3ac70e",
+    "isActive": false,
+    "balance": "$3,500.71",
+    "picture": "http://placehold.it/32x32",
+    "age": 32,
+    "eyeColor": "brown",
+    "name": "Bonita May",
+    "gender": "female",
+    "company": "CUIZINE",
+    "address": "565 Lawn Court, Dexter, Pennsylvania, 6254",
+    "about": "Do aliquip tempor irure Lorem. Lorem aute exercitation Lorem elit occaecat est eu laborum laborum esse incididunt proident nisi elit. Dolor id amet ut fugiat minim Lorem ut eu consectetur ea incididunt.\r\n",
+    "registered": "2014-01-13T20:58:15 -01:00",
+    "latitude": 37.25374,
+    "longitude": -105.427169,
+    "tags": [
+      "do",
+      "id",
+      "et",
+      "voluptate",
+      "non",
+      "reprehenderit",
+      "et"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Best Gutierrez"
+      },
+      {
+        "id": 1,
+        "name": "Ebony Guzman"
+      },
+      {
+        "id": 2,
+        "name": "Helena Olsen"
+      }
+    ],
+    "greeting": "Hello, Bonita May! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 30,
+    "guid": "5976c515-a8ae-49d0-b77a-414864e1e424",
+    "isActive": true,
+    "balance": "$2,032.21",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "green",
+    "name": "Goff Wagner",
+    "gender": "male",
+    "company": "GOLISTIC",
+    "address": "309 Fillmore Place, Ilchester, Federated States Of Micronesia, 3517",
+    "about": "Incididunt aute aliqua aliqua anim elit excepteur cupidatat velit consectetur consequat enim magna. Mollit exercitation commodo ullamco elit nisi elit occaecat cupidatat tempor eu incididunt officia. Enim incididunt commodo duis exercitation amet pariatur id occaecat ad esse adipisicing amet amet. Fugiat quis proident ut do ex voluptate quis eiusmod duis magna adipisicing minim incididunt in. Adipisicing ut sint occaecat in amet excepteur esse elit. Elit deserunt sint id pariatur qui ullamco nisi qui mollit consectetur enim.\r\n",
+    "registered": "2014-04-06T08:43:16 -02:00",
+    "latitude": 11.274751,
+    "longitude": -102.837198,
+    "tags": [
+      "proident",
+      "qui",
+      "excepteur",
+      "consectetur",
+      "ex",
+      "enim",
+      "esse"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Blair Slater"
+      },
+      {
+        "id": 1,
+        "name": "Barron Clarke"
+      },
+      {
+        "id": 2,
+        "name": "Carlene Downs"
+      }
+    ],
+    "greeting": "Hello, Goff Wagner! You have 6 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 31,
+    "guid": "7c37f193-6655-40d6-b177-ba422cca5cf8",
+    "isActive": true,
+    "balance": "$1,525.95",
+    "picture": "http://placehold.it/32x32",
+    "age": 33,
+    "eyeColor": "brown",
+    "name": "Beck Wheeler",
+    "gender": "male",
+    "company": "TALKOLA",
+    "address": "508 Fleet Walk, Lynn, Ohio, 1714",
+    "about": "Anim do Lorem nostrud nostrud mollit exercitation ea eu dolor nostrud eu id aute officia. Cupidatat nulla elit labore dolor aliquip voluptate commodo officia laborum officia elit. Aute aute dolor aliquip voluptate aliquip veniam aliqua laboris sint labore enim ullamco amet. Nisi pariatur veniam nostrud dolore culpa velit amet adipisicing. Veniam duis culpa consectetur nostrud Lorem in deserunt non aliqua magna. Ullamco sunt esse ullamco nisi aliquip.\r\n",
+    "registered": "2014-03-03T20:19:26 -01:00",
+    "latitude": -27.251054,
+    "longitude": -143.224074,
+    "tags": [
+      "ipsum",
+      "officia",
+      "in",
+      "veniam",
+      "enim",
+      "dolor",
+      "dolore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Faith Dudley"
+      },
+      {
+        "id": 1,
+        "name": "Mccullough Moreno"
+      },
+      {
+        "id": 2,
+        "name": "Kendra Vinson"
+      }
+    ],
+    "greeting": "Hello, Beck Wheeler! You have 5 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 32,
+    "guid": "8bb5839f-0288-406e-81a1-cf56dff4a240",
+    "isActive": false,
+    "balance": "$2,084.46",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "green",
+    "name": "Sweeney Price",
+    "gender": "male",
+    "company": "INTERODEO",
+    "address": "752 Ruby Street, Carrizo, Puerto Rico, 9271",
+    "about": "Consectetur minim amet consectetur officia aliquip do minim aliquip enim non. Eiusmod velit laboris quis excepteur pariatur Lorem. Consectetur ut veniam laboris cillum sit mollit labore anim. Cupidatat incididunt reprehenderit aliqua aliqua dolore consectetur labore ut irure ea cupidatat. Occaecat aliqua commodo anim nostrud Lorem aute laborum. Dolor nulla in velit ut sint nostrud est aliquip reprehenderit. Laborum deserunt adipisicing ut do mollit eiusmod amet aliquip commodo sit eiusmod in sit.\r\n",
+    "registered": "2014-03-03T13:45:28 -01:00",
+    "latitude": 55.869764,
+    "longitude": -126.724059,
+    "tags": [
+      "dolore",
+      "amet",
+      "exercitation",
+      "minim",
+      "est",
+      "pariatur",
+      "minim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Guzman Obrien"
+      },
+      {
+        "id": 1,
+        "name": "Klein Hull"
+      },
+      {
+        "id": 2,
+        "name": "Carolyn Cote"
+      }
+    ],
+    "greeting": "Hello, Sweeney Price! You have 5 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 33,
+    "guid": "6c1285f6-8004-4095-adb1-d7c037ed9dbb",
+    "isActive": true,
+    "balance": "$1,767.71",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "blue",
+    "name": "Hester Hudson",
+    "gender": "female",
+    "company": "SCHOOLIO",
+    "address": "242 Stockton Street, Osage, North Dakota, 2563",
+    "about": "Velit laboris consequat occaecat nisi in dolor anim. Officia reprehenderit adipisicing veniam aliqua eu incididunt ea dolor fugiat. Incididunt enim fugiat cupidatat ex in pariatur commodo laboris eiusmod. Ea Lorem nisi ullamco anim irure voluptate sit quis mollit laborum culpa est nostrud ad.\r\n",
+    "registered": "2014-01-29T06:32:49 -01:00",
+    "latitude": -10.142657,
+    "longitude": 124.469651,
+    "tags": [
+      "id",
+      "excepteur",
+      "anim",
+      "fugiat",
+      "laboris",
+      "cillum",
+      "quis"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Ashley Ingram"
+      },
+      {
+        "id": 1,
+        "name": "Sanford Burch"
+      },
+      {
+        "id": 2,
+        "name": "Alissa Patton"
+      }
+    ],
+    "greeting": "Hello, Hester Hudson! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 34,
+    "guid": "4bbe270a-9c1f-4ade-bb8a-66f9fe8c749e",
+    "isActive": false,
+    "balance": "$3,319.98",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "blue",
+    "name": "Olivia Crawford",
+    "gender": "female",
+    "company": "GENMEX",
+    "address": "991 Sackman Street, Loomis, Alabama, 3695",
+    "about": "Nisi duis exercitation magna irure eu labore excepteur laborum eiusmod officia. Consectetur voluptate fugiat Lorem esse aute et voluptate est Lorem et consectetur ad officia in. Dolor cillum ut quis velit ex aliqua. Consectetur culpa et ea est ea aute minim aute dolore voluptate reprehenderit culpa et.\r\n",
+    "registered": "2014-05-22T00:50:41 -02:00",
+    "latitude": -56.429158,
+    "longitude": 178.492244,
+    "tags": [
+      "est",
+      "exercitation",
+      "in",
+      "velit",
+      "reprehenderit",
+      "aute",
+      "elit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Isabella Blake"
+      },
+      {
+        "id": 1,
+        "name": "Vang Joyce"
+      },
+      {
+        "id": 2,
+        "name": "Summer Decker"
+      }
+    ],
+    "greeting": "Hello, Olivia Crawford! You have 10 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 35,
+    "guid": "0ab363bf-4c03-48db-adb0-faad366c20e4",
+    "isActive": true,
+    "balance": "$2,149.37",
+    "picture": "http://placehold.it/32x32",
+    "age": 38,
+    "eyeColor": "green",
+    "name": "Mckenzie Webster",
+    "gender": "male",
+    "company": "MEDESIGN",
+    "address": "683 Rogers Avenue, Konterra, Illinois, 1618",
+    "about": "Proident ex deserunt magna proident et. Aliquip proident quis commodo dolore id. Anim magna aliqua ex exercitation aute ea veniam cillum. Proident ea mollit quis elit veniam ea eiusmod magna adipisicing deserunt laboris.\r\n",
+    "registered": "2014-06-04T06:19:10 -02:00",
+    "latitude": 28.679162,
+    "longitude": 154.902294,
+    "tags": [
+      "do",
+      "mollit",
+      "velit",
+      "pariatur",
+      "sint",
+      "enim",
+      "eu"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Singleton Beard"
+      },
+      {
+        "id": 1,
+        "name": "Alyssa Campbell"
+      },
+      {
+        "id": 2,
+        "name": "Silva Bradley"
+      }
+    ],
+    "greeting": "Hello, Mckenzie Webster! You have 3 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 36,
+    "guid": "d4808d32-dd3f-4b0a-8d26-2fb407b3be89",
+    "isActive": false,
+    "balance": "$2,093.99",
+    "picture": "http://placehold.it/32x32",
+    "age": 27,
+    "eyeColor": "brown",
+    "name": "Medina Allison",
+    "gender": "male",
+    "company": "GOGOL",
+    "address": "908 Meeker Avenue, Staples, Kentucky, 2317",
+    "about": "Et exercitation quis proident cillum exercitation ea pariatur reprehenderit fugiat. Excepteur nisi sit ex commodo consectetur aliqua laborum. Reprehenderit veniam elit duis quis anim incididunt sit incididunt cillum incididunt nisi laborum. Culpa et voluptate reprehenderit sint. Nostrud magna sint nisi deserunt aliqua. Do ex sit commodo pariatur esse magna ex laborum minim cupidatat esse ex enim.\r\n",
+    "registered": "2014-04-25T11:32:23 -02:00",
+    "latitude": 15.540005,
+    "longitude": 171.912163,
+    "tags": [
+      "exercitation",
+      "incididunt",
+      "eu",
+      "duis",
+      "ad",
+      "nisi",
+      "anim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bright Brewer"
+      },
+      {
+        "id": 1,
+        "name": "Ford Morales"
+      },
+      {
+        "id": 2,
+        "name": "Mcneil Jennings"
+      }
+    ],
+    "greeting": "Hello, Medina Allison! You have 6 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 37,
+    "guid": "3f27b5bd-fa52-4f74-a6b0-e661c76f36c5",
+    "isActive": true,
+    "balance": "$3,583.38",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "green",
+    "name": "Marie Hart",
+    "gender": "female",
+    "company": "ACCEL",
+    "address": "706 College Place, Hamilton, Virgin Islands, 427",
+    "about": "Consequat amet non ut sint reprehenderit est qui et incididunt pariatur reprehenderit. Incididunt in tempor reprehenderit labore ut cupidatat amet esse excepteur tempor. Nostrud anim incididunt anim aliquip minim non nisi nulla enim sint dolor mollit labore ut. Ea ut ipsum ea esse.\r\n",
+    "registered": "2014-04-20T04:58:55 -02:00",
+    "latitude": -52.403073,
+    "longitude": 73.448216,
+    "tags": [
+      "ex",
+      "sunt",
+      "consectetur",
+      "ea",
+      "aliqua",
+      "Lorem",
+      "magna"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Juliette Dotson"
+      },
+      {
+        "id": 1,
+        "name": "Candy Hubbard"
+      },
+      {
+        "id": 2,
+        "name": "Rene Mccullough"
+      }
+    ],
+    "greeting": "Hello, Marie Hart! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 38,
+    "guid": "6f54ed72-d1fe-48ec-87c8-2e6ad8b4616f",
+    "isActive": false,
+    "balance": "$2,713.41",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "brown",
+    "name": "Rivers Shaw",
+    "gender": "male",
+    "company": "BLEEKO",
+    "address": "185 Hyman Court, Helen, South Carolina, 4565",
+    "about": "Ex deserunt et aliquip fugiat ex proident. Enim cillum excepteur cillum nisi mollit dolor nisi sit quis duis fugiat sunt. Nostrud ullamco sunt et commodo incididunt ea aliquip ipsum. Proident pariatur laboris id quis aliquip duis eu amet aliqua.\r\n",
+    "registered": "2014-06-01T22:08:38 -02:00",
+    "latitude": -34.060426,
+    "longitude": 91.269928,
+    "tags": [
+      "dolor",
+      "consequat",
+      "labore",
+      "Lorem",
+      "reprehenderit",
+      "magna",
+      "laboris"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Alisa Bender"
+      },
+      {
+        "id": 1,
+        "name": "Audrey Nolan"
+      },
+      {
+        "id": 2,
+        "name": "Schwartz Best"
+      }
+    ],
+    "greeting": "Hello, Rivers Shaw! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 39,
+    "guid": "e6c275c7-2f38-4e88-aa71-bb160a2dab86",
+    "isActive": false,
+    "balance": "$3,228.16",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Carroll Skinner",
+    "gender": "male",
+    "company": "HATOLOGY",
+    "address": "166 Seigel Court, Movico, Hawaii, 4303",
+    "about": "Nostrud veniam pariatur id nostrud do amet qui magna non eu nulla voluptate dolore. Laborum nulla id minim dolore occaecat consequat eiusmod veniam sit quis mollit. Ullamco cillum voluptate duis sit qui ea anim sint velit et reprehenderit culpa occaecat. Dolore aute ullamco mollit laborum fugiat proident mollit irure minim incididunt esse anim. Laboris non consectetur adipisicing nisi aliquip nulla labore magna elit elit laborum quis fugiat. Dolore labore do proident aute dolore. Occaecat amet quis eiusmod in pariatur adipisicing esse.\r\n",
+    "registered": "2014-06-28T17:06:42 -02:00",
+    "latitude": 63.608522,
+    "longitude": -162.514038,
+    "tags": [
+      "nulla",
+      "ea",
+      "Lorem",
+      "reprehenderit",
+      "aliquip",
+      "esse",
+      "labore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Huber Stark"
+      },
+      {
+        "id": 1,
+        "name": "Joann Roach"
+      },
+      {
+        "id": 2,
+        "name": "Dena Frederick"
+      }
+    ],
+    "greeting": "Hello, Carroll Skinner! You have 3 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 40,
+    "guid": "896c4bcf-5c37-4383-9d24-fc6a0514d740",
+    "isActive": false,
+    "balance": "$1,460.13",
+    "picture": "http://placehold.it/32x32",
+    "age": 29,
+    "eyeColor": "brown",
+    "name": "Margo Hodge",
+    "gender": "female",
+    "company": "STUCCO",
+    "address": "875 Woodhull Street, Wolcott, Virginia, 5819",
+    "about": "Occaecat incididunt culpa commodo pariatur sint adipisicing labore dolor nisi id tempor. Et non aliqua minim amet nostrud Lorem. Duis id eiusmod dolore anim in incididunt sit enim. Labore ex Lorem laborum incididunt adipisicing dolore eu ad reprehenderit. Aliquip do sint mollit sunt. Amet sit cupidatat reprehenderit do ipsum consectetur occaecat enim aliquip labore.\r\n",
+    "registered": "2014-01-20T03:30:44 -01:00",
+    "latitude": 84.862021,
+    "longitude": -54.299052,
+    "tags": [
+      "laborum",
+      "fugiat",
+      "est",
+      "et",
+      "quis",
+      "qui",
+      "consectetur"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Bond Black"
+      },
+      {
+        "id": 1,
+        "name": "Madeline Calderon"
+      },
+      {
+        "id": 2,
+        "name": "Rosalinda Mcintyre"
+      }
+    ],
+    "greeting": "Hello, Margo Hodge! You have 3 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 41,
+    "guid": "6d8e9b06-15fe-4079-b04c-2c1db244b689",
+    "isActive": false,
+    "balance": "$1,392.09",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "green",
+    "name": "Karin Valentine",
+    "gender": "female",
+    "company": "SULTRAX",
+    "address": "237 Sedgwick Place, Greenbackville, Texas, 9939",
+    "about": "Sint quis ullamco aute ullamco pariatur non ea fugiat. Magna dolore est eiusmod culpa sit id magna occaecat. Do sit ad eu sit fugiat exercitation elit mollit cupidatat anim cupidatat deserunt. Dolor in officia do exercitation. Enim ut id ad fugiat deserunt amet nisi deserunt enim.\r\n",
+    "registered": "2014-03-30T05:25:09 -02:00",
+    "latitude": 9.262507,
+    "longitude": 117.286584,
+    "tags": [
+      "qui",
+      "eu",
+      "laborum",
+      "sint",
+      "do",
+      "nulla",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lorraine Blair"
+      },
+      {
+        "id": 1,
+        "name": "Evangeline Larsen"
+      },
+      {
+        "id": 2,
+        "name": "Lorena Clemons"
+      }
+    ],
+    "greeting": "Hello, Karin Valentine! You have 9 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 42,
+    "guid": "38619f1c-a756-4421-97e4-036135479015",
+    "isActive": false,
+    "balance": "$1,693.29",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "brown",
+    "name": "Cassie Wall",
+    "gender": "female",
+    "company": "GEEKUS",
+    "address": "354 Vanderveer Street, Caledonia, Florida, 3586",
+    "about": "Dolore deserunt irure incididunt sunt exercitation sunt veniam eu sit dolore amet qui proident. Non ex occaecat occaecat id consectetur ad. Quis non reprehenderit proident velit consequat esse ex ut.\r\n",
+    "registered": "2014-03-26T00:58:41 -01:00",
+    "latitude": -84.908385,
+    "longitude": 103.025855,
+    "tags": [
+      "reprehenderit",
+      "consectetur",
+      "qui",
+      "sit",
+      "id",
+      "cupidatat",
+      "cillum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Eleanor Levy"
+      },
+      {
+        "id": 1,
+        "name": "Lilia Hernandez"
+      },
+      {
+        "id": 2,
+        "name": "Blankenship Whitley"
+      }
+    ],
+    "greeting": "Hello, Cassie Wall! You have 2 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 43,
+    "guid": "422015df-cf61-4eb1-9f64-c879a807c99a",
+    "isActive": true,
+    "balance": "$2,961.09",
+    "picture": "http://placehold.it/32x32",
+    "age": 21,
+    "eyeColor": "brown",
+    "name": "Ethel Blankenship",
+    "gender": "female",
+    "company": "ZOARERE",
+    "address": "293 McClancy Place, Connerton, Massachusetts, 1148",
+    "about": "Qui veniam aliquip nulla sit id incididunt. Occaecat cillum et officia elit Lorem deserunt ad adipisicing. Amet ad nulla nisi proident nisi consequat et tempor ipsum est elit adipisicing duis.\r\n",
+    "registered": "2014-06-08T01:34:19 -02:00",
+    "latitude": 54.689311,
+    "longitude": -36.775522,
+    "tags": [
+      "voluptate",
+      "et",
+      "est",
+      "id",
+      "duis",
+      "pariatur",
+      "officia"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Russell Austin"
+      },
+      {
+        "id": 1,
+        "name": "Cindy Newman"
+      },
+      {
+        "id": 2,
+        "name": "Austin Rodriguez"
+      }
+    ],
+    "greeting": "Hello, Ethel Blankenship! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 44,
+    "guid": "879eaa87-d6d0-401d-93da-0dcc491dec20",
+    "isActive": false,
+    "balance": "$1,007.45",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "blue",
+    "name": "Dianne Holden",
+    "gender": "female",
+    "company": "ZILLACON",
+    "address": "159 Schenck Court, Rivers, New Jersey, 1139",
+    "about": "Nostrud excepteur velit dolor non fugiat minim veniam do amet id. Duis in velit commodo dolor eu ipsum velit. Dolore magna quis est labore dolore et magna nisi excepteur adipisicing consequat adipisicing commodo amet. Nisi nulla irure culpa proident consequat in eiusmod. Quis do laboris magna cillum ullamco velit consectetur pariatur.\r\n",
+    "registered": "2014-06-15T13:11:26 -02:00",
+    "latitude": 84.321706,
+    "longitude": 50.249891,
+    "tags": [
+      "consequat",
+      "exercitation",
+      "anim",
+      "officia",
+      "sunt",
+      "veniam",
+      "dolor"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Rosetta Dunn"
+      },
+      {
+        "id": 1,
+        "name": "Elena Mendoza"
+      },
+      {
+        "id": 2,
+        "name": "Hawkins Hunt"
+      }
+    ],
+    "greeting": "Hello, Dianne Holden! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 45,
+    "guid": "1ccb20cc-9c68-4e16-9718-1b0545da9627",
+    "isActive": false,
+    "balance": "$2,734.76",
+    "picture": "http://placehold.it/32x32",
+    "age": 28,
+    "eyeColor": "green",
+    "name": "Sue Dunlap",
+    "gender": "female",
+    "company": "ENDIPINE",
+    "address": "598 Homecrest Avenue, Cassel, Rhode Island, 472",
+    "about": "Deserunt excepteur commodo cupidatat enim. Pariatur culpa amet fugiat esse adipisicing ea velit officia dolore dolore aliquip fugiat. Nostrud culpa duis ea dolor cupidatat ex pariatur aliquip labore aute.\r\n",
+    "registered": "2014-04-16T17:03:05 -02:00",
+    "latitude": 43.41206,
+    "longitude": -11.203221,
+    "tags": [
+      "tempor",
+      "ea",
+      "nostrud",
+      "voluptate",
+      "enim",
+      "deserunt",
+      "occaecat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Tricia Acosta"
+      },
+      {
+        "id": 1,
+        "name": "Delores Carson"
+      },
+      {
+        "id": 2,
+        "name": "Cooper Lloyd"
+      }
+    ],
+    "greeting": "Hello, Sue Dunlap! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 46,
+    "guid": "c10ebebb-0fde-4db5-ae42-ba033def4496",
+    "isActive": true,
+    "balance": "$2,543.38",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "blue",
+    "name": "Lisa Noble",
+    "gender": "female",
+    "company": "ZEAM",
+    "address": "828 Preston Court, Jacumba, Utah, 2163",
+    "about": "Laborum laborum occaecat ipsum quis eiusmod laborum ex incididunt eiusmod aute deserunt. Lorem exercitation reprehenderit dolore minim cillum veniam. Ex deserunt eiusmod adipisicing sit anim ex incididunt amet. Lorem labore cupidatat voluptate elit non ullamco veniam ad anim fugiat duis. Est esse nisi labore nisi nulla non elit enim qui eu veniam cillum. Lorem sit veniam laboris magna velit. Ut id nisi eu occaecat excepteur ullamco sint in aliquip excepteur deserunt ullamco do proident.\r\n",
+    "registered": "2014-02-26T22:35:07 -01:00",
+    "latitude": -64.554206,
+    "longitude": -140.668077,
+    "tags": [
+      "eu",
+      "occaecat",
+      "ipsum",
+      "reprehenderit",
+      "occaecat",
+      "officia",
+      "culpa"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Nelda Petersen"
+      },
+      {
+        "id": 1,
+        "name": "Roseann Dominguez"
+      },
+      {
+        "id": 2,
+        "name": "Estelle Duffy"
+      }
+    ],
+    "greeting": "Hello, Lisa Noble! You have 10 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 47,
+    "guid": "98bf2a04-1d75-476e-bb11-8678ca8dfd60",
+    "isActive": true,
+    "balance": "$2,386.50",
+    "picture": "http://placehold.it/32x32",
+    "age": 24,
+    "eyeColor": "green",
+    "name": "Lorna Pace",
+    "gender": "female",
+    "company": "KOZGENE",
+    "address": "263 Wyona Street, Mathews, Indiana, 1038",
+    "about": "Minim dolore in elit nostrud officia fugiat ipsum non. Adipisicing voluptate non dolor ea Lorem exercitation minim pariatur ad veniam voluptate laborum. Id in cillum adipisicing eiusmod ad non nisi officia amet proident aliquip. Cillum labore duis labore elit commodo reprehenderit id fugiat do. Eu non consectetur mollit minim et tempor enim consequat amet aliqua.\r\n",
+    "registered": "2014-05-19T09:58:30 -02:00",
+    "latitude": 12.905025,
+    "longitude": 43.642016,
+    "tags": [
+      "magna",
+      "deserunt",
+      "consequat",
+      "consequat",
+      "ea",
+      "nostrud",
+      "reprehenderit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lorie Potter"
+      },
+      {
+        "id": 1,
+        "name": "Felecia Lowe"
+      },
+      {
+        "id": 2,
+        "name": "Johnnie Barron"
+      }
+    ],
+    "greeting": "Hello, Lorna Pace! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 48,
+    "guid": "917a9831-47f3-42b9-a4f2-dfbe65b58138",
+    "isActive": true,
+    "balance": "$2,192.35",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "blue",
+    "name": "June Thomas",
+    "gender": "female",
+    "company": "REMOLD",
+    "address": "522 Wakeman Place, Diaperville, Wyoming, 2277",
+    "about": "Nostrud eiusmod veniam do esse ullamco officia excepteur eiusmod excepteur cupidatat non consectetur aute anim. Eu reprehenderit ullamco sint eiusmod ipsum ut mollit nisi consequat id cillum. Sunt nisi ullamco nulla est. Sit non velit esse ullamco ex laboris cupidatat mollit. Commodo nostrud est fugiat duis veniam nulla adipisicing cupidatat nostrud. Consectetur do culpa deserunt excepteur culpa irure eiusmod qui deserunt minim duis qui. Dolor nostrud cupidatat ullamco minim nostrud irure ad nostrud.\r\n",
+    "registered": "2014-07-03T14:39:07 -02:00",
+    "latitude": 5.921333,
+    "longitude": 50.290757,
+    "tags": [
+      "duis",
+      "sit",
+      "labore",
+      "occaecat",
+      "occaecat",
+      "officia",
+      "est"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Salazar Miles"
+      },
+      {
+        "id": 1,
+        "name": "Gilmore Sanford"
+      },
+      {
+        "id": 2,
+        "name": "Kidd Winters"
+      }
+    ],
+    "greeting": "Hello, June Thomas! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 49,
+    "guid": "38eb16a4-a22d-4c91-964c-1e837f9f93e0",
+    "isActive": false,
+    "balance": "$1,832.55",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "brown",
+    "name": "Karina Farmer",
+    "gender": "female",
+    "company": "HIVEDOM",
+    "address": "960 Seeley Street, Chilton, Oklahoma, 8105",
+    "about": "Reprehenderit nostrud ipsum ut minim nostrud nostrud. Officia labore ex dolor aute Lorem reprehenderit quis ut adipisicing do. Commodo nostrud est esse aute cupidatat sunt do. Qui nulla fugiat laboris sunt irure nostrud do. Aliqua aliquip velit reprehenderit duis dolor id amet adipisicing amet laborum culpa. Incididunt pariatur eu cillum deserunt. Esse qui aliqua labore magna.\r\n",
+    "registered": "2014-05-28T19:56:58 -02:00",
+    "latitude": 55.339619,
+    "longitude": -13.026128,
+    "tags": [
+      "esse",
+      "commodo",
+      "id",
+      "eu",
+      "sint",
+      "eiusmod",
+      "Lorem"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Leanne Blanchard"
+      },
+      {
+        "id": 1,
+        "name": "Hewitt Pope"
+      },
+      {
+        "id": 2,
+        "name": "Tania Whitehead"
+      }
+    ],
+    "greeting": "Hello, Karina Farmer! You have 3 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 50,
+    "guid": "727c20b3-f9e2-42e2-870c-68690e08faf9",
+    "isActive": false,
+    "balance": "$3,492.61",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "brown",
+    "name": "Lowe Oconnor",
+    "gender": "male",
+    "company": "EXTREMO",
+    "address": "314 Hornell Loop, Fivepointville, New Mexico, 5677",
+    "about": "Labore duis nostrud culpa anim minim proident culpa adipisicing nostrud laboris. Sunt fugiat incididunt cillum veniam reprehenderit do sunt cillum culpa velit dolore aute. Eu est nisi do ullamco ut laborum culpa ut.\r\n",
+    "registered": "2014-06-29T12:30:34 -02:00",
+    "latitude": -53.458212,
+    "longitude": 86.662897,
+    "tags": [
+      "duis",
+      "labore",
+      "nulla",
+      "velit",
+      "consequat",
+      "duis",
+      "culpa"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Miriam Barrett"
+      },
+      {
+        "id": 1,
+        "name": "Mariana Foster"
+      },
+      {
+        "id": 2,
+        "name": "Bell Boyle"
+      }
+    ],
+    "greeting": "Hello, Lowe Oconnor! You have 9 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 51,
+    "guid": "104a877b-ca13-4a61-b37b-7a6c71c8ccf2",
+    "isActive": true,
+    "balance": "$3,195.23",
+    "picture": "http://placehold.it/32x32",
+    "age": 25,
+    "eyeColor": "brown",
+    "name": "Dawson Huff",
+    "gender": "male",
+    "company": "PIGZART",
+    "address": "594 Bainbridge Street, Lutsen, Idaho, 8565",
+    "about": "Ad occaecat anim mollit officia veniam. Et labore occaecat commodo ullamco occaecat ea irure veniam. Sunt non tempor cillum eiusmod nulla aliquip sunt cillum cillum magna ex in sunt. Ipsum proident laboris occaecat sunt ullamco incididunt esse sint cupidatat sit aliquip magna enim duis.\r\n",
+    "registered": "2014-01-16T01:43:16 -01:00",
+    "latitude": 70.453632,
+    "longitude": 47.933963,
+    "tags": [
+      "officia",
+      "minim",
+      "cupidatat",
+      "mollit",
+      "sit",
+      "aliquip",
+      "laborum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Sherrie Burton"
+      },
+      {
+        "id": 1,
+        "name": "Catherine Heath"
+      },
+      {
+        "id": 2,
+        "name": "Wiggins Simon"
+      }
+    ],
+    "greeting": "Hello, Dawson Huff! You have 4 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 52,
+    "guid": "dabbe950-4329-4d0d-8b4a-6347c6c78819",
+    "isActive": true,
+    "balance": "$2,642.41",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Stanley Battle",
+    "gender": "male",
+    "company": "KNOWLYSIS",
+    "address": "387 Seigel Street, Soudan, New Hampshire, 3260",
+    "about": "Laboris ad velit Lorem consectetur. Dolor commodo qui excepteur consectetur ullamco ex eiusmod fugiat sit voluptate. Consectetur voluptate tempor irure veniam exercitation. Reprehenderit consequat consequat elit magna duis mollit ea aute velit ut Lorem. Officia nulla in eu esse.\r\n",
+    "registered": "2014-04-10T22:58:50 -02:00",
+    "latitude": 15.553241,
+    "longitude": -54.014355,
+    "tags": [
+      "nostrud",
+      "adipisicing",
+      "ea",
+      "ipsum",
+      "non",
+      "sit",
+      "qui"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Foley Browning"
+      },
+      {
+        "id": 1,
+        "name": "Tanya Carter"
+      },
+      {
+        "id": 2,
+        "name": "Cristina Franks"
+      }
+    ],
+    "greeting": "Hello, Stanley Battle! You have 3 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 53,
+    "guid": "ce404d5c-c220-4f5f-a24b-5c7e2f977695",
+    "isActive": false,
+    "balance": "$1,170.32",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "blue",
+    "name": "Simon Dejesus",
+    "gender": "male",
+    "company": "ZORROMOP",
+    "address": "313 Vandalia Avenue, Riegelwood, Montana, 6891",
+    "about": "Nulla officia reprehenderit aute commodo aliqua consequat. Lorem sunt labore minim enim non velit ut veniam pariatur. Sunt laboris culpa quis nostrud consectetur elit non. Adipisicing sunt nulla id sint excepteur. Sit non velit irure anim ipsum ipsum sit id aliquip do dolor est.\r\n",
+    "registered": "2014-03-15T20:38:08 -01:00",
+    "latitude": 53.159309,
+    "longitude": 168.193975,
+    "tags": [
+      "occaecat",
+      "est",
+      "aliquip",
+      "consequat",
+      "ullamco",
+      "commodo",
+      "fugiat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Fuller Vega"
+      },
+      {
+        "id": 1,
+        "name": "Murphy Cline"
+      },
+      {
+        "id": 2,
+        "name": "Valenzuela Gibson"
+      }
+    ],
+    "greeting": "Hello, Simon Dejesus! You have 5 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 54,
+    "guid": "6a89ea8d-e467-4f86-b969-1d60dfc910ad",
+    "isActive": true,
+    "balance": "$2,274.00",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "blue",
+    "name": "Kathie Buchanan",
+    "gender": "female",
+    "company": "CAPSCREEN",
+    "address": "421 Erasmus Street, Terlingua, South Dakota, 1633",
+    "about": "Quis laborum elit Lorem velit mollit quis laborum ex minim incididunt ut voluptate. Et proident ullamco sit fugiat voluptate incididunt incididunt aute ullamco eu amet veniam velit. Consectetur ad veniam laboris ipsum sunt dolor. Et esse amet consectetur laborum ullamco ad. Eu sunt mollit et Lorem officia incididunt occaecat dolore eiusmod ullamco quis ex pariatur. Exercitation exercitation amet tempor do labore aliqua aliqua cillum voluptate aliquip consequat pariatur commodo.\r\n",
+    "registered": "2014-05-27T07:01:26 -02:00",
+    "latitude": 58.409325,
+    "longitude": -112.833935,
+    "tags": [
+      "eu",
+      "consectetur",
+      "dolor",
+      "Lorem",
+      "sunt",
+      "velit",
+      "adipisicing"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Stephens Hardy"
+      },
+      {
+        "id": 1,
+        "name": "Ernestine Garza"
+      },
+      {
+        "id": 2,
+        "name": "Byrd Tate"
+      }
+    ],
+    "greeting": "Hello, Kathie Buchanan! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 55,
+    "guid": "5211dbae-79fe-47fa-afc9-9e8d9bffa363",
+    "isActive": false,
+    "balance": "$2,061.63",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "brown",
+    "name": "Terrell Moon",
+    "gender": "male",
+    "company": "JUNIPOOR",
+    "address": "177 Waldorf Court, Munjor, New York, 2032",
+    "about": "Non sit eu eiusmod occaecat anim ipsum incididunt dolor. Lorem enim dolore id ut est pariatur sit commodo minim exercitation qui sint. Deserunt exercitation do non sit veniam commodo anim sit enim dolore dolore laborum labore. Fugiat excepteur nisi excepteur nostrud aliquip eu exercitation eiusmod laboris sunt.\r\n",
+    "registered": "2014-07-04T17:41:24 -02:00",
+    "latitude": 88.790349,
+    "longitude": -66.724457,
+    "tags": [
+      "tempor",
+      "occaecat",
+      "amet",
+      "est",
+      "non",
+      "pariatur",
+      "occaecat"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Shari Howe"
+      },
+      {
+        "id": 1,
+        "name": "Kristina Pugh"
+      },
+      {
+        "id": 2,
+        "name": "Bonnie Dodson"
+      }
+    ],
+    "greeting": "Hello, Terrell Moon! You have 2 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 56,
+    "guid": "4d58f552-95bb-470b-b496-0c8d85ffee3d",
+    "isActive": true,
+    "balance": "$1,681.61",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "blue",
+    "name": "Madge Powers",
+    "gender": "female",
+    "company": "GEOLOGIX",
+    "address": "221 Columbia Street, Gilmore, Georgia, 1451",
+    "about": "Lorem mollit consectetur dolore cillum sunt minim fugiat aliqua ex irure commodo ad. Culpa incididunt deserunt enim cupidatat sunt fugiat quis velit proident. Occaecat sit aliqua est incididunt velit laborum duis consequat est. Dolor aliquip quis et dolor cillum deserunt quis nisi exercitation aute incididunt adipisicing. Adipisicing nisi dolore adipisicing culpa dolor amet adipisicing fugiat anim. Voluptate nostrud laboris consequat cupidatat irure sunt. Et reprehenderit et officia reprehenderit.\r\n",
+    "registered": "2014-04-30T21:19:21 -02:00",
+    "latitude": -1.944055,
+    "longitude": -82.153837,
+    "tags": [
+      "ipsum",
+      "reprehenderit",
+      "et",
+      "quis",
+      "mollit",
+      "deserunt",
+      "dolore"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Carter Mcgowan"
+      },
+      {
+        "id": 1,
+        "name": "Hunter Kirk"
+      },
+      {
+        "id": 2,
+        "name": "Eloise Henson"
+      }
+    ],
+    "greeting": "Hello, Madge Powers! You have 4 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 57,
+    "guid": "f92640b6-4c03-43ba-9c4e-3ecb93074f0a",
+    "isActive": true,
+    "balance": "$3,872.97",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "green",
+    "name": "Franklin Haynes",
+    "gender": "male",
+    "company": "COMTRACT",
+    "address": "826 Belvidere Street, Kansas, Oregon, 1864",
+    "about": "Deserunt voluptate eu do minim. Laboris duis incididunt nostrud laboris in nisi aute. In eiusmod irure consectetur in culpa Lorem labore nulla dolore nisi voluptate deserunt pariatur. Duis ullamco ad mollit voluptate magna nulla Lorem ullamco incididunt. Laboris velit exercitation tempor commodo officia dolore est nulla fugiat occaecat. Nostrud deserunt consectetur Lorem fugiat Lorem irure.\r\n",
+    "registered": "2014-06-14T14:34:37 -02:00",
+    "latitude": 20.753273,
+    "longitude": 14.015592,
+    "tags": [
+      "ut",
+      "fugiat",
+      "eiusmod",
+      "dolore",
+      "sit",
+      "in",
+      "esse"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Fowler Sweeney"
+      },
+      {
+        "id": 1,
+        "name": "Cherry Drake"
+      },
+      {
+        "id": 2,
+        "name": "Reilly Valenzuela"
+      }
+    ],
+    "greeting": "Hello, Franklin Haynes! You have 1 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 58,
+    "guid": "9d4cc0cb-1ab7-42c6-88ad-47343d92373e",
+    "isActive": true,
+    "balance": "$3,619.36",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Wilma Hancock",
+    "gender": "female",
+    "company": "AMTAP",
+    "address": "722 Hutchinson Court, Logan, Louisiana, 2832",
+    "about": "Consequat enim occaecat eu ad deserunt elit irure nulla velit deserunt do. Consectetur ut ea esse Lorem eiusmod deserunt id amet sit cillum anim. Do laborum enim incididunt quis duis occaecat aliqua elit anim labore irure tempor eu. Consequat proident nisi do ullamco officia officia mollit officia minim. Consequat cillum sunt est consectetur in incididunt cillum elit eu et.\r\n",
+    "registered": "2014-05-18T03:52:17 -02:00",
+    "latitude": 37.850872,
+    "longitude": -116.495446,
+    "tags": [
+      "et",
+      "officia",
+      "elit",
+      "officia",
+      "pariatur",
+      "fugiat",
+      "ipsum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Rogers Wise"
+      },
+      {
+        "id": 1,
+        "name": "Mclean Russell"
+      },
+      {
+        "id": 2,
+        "name": "Jodi Hayes"
+      }
+    ],
+    "greeting": "Hello, Wilma Hancock! You have 2 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 59,
+    "guid": "d0d76369-0bb1-4abf-8bb2-55e8e883d022",
+    "isActive": false,
+    "balance": "$1,980.73",
+    "picture": "http://placehold.it/32x32",
+    "age": 31,
+    "eyeColor": "green",
+    "name": "Julia Mcneil",
+    "gender": "female",
+    "company": "ZILLIDIUM",
+    "address": "840 Roebling Street, Shawmut, Missouri, 5915",
+    "about": "Est consequat velit sint incididunt ullamco labore eu sint laborum nisi commodo. Proident nostrud aliqua minim in officia dolore. Exercitation cillum mollit aute nostrud aliqua quis eiusmod commodo est veniam. In cillum mollit amet nisi velit deserunt nostrud consectetur.\r\n",
+    "registered": "2014-05-23T05:45:31 -02:00",
+    "latitude": -78.799731,
+    "longitude": 171.839554,
+    "tags": [
+      "nisi",
+      "tempor",
+      "duis",
+      "ullamco",
+      "commodo",
+      "ea",
+      "elit"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Cheri Finley"
+      },
+      {
+        "id": 1,
+        "name": "Tracey Reid"
+      },
+      {
+        "id": 2,
+        "name": "Johanna Holmes"
+      }
+    ],
+    "greeting": "Hello, Julia Mcneil! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 60,
+    "guid": "46796ff9-ba41-4112-84d9-8ede6c16b0e0",
+    "isActive": false,
+    "balance": "$3,807.45",
+    "picture": "http://placehold.it/32x32",
+    "age": 20,
+    "eyeColor": "blue",
+    "name": "Petersen Little",
+    "gender": "male",
+    "company": "ISOLOGICS",
+    "address": "529 Crawford Avenue, Talpa, Arkansas, 8482",
+    "about": "Ipsum sint laborum do ad laboris duis. Et nisi non dolor sunt minim ut irure ad deserunt sunt. Veniam commodo aliquip esse laborum est culpa laboris proident sint labore Lorem do. Aliqua minim consectetur duis occaecat.\r\n",
+    "registered": "2014-04-29T07:18:35 -02:00",
+    "latitude": -61.488678,
+    "longitude": -47.406844,
+    "tags": [
+      "ad",
+      "aute",
+      "veniam",
+      "minim",
+      "aliquip",
+      "nostrud",
+      "enim"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Shannon Mcmillan"
+      },
+      {
+        "id": 1,
+        "name": "Weber Molina"
+      },
+      {
+        "id": 2,
+        "name": "Coleen Harrell"
+      }
+    ],
+    "greeting": "Hello, Petersen Little! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 61,
+    "guid": "3b4ec54b-578a-4365-9b20-afd4889e790c",
+    "isActive": false,
+    "balance": "$3,426.02",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Vasquez Conway",
+    "gender": "male",
+    "company": "APEX",
+    "address": "893 Conway Street, Maplewood, California, 2073",
+    "about": "Cillum occaecat ullamco proident qui irure est eu excepteur adipisicing. Duis exercitation veniam officia in nostrud adipisicing nisi quis officia. Anim ex qui Lorem ipsum consequat consequat. Voluptate nisi cupidatat commodo non incididunt cillum irure ea nulla reprehenderit occaecat do pariatur. Officia commodo adipisicing esse sint officia eu deserunt adipisicing enim sint duis pariatur. Mollit fugiat esse aliqua Lorem ipsum do elit adipisicing sunt qui elit ullamco. Mollit sunt tempor sit commodo Lorem nisi sit.\r\n",
+    "registered": "2014-06-12T17:53:51 -02:00",
+    "latitude": -26.144058,
+    "longitude": 42.793761,
+    "tags": [
+      "magna",
+      "ullamco",
+      "ad",
+      "ad",
+      "duis",
+      "elit",
+      "aute"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Alexander Cantrell"
+      },
+      {
+        "id": 1,
+        "name": "Roberson Jenkins"
+      },
+      {
+        "id": 2,
+        "name": "Mckay Simpson"
+      }
+    ],
+    "greeting": "Hello, Vasquez Conway! You have 8 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 62,
+    "guid": "bb44a2c9-f738-40f0-9735-d2e54e5c1bd8",
+    "isActive": false,
+    "balance": "$1,646.99",
+    "picture": "http://placehold.it/32x32",
+    "age": 35,
+    "eyeColor": "green",
+    "name": "Corina Dawson",
+    "gender": "female",
+    "company": "ORBALIX",
+    "address": "373 Sumpter Street, Osmond, Kansas, 2807",
+    "about": "Eiusmod nulla cillum excepteur quis cupidatat dolor non et et proident veniam. Tempor quis labore do veniam culpa id. Do commodo exercitation tempor nulla sit adipisicing veniam pariatur sit elit consectetur minim dolor. Excepteur ullamco fugiat Lorem eiusmod velit ipsum elit. Consequat amet sit reprehenderit minim tempor et pariatur nulla aliqua aliquip eiusmod.\r\n",
+    "registered": "2014-03-05T14:11:03 -01:00",
+    "latitude": -29.003709,
+    "longitude": -102.5479,
+    "tags": [
+      "do",
+      "adipisicing",
+      "fugiat",
+      "fugiat",
+      "tempor",
+      "deserunt",
+      "magna"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Berger Weaver"
+      },
+      {
+        "id": 1,
+        "name": "Sherman Donaldson"
+      },
+      {
+        "id": 2,
+        "name": "Marlene Fletcher"
+      }
+    ],
+    "greeting": "Hello, Corina Dawson! You have 5 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 63,
+    "guid": "02f59ed2-478c-462d-ae39-4c2dc54302bf",
+    "isActive": true,
+    "balance": "$1,643.57",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "blue",
+    "name": "Santiago Watkins",
+    "gender": "male",
+    "company": "EARTHPURE",
+    "address": "669 Marconi Place, Martinez, Maine, 4435",
+    "about": "Irure excepteur adipisicing velit et nostrud id. Amet in do eiusmod nisi. Mollit non do et commodo aute commodo tempor.\r\n",
+    "registered": "2014-01-23T23:05:14 -01:00",
+    "latitude": 33.768471,
+    "longitude": -37.890824,
+    "tags": [
+      "esse",
+      "mollit",
+      "ea",
+      "commodo",
+      "proident",
+      "est",
+      "irure"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Frances Mcdaniel"
+      },
+      {
+        "id": 1,
+        "name": "Travis Kennedy"
+      },
+      {
+        "id": 2,
+        "name": "Wolf Hicks"
+      }
+    ],
+    "greeting": "Hello, Santiago Watkins! You have 3 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 64,
+    "guid": "ee9814aa-b2fd-48ab-80f3-8ecb50dccd6a",
+    "isActive": false,
+    "balance": "$1,623.55",
+    "picture": "http://placehold.it/32x32",
+    "age": 39,
+    "eyeColor": "green",
+    "name": "Sophia Perez",
+    "gender": "female",
+    "company": "COMSTRUCT",
+    "address": "147 Lott Avenue, Lisco, Northern Mariana Islands, 7673",
+    "about": "Lorem occaecat non cillum ea consectetur occaecat. Id officia elit sit aliquip ad consectetur. Labore officia amet do mollit amet exercitation nostrud veniam consectetur amet et deserunt voluptate. Qui anim amet deserunt fugiat nulla nulla exercitation ad enim duis. In proident sit ullamco aliqua ullamco nostrud amet labore cillum eu ex.\r\n",
+    "registered": "2014-05-24T01:37:33 -02:00",
+    "latitude": -39.951198,
+    "longitude": 159.105686,
+    "tags": [
+      "ex",
+      "incididunt",
+      "occaecat",
+      "labore",
+      "tempor",
+      "deserunt",
+      "sunt"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Suzette Schroeder"
+      },
+      {
+        "id": 1,
+        "name": "Dawn Mcpherson"
+      },
+      {
+        "id": 2,
+        "name": "Holloway Shields"
+      }
+    ],
+    "greeting": "Hello, Sophia Perez! You have 1 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 65,
+    "guid": "d6e8b50e-1795-4cf6-92a5-60f109d9357c",
+    "isActive": false,
+    "balance": "$3,260.19",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "brown",
+    "name": "Hoffman Petty",
+    "gender": "male",
+    "company": "EQUITOX",
+    "address": "913 Harden Street, Nogal, Guam, 9010",
+    "about": "Culpa ea deserunt quis minim mollit esse do amet elit. Culpa dolor commodo nostrud in pariatur exercitation aliqua commodo. Magna laborum ea deserunt consectetur occaecat adipisicing eiusmod. Reprehenderit laboris sit id anim minim duis id ullamco et tempor ullamco eu ex. Eu minim dolor qui ipsum culpa ullamco dolor eu cillum.\r\n",
+    "registered": "2014-04-14T03:03:39 -02:00",
+    "latitude": 62.974089,
+    "longitude": 9.8346,
+    "tags": [
+      "quis",
+      "sit",
+      "labore",
+      "exercitation",
+      "eu",
+      "est",
+      "cillum"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lydia Rosario"
+      },
+      {
+        "id": 1,
+        "name": "Kristen Smith"
+      },
+      {
+        "id": 2,
+        "name": "Leonor Kelley"
+      }
+    ],
+    "greeting": "Hello, Hoffman Petty! You have 3 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 66,
+    "guid": "533759a6-e7ca-4ce4-aa26-1c4da8ff04b4",
+    "isActive": false,
+    "balance": "$2,221.61",
+    "picture": "http://placehold.it/32x32",
+    "age": 34,
+    "eyeColor": "blue",
+    "name": "Flossie Hess",
+    "gender": "female",
+    "company": "FUTURIZE",
+    "address": "742 Glenwood Road, Salix, North Carolina, 3521",
+    "about": "Velit eu consectetur laborum do labore aute anim. Sunt excepteur mollit incididunt fugiat. Quis eiusmod magna ex ut ipsum. Veniam ea sunt exercitation dolore duis excepteur enim reprehenderit. Enim mollit laboris aute aute duis Lorem incididunt sint aute ex. Voluptate cupidatat exercitation laborum velit cillum culpa cupidatat ea eu adipisicing dolore cillum eu.\r\n",
+    "registered": "2014-01-25T12:21:02 -01:00",
+    "latitude": 1.79303,
+    "longitude": -61.276386,
+    "tags": [
+      "anim",
+      "tempor",
+      "proident",
+      "ullamco",
+      "velit",
+      "elit",
+      "ea"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Cruz Small"
+      },
+      {
+        "id": 1,
+        "name": "Josephine Sloan"
+      },
+      {
+        "id": 2,
+        "name": "Hill Garner"
+      }
+    ],
+    "greeting": "Hello, Flossie Hess! You have 6 unread messages.",
+    "favoriteFruit": "strawberry"
+  },
+  {
+    "id": 67,
+    "guid": "d27ff68d-841f-467b-bd82-6b336a0ff88a",
+    "isActive": false,
+    "balance": "$1,982.67",
+    "picture": "http://placehold.it/32x32",
+    "age": 26,
+    "eyeColor": "green",
+    "name": "Freida Ellis",
+    "gender": "female",
+    "company": "ETERNIS",
+    "address": "789 Henderson Walk, Trona, West Virginia, 6599",
+    "about": "In culpa sint cillum aliqua fugiat irure ad id. Nisi non anim cupidatat culpa exercitation qui amet occaecat dolor. Ipsum culpa laboris cillum labore culpa in non et occaecat veniam anim nostrud laborum.\r\n",
+    "registered": "2014-05-28T06:12:59 -02:00",
+    "latitude": 46.401584,
+    "longitude": -118.750813,
+    "tags": [
+      "aute",
+      "voluptate",
+      "commodo",
+      "aute",
+      "aute",
+      "laborum",
+      "dolor"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Lucia Leach"
+      },
+      {
+        "id": 1,
+        "name": "Howard Armstrong"
+      },
+      {
+        "id": 2,
+        "name": "Stout Silva"
+      }
+    ],
+    "greeting": "Hello, Freida Ellis! You have 7 unread messages.",
+    "favoriteFruit": "apple"
+  },
+  {
+    "id": 68,
+    "guid": "0865b52c-f419-42f4-ba28-e90ce766bb5f",
+    "isActive": true,
+    "balance": "$2,041.38",
+    "picture": "http://placehold.it/32x32",
+    "age": 22,
+    "eyeColor": "green",
+    "name": "Slater Pate",
+    "gender": "male",
+    "company": "EVENTIX",
+    "address": "129 He

<TRUNCATED>

[13/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/medium_11kb.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/medium_11kb.json b/fleece-core/src/test/resources/bench/medium_11kb.json
deleted file mode 100644
index ba8aafd..0000000
--- a/fleece-core/src/test/resources/bench/medium_11kb.json
+++ /dev/null
@@ -1,443 +0,0 @@
-{
-	"special-0":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 0":"\u5656",
-	"bigdecimal0":7817265.00000111,
-	"bigdecimal-2-0":127655512123456.761009E-123,
-	"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int0":4561,
-	"ints0":0,
-	"false0":false,
-	"nil0":false,
-	"n0":      null                ,
-	"obj0":
-		{
-			"special-0":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 0":"\u5656",
-	"bigdecimal0":7817265.00000111,
-			"bigdecimal-2-0":127655512123456.761009E-123,
-			"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int0":4561,
-			"ints0":0,
-			"false0":false,
-			"nil0":false,
-			"obj0":      null                ,
-			"obj0":
-				[    true    ,
-				{
-				"special-0":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 0":"\u5656",
-				"bigdecimal0":7817265.00000111,
-				"bigdecimal-2-0":127655512123456.761009E-123,
-				"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int0":4561,
-				"ints0":0,
-				"false0":false,
-				"nil0":false,
-				"obj0":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-1":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 1":"\u5656",
-	"bigdecimal1":7817265.00000111,
-	"bigdecimal-2-1":127655512123456.761009E-123,
-	"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int1":4561,
-	"ints1":0,
-	"false1":false,
-	"nil1":false,
-	"n1":      null                ,
-	"obj1":
-		{
-			"special-1":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 1":"\u5656",
-	"bigdecimal1":7817265.00000111,
-			"bigdecimal-2-1":127655512123456.761009E-123,
-			"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int1":4561,
-			"ints1":0,
-			"false1":false,
-			"nil1":false,
-			"obj1":      null                ,
-			"obj1":
-				[    true    ,
-				{
-				"special-1":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 1":"\u5656",
-				"bigdecimal1":7817265.00000111,
-				"bigdecimal-2-1":127655512123456.761009E-123,
-				"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int1":4561,
-				"ints1":0,
-				"false1":false,
-				"nil1":false,
-				"obj1":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-2":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 2":"\u5656",
-	"bigdecimal2":7817265.00000111,
-	"bigdecimal-2-2":127655512123456.761009E-123,
-	"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int2":4561,
-	"ints2":0,
-	"false2":false,
-	"nil2":false,
-	"n2":      null                ,
-	"obj2":
-		{
-			"special-2":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 2":"\u5656",
-	"bigdecimal2":7817265.00000111,
-			"bigdecimal-2-2":127655512123456.761009E-123,
-			"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int2":4561,
-			"ints2":0,
-			"false2":false,
-			"nil2":false,
-			"obj2":      null                ,
-			"obj2":
-				[    true    ,
-				{
-				"special-2":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 2":"\u5656",
-				"bigdecimal2":7817265.00000111,
-				"bigdecimal-2-2":127655512123456.761009E-123,
-				"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int2":4561,
-				"ints2":0,
-				"false2":false,
-				"nil2":false,
-				"obj2":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-3":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 3":"\u5656",
-	"bigdecimal3":7817265.00000111,
-	"bigdecimal-2-3":127655512123456.761009E-123,
-	"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int3":4561,
-	"ints3":0,
-	"false3":false,
-	"nil3":false,
-	"n3":      null                ,
-	"obj3":
-		{
-			"special-3":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 3":"\u5656",
-	"bigdecimal3":7817265.00000111,
-			"bigdecimal-2-3":127655512123456.761009E-123,
-			"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int3":4561,
-			"ints3":0,
-			"false3":false,
-			"nil3":false,
-			"obj3":      null                ,
-			"obj3":
-				[    true    ,
-				{
-				"special-3":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 3":"\u5656",
-				"bigdecimal3":7817265.00000111,
-				"bigdecimal-2-3":127655512123456.761009E-123,
-				"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int3":4561,
-				"ints3":0,
-				"false3":false,
-				"nil3":false,
-				"obj3":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-4":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 4":"\u5656",
-	"bigdecimal4":7817265.00000111,
-	"bigdecimal-2-4":127655512123456.761009E-123,
-	"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int4":4561,
-	"ints4":0,
-	"false4":false,
-	"nil4":false,
-	"n4":      null                ,
-	"obj4":
-		{
-			"special-4":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 4":"\u5656",
-	"bigdecimal4":7817265.00000111,
-			"bigdecimal-2-4":127655512123456.761009E-123,
-			"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int4":4561,
-			"ints4":0,
-			"false4":false,
-			"nil4":false,
-			"obj4":      null                ,
-			"obj4":
-				[    true    ,
-				{
-				"special-4":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 4":"\u5656",
-				"bigdecimal4":7817265.00000111,
-				"bigdecimal-2-4":127655512123456.761009E-123,
-				"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int4":4561,
-				"ints4":0,
-				"false4":false,
-				"nil4":false,
-				"obj4":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-5":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 5":"\u5656",
-	"bigdecimal5":7817265.00000111,
-	"bigdecimal-2-5":127655512123456.761009E-123,
-	"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int5":4561,
-	"ints5":0,
-	"false5":false,
-	"nil5":false,
-	"n5":      null                ,
-	"obj5":
-		{
-			"special-5":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 5":"\u5656",
-	"bigdecimal5":7817265.00000111,
-			"bigdecimal-2-5":127655512123456.761009E-123,
-			"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int5":4561,
-			"ints5":0,
-			"false5":false,
-			"nil5":false,
-			"obj5":      null                ,
-			"obj5":
-				[    true    ,
-				{
-				"special-5":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 5":"\u5656",
-				"bigdecimal5":7817265.00000111,
-				"bigdecimal-2-5":127655512123456.761009E-123,
-				"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int5":4561,
-				"ints5":0,
-				"false5":false,
-				"nil5":false,
-				"obj5":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-6":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 6":"\u5656",
-	"bigdecimal6":7817265.00000111,
-	"bigdecimal-2-6":127655512123456.761009E-123,
-	"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int6":4561,
-	"ints6":0,
-	"false6":false,
-	"nil6":false,
-	"n6":      null                ,
-	"obj6":
-		{
-			"special-6":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 6":"\u5656",
-	"bigdecimal6":7817265.00000111,
-			"bigdecimal-2-6":127655512123456.761009E-123,
-			"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int6":4561,
-			"ints6":0,
-			"false6":false,
-			"nil6":false,
-			"obj6":      null                ,
-			"obj6":
-				[    true    ,
-				{
-				"special-6":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 6":"\u5656",
-				"bigdecimal6":7817265.00000111,
-				"bigdecimal-2-6":127655512123456.761009E-123,
-				"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int6":4561,
-				"ints6":0,
-				"false6":false,
-				"nil6":false,
-				"obj6":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-7":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 7":"\u5656",
-	"bigdecimal7":7817265.00000111,
-	"bigdecimal-2-7":127655512123456.761009E-123,
-	"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int7":4561,
-	"ints7":0,
-	"false7":false,
-	"nil7":false,
-	"n7":      null                ,
-	"obj7":
-		{
-			"special-7":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 7":"\u5656",
-	"bigdecimal7":7817265.00000111,
-			"bigdecimal-2-7":127655512123456.761009E-123,
-			"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int7":4561,
-			"ints7":0,
-			"false7":false,
-			"nil7":false,
-			"obj7":      null                ,
-			"obj7":
-				[    true    ,
-				{
-				"special-7":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 7":"\u5656",
-				"bigdecimal7":7817265.00000111,
-				"bigdecimal-2-7":127655512123456.761009E-123,
-				"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int7":4561,
-				"ints7":0,
-				"false7":false,
-				"nil7":false,
-				"obj7":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-8":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 8":"\u5656",
-	"bigdecimal8":7817265.00000111,
-	"bigdecimal-2-8":127655512123456.761009E-123,
-	"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int8":4561,
-	"ints8":0,
-	"false8":false,
-	"nil8":false,
-	"n8":      null                ,
-	"obj8":
-		{
-			"special-8":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 8":"\u5656",
-	"bigdecimal8":7817265.00000111,
-			"bigdecimal-2-8":127655512123456.761009E-123,
-			"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int8":4561,
-			"ints8":0,
-			"false8":false,
-			"nil8":false,
-			"obj8":      null                ,
-			"obj8":
-				[    true    ,
-				{
-				"special-8":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 8":"\u5656",
-				"bigdecimal8":7817265.00000111,
-				"bigdecimal-2-8":127655512123456.761009E-123,
-				"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int8":4561,
-				"ints8":0,
-				"false8":false,
-				"nil8":false,
-				"obj8":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      ,
-	"special-9":"\\f\n\r\t\uffff",
-	"unicode-\u0000- 9":"\u5656",
-	"bigdecimal9":7817265.00000111,
-	"bigdecimal-2-9":127655512123456.761009E-123,
-	"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-	"int9":4561,
-	"ints9":0,
-	"false9":false,
-	"nil9":false,
-	"n9":      null                ,
-	"obj9":
-		{
-			"special-9":"\\f\n\r\t\uffff",
-			"unicode-\u0000- 9":"\u5656",
-	"bigdecimal9":7817265.00000111,
-			"bigdecimal-2-9":127655512123456.761009E-123,
-			"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-			"int9":4561,
-			"ints9":0,
-			"false9":false,
-			"nil9":false,
-			"obj9":      null                ,
-			"obj9":
-				[    true    ,
-				{
-				"special-9":"\\f\n\r\t\uffff",
-				"unicode-\u0000- 9":"\u5656",
-				"bigdecimal9":7817265.00000111,
-				"bigdecimal-2-9":127655512123456.761009E-123,
-				"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
-				"int9":4561,
-				"ints9":0,
-				"false9":false,
-				"nil9":false,
-				"obj9":      null                
-				
-}
-			]
-		
-}
-
-
-
-                 	
                                                      
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/small_3kb.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/small_3kb.json b/fleece-core/src/test/resources/bench/small_3kb.json
deleted file mode 100644
index c8994f0..0000000
--- a/fleece-core/src/test/resources/bench/small_3kb.json
+++ /dev/null
@@ -1,86 +0,0 @@
-[
-  {
-    "id": 0,
-    "guid": "94ab4571-718f-4734-b331-c68c5d8f3acb",
-    "isActive": false,
-    "balance": "$3,105.88",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "brown",
-    "name": "Weiss Perkins",
-    "gender": "male",
-    "company": "SHOPABOUT",
-    "address": "989 Lake Street, Kipp, Kansas, 2455",
-    "about": "Sint pariatur nostrud aliquip amet elit commodo aliqua. Fugiat nisi dolore aliquip eu. Exercitation dolore cupidatat mollit occaecat minim aliqua pariatur esse esse amet mollit. In dolor voluptate Lorem incididunt voluptate.\r\n",
-    "registered": "2014-03-23T01:37:39 -01:00",
-    "latitude": 80.963663,
-    "longitude": 4.258947,
-    "tags": [
-      "reprehenderit",
-      "incididunt",
-      "dolor",
-      "nostrud",
-      "id",
-      "culpa",
-      "id"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Kimberley Snider"
-      },
-      {
-        "id": 1,
-        "name": "Natasha Hoover"
-      },
-      {
-        "id": 2,
-        "name": "Susana Griffith"
-      }
-    ],
-    "greeting": "Hello, Weiss Perkins! You have 6 unread messages.",
-    "favoriteFruit": "banana"
-  },
-  {
-    "id": 1,
-    "guid": "ca3edf43-8a4c-4102-8f00-ab34fc3242e5",
-    "isActive": true,
-    "balance": "$1,349.81",
-    "picture": "http://placehold.it/32x32",
-    "age": 36,
-    "eyeColor": "blue",
-    "name": "Bessie Koch",
-    "gender": "female",
-    "company": "GEEKY",
-    "address": "318 Noll Street, Toftrees, Washington, 4804",
-    "about": "Consectetur ullamco occaecat cillum amet consequat laboris aliqua qui anim mollit. Esse cillum laborum ipsum esse in reprehenderit irure ex. Ex duis fugiat elit do minim amet Lorem fugiat. Eu ea sit sunt do consequat anim deserunt voluptate in cupidatat id. Labore Lorem est laborum consequat sint exercitation nostrud officia. In velit cupidatat et magna duis aute excepteur tempor eiusmod qui aliquip. Nisi ea anim dolore fugiat fugiat voluptate commodo ullamco id in magna consequat.\r\n",
-    "registered": "2014-06-15T14:31:59 -02:00",
-    "latitude": -22.556508,
-    "longitude": 96.155538,
-    "tags": [
-      "commodo",
-      "reprehenderit",
-      "consectetur",
-      "exercitation",
-      "culpa",
-      "voluptate",
-      "laboris"
-    ],
-    "friends": [
-      {
-        "id": 0,
-        "name": "Duffy Stokes"
-      },
-      {
-        "id": 1,
-        "name": "Faye Wilkins"
-      },
-      {
-        "id": 2,
-        "name": "Blackburn Franklin"
-      }
-    ],
-    "greeting": "Hello, Bessie Koch! You have 7 unread messages.",
-    "favoriteFruit": "strawberry"
-  }
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/tiny_50b.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/tiny_50b.json b/fleece-core/src/test/resources/bench/tiny_50b.json
deleted file mode 100644
index 33e0693..0000000
--- a/fleece-core/src/test/resources/bench/tiny_50b.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "debug": "false\ttrue",
-    "number" : 1.4E10
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/unicode_chars_1400kb.txt
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/unicode_chars_1400kb.txt b/fleece-core/src/test/resources/bench/unicode_chars_1400kb.txt
deleted file mode 100644
index 576c24d..0000000
Binary files a/fleece-core/src/test/resources/bench/unicode_chars_1400kb.txt and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/bench/unicode_chars_170kb.txt
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/bench/unicode_chars_170kb.txt b/fleece-core/src/test/resources/bench/unicode_chars_170kb.txt
deleted file mode 100644
index b06ecff..0000000
Binary files a/fleece-core/src/test/resources/bench/unicode_chars_170kb.txt and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/array.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/array.json b/fleece-core/src/test/resources/json/array.json
deleted file mode 100644
index 6e6bf04..0000000
--- a/fleece-core/src/test/resources/json/array.json
+++ /dev/null
@@ -1,8 +0,0 @@
-[
-    "a",
-    1,
-    {
-        "b": "c"
-    },
-    5
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/bigdecimal.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/bigdecimal.json b/fleece-core/src/test/resources/json/bigdecimal.json
deleted file mode 100644
index 0e4f377..0000000
--- a/fleece-core/src/test/resources/json/bigdecimal.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "a": 1.23E3,
-    "b": 1.23E-3,
-    "c": 1.23E+3
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/empty.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/empty.json b/fleece-core/src/test/resources/json/empty.json
deleted file mode 100644
index 9e26dfe..0000000
--- a/fleece-core/src/test/resources/json/empty.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/emptyarray.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/emptyarray.json b/fleece-core/src/test/resources/json/emptyarray.json
deleted file mode 100644
index 90b2a13..0000000
--- a/fleece-core/src/test/resources/json/emptyarray.json
+++ /dev/null
@@ -1,3 +0,0 @@
-[	
- 
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/escaping.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/escaping.json b/fleece-core/src/test/resources/json/escaping.json
deleted file mode 100644
index 0f4e49b..0000000
--- a/fleece-core/src/test/resources/json/escaping.json
+++ /dev/null
@@ -1,11 +0,0 @@
-[
-    "\"",
-    "\\",
-    "\/",
-    "\b",
-    "\f",
-    "\n",
-    "\r",
-    "\t",
-    "\u0044"
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail1.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail1.json b/fleece-core/src/test/resources/json/fails/fail1.json
deleted file mode 100644
index 45dd52e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail1.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{,
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail10.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail10.json b/fleece-core/src/test/resources/json/fails/fail10.json
deleted file mode 100644
index 57374c0..0000000
--- a/fleece-core/src/test/resources/json/fails/fail10.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail11.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail11.json b/fleece-core/src/test/resources/json/fails/fail11.json
deleted file mode 100644
index 5c18af6..0000000
--- a/fleece-core/src/test/resources/json/fails/fail11.json
+++ /dev/null
@@ -1,8 +0,0 @@
-
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail12.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail12.json b/fleece-core/src/test/resources/json/fails/fail12.json
deleted file mode 100644
index fec9295..0000000
--- a/fleece-core/src/test/resources/json/fails/fail12.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{    q
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail13.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail13.json b/fleece-core/src/test/resources/json/fails/fail13.json
deleted file mode 100644
index 838ba2c..0000000
--- a/fleece-core/src/test/resources/json/fails/fail13.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{	
-    "a": "b",
-    "c": nul,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail14.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail14.json b/fleece-core/src/test/resources/json/fails/fail14.json
deleted file mode 100644
index f9e9a91..0000000
--- a/fleece-core/src/test/resources/json/fails/fail14.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{	"x":
-    "a": "b",
-    "c": 4,
-    "d"": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail15.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail15.json b/fleece-core/src/test/resources/json/fails/fail15.json
deleted file mode 100644
index 518dcb3..0000000
--- a/fleece-core/src/test/resources/json/fails/fail15.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-
-	true,
-    "a": "b",
-    "c": {
-        "d": [
-            1,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail16.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail16.json b/fleece-core/src/test/resources/json/fails/fail16.json
deleted file mode 100644
index 75f8856..0000000
--- a/fleece-core/src/test/resources/json/fails/fail16.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "a": "b",
-    "c": {
-        d: [
-            1,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail17.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail17.json b/fleece-core/src/test/resources/json/fails/fail17.json
deleted file mode 100644
index 7e44be3..0000000
--- a/fleece-core/src/test/resources/json/fails/fail17.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "a": "b",
-    "c": true {
-        "d": [
-            1,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail18.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail18.json b/fleece-core/src/test/resources/json/fails/fail18.json
deleted file mode 100644
index c4048ac..0000000
--- a/fleece-core/src/test/resources/json/fails/fail18.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-
-	true
-    "a": "b",
-    "c": {
-        "d": [
-            1,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail19.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail19.json b/fleece-core/src/test/resources/json/fails/fail19.json
deleted file mode 100644
index 686038c..0000000
--- a/fleece-core/src/test/resources/json/fails/fail19.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-
-    "a": "b",
-    "c": {
-        "d": [
-            1,
-            2
-        ]
-    }
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail2.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail2.json b/fleece-core/src/test/resources/json/fails/fail2.json
deleted file mode 100644
index e5ac24b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail2.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a":: "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail20.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail20.json b/fleece-core/src/test/resources/json/fails/fail20.json
deleted file mode 100644
index cb4b1a3..0000000
--- a/fleece-core/src/test/resources/json/fails/fail20.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-
-    "a": "b",
-    "c": {
-        "d": [
-            01,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail21.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail21.json b/fleece-core/src/test/resources/json/fails/fail21.json
deleted file mode 100644
index b992e92..0000000
--- a/fleece-core/src/test/resources/json/fails/fail21.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-
-    "a": "b",
-    "c": {
-        "d": [
-            1.24ee-20,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail22.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail22.json b/fleece-core/src/test/resources/json/fails/fail22.json
deleted file mode 100644
index 3294a90..0000000
--- a/fleece-core/src/test/resources/json/fails/fail22.json
+++ /dev/null
@@ -1 +0,0 @@
-garbage in garbage out
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail23.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail23.json b/fleece-core/src/test/resources/json/fails/fail23.json
deleted file mode 100644
index b10e1d9..0000000
--- a/fleece-core/src/test/resources/json/fails/fail23.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "\u6565",
-    "c": "\u123",
-    "d": [
-        
-        -2, "\u0048"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail24.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail24.json b/fleece-core/src/test/resources/json/fails/fail24.json
deleted file mode 100644
index 95fcffd..0000000
--- a/fleece-core/src/test/resources/json/fails/fail24.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "a": "a",
-    "c": \u0074\u0072\u0075\u0065
-   
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail25.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail25.json b/fleece-core/src/test/resources/json/fails/fail25.json
deleted file mode 100644
index f72b803..0000000
--- a/fleece-core/src/test/resources/json/fails/fail25.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "\u6565",
-    "c": "\up000",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail26.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail26.json b/fleece-core/src/test/resources/json/fails/fail26.json
deleted file mode 100644
index 128454e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail26.json
+++ /dev/null
@@ -1,7 +0,0 @@
-,{
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail27.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail27.json b/fleece-core/src/test/resources/json/fails/fail27.json
deleted file mode 100644
index 3ae9085..0000000
--- a/fleece-core/src/test/resources/json/fails/fail27.json
+++ /dev/null
@@ -1,7 +0,0 @@
-"{
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail28.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail28.json b/fleece-core/src/test/resources/json/fails/fail28.json
deleted file mode 100644
index 11ba875..0000000
--- a/fleece-core/src/test/resources/json/fails/fail28.json
+++ /dev/null
@@ -1,7 +0,0 @@
-true, {
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail29.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail29.json b/fleece-core/src/test/resources/json/fails/fail29.json
deleted file mode 100644
index 8eff000..0000000
--- a/fleece-core/src/test/resources/json/fails/fail29.json
+++ /dev/null
@@ -1,7 +0,0 @@
-  :   {
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail3.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail3.json b/fleece-core/src/test/resources/json/fails/fail3.json
deleted file mode 100644
index edec226..0000000
--- a/fleece-core/src/test/resources/json/fails/fail3.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": , "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail30.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail30.json b/fleece-core/src/test/resources/json/fails/fail30.json
deleted file mode 100644
index 555e395..0000000
--- a/fleece-core/src/test/resources/json/fails/fail30.json
+++ /dev/null
@@ -1,7 +0,0 @@
-null{
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail31.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail31.json b/fleece-core/src/test/resources/json/fails/fail31.json
deleted file mode 100644
index f1c8332..0000000
--- a/fleece-core/src/test/resources/json/fails/fail31.json
+++ /dev/null
@@ -1,7 +0,0 @@
-"string":{
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail32.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail32.json b/fleece-core/src/test/resources/json/fails/fail32.json
deleted file mode 100644
index 7883a28..0000000
--- a/fleece-core/src/test/resources/json/fails/fail32.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "a": "\u6565",
-    "d": [
-        
-        -2, 20e-1.2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail33.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail33.json b/fleece-core/src/test/resources/json/fails/fail33.json
deleted file mode 100644
index 308571d..0000000
--- a/fleece-core/src/test/resources/json/fails/fail33.json
+++ /dev/null
@@ -1,7 +0,0 @@
-14{
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail34.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail34.json b/fleece-core/src/test/resources/json/fails/fail34.json
deleted file mode 100644
index 619a684..0000000
--- a/fleece-core/src/test/resources/json/fails/fail34.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "a": "\u6565",
-    "d": [
-        
-        -2, 2.0e-1.2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail35.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail35.json b/fleece-core/src/test/resources/json/fails/fail35.json
deleted file mode 100644
index cfda2b8..0000000
--- a/fleece-core/src/test/resources/json/fails/fail35.json
+++ /dev/null
@@ -1,7 +0,0 @@
- ,   {
-    "a": "\u6565",
-    "d": [
-        
-        -2, "\u0044"
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail36.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail36.json b/fleece-core/src/test/resources/json/fails/fail36.json
deleted file mode 100644
index 57fff2f..0000000
--- a/fleece-core/src/test/resources/json/fails/fail36.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": "	"
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail37.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail37.json b/fleece-core/src/test/resources/json/fails/fail37.json
deleted file mode 100644
index 6e894f9..0000000
--- a/fleece-core/src/test/resources/json/fails/fail37.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "a
-    ": "x"
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail38.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail38.json b/fleece-core/src/test/resources/json/fails/fail38.json
deleted file mode 100644
index 0c90427..0000000
--- a/fleece-core/src/test/resources/json/fails/fail38.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 12.2e-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail39.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail39.json b/fleece-core/src/test/resources/json/fails/fail39.json
deleted file mode 100644
index ac47891..0000000
--- a/fleece-core/src/test/resources/json/fails/fail39.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 12.2e
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail4.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail4.json b/fleece-core/src/test/resources/json/fails/fail4.json
deleted file mode 100644
index 70fbe2f..0000000
--- a/fleece-core/src/test/resources/json/fails/fail4.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",,
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail40.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail40.json b/fleece-core/src/test/resources/json/fails/fail40.json
deleted file mode 100644
index 7a503fb..0000000
--- a/fleece-core/src/test/resources/json/fails/fail40.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "a": "v"
-}
-some garbage
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail41.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail41.json b/fleece-core/src/test/resources/json/fails/fail41.json
deleted file mode 100644
index 352963d..0000000
--- a/fleece-core/src/test/resources/json/fails/fail41.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": "\vbadescape"
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail42.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail42.json b/fleece-core/src/test/resources/json/fails/fail42.json
deleted file mode 100644
index ed6e301..0000000
--- a/fleece-core/src/test/resources/json/fails/fail42.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": -055
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail43.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail43.json b/fleece-core/src/test/resources/json/fails/fail43.json
deleted file mode 100644
index 46fcf2e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail43.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": -01.55
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail44.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail44.json b/fleece-core/src/test/resources/json/fails/fail44.json
deleted file mode 100644
index 4e963bb..0000000
--- a/fleece-core/src/test/resources/json/fails/fail44.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": -00001.55
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail45.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail45.json b/fleece-core/src/test/resources/json/fails/fail45.json
deleted file mode 100644
index ccc49ff..0000000
--- a/fleece-core/src/test/resources/json/fails/fail45.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": " before this word the is a u+0001 char"
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail46.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail46.json b/fleece-core/src/test/resources/json/fails/fail46.json
deleted file mode 100644
index 54b8681..0000000
--- a/fleece-core/src/test/resources/json/fails/fail46.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": "before this is a u+00031 char"
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail47.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail47.json b/fleece-core/src/test/resources/json/fails/fail47.json
deleted file mode 100644
index 13f6f1d..0000000
--- a/fleece-core/src/test/resources/json/fails/fail47.json
+++ /dev/null
@@ -1 +0,0 @@
-[1,]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail48.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail48.json b/fleece-core/src/test/resources/json/fails/fail48.json
deleted file mode 100644
index e4d4ddd..0000000
--- a/fleece-core/src/test/resources/json/fails/fail48.json
+++ /dev/null
@@ -1,6 +0,0 @@
-[1,
-2,
-3,
-4,
-5,
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail49.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail49.json b/fleece-core/src/test/resources/json/fails/fail49.json
deleted file mode 100644
index 3acaa8f..0000000
--- a/fleece-core/src/test/resources/json/fails/fail49.json
+++ /dev/null
@@ -1 +0,0 @@
-{"a":1,}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail5.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail5.json b/fleece-core/src/test/resources/json/fails/fail5.json
deleted file mode 100644
index 2fd140f..0000000
--- a/fleece-core/src/test/resources/json/fails/fail5.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        1 2,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail50.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail50.json b/fleece-core/src/test/resources/json/fails/fail50.json
deleted file mode 100644
index c7e2925..0000000
--- a/fleece-core/src/test/resources/json/fails/fail50.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-"a":1,
-"b":2,
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail51.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail51.json b/fleece-core/src/test/resources/json/fails/fail51.json
deleted file mode 100644
index dec2b86..0000000
--- a/fleece-core/src/test/resources/json/fails/fail51.json
+++ /dev/null
@@ -1 +0,0 @@
-["\uDFAA (missing high surrogate)"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail52.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail52.json b/fleece-core/src/test/resources/json/fails/fail52.json
deleted file mode 100644
index eeea18b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail52.json
+++ /dev/null
@@ -1 +0,0 @@
-["\uD888\u3210 (invalid second surrogate)"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail53.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail53.json b/fleece-core/src/test/resources/json/fails/fail53.json
deleted file mode 100644
index 5819cae..0000000
--- a/fleece-core/src/test/resources/json/fails/fail53.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    "-10", -10,
-    "100": 100
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail54.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail54.json b/fleece-core/src/test/resources/json/fails/fail54.json
deleted file mode 100644
index 0fffc9b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail54.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    "-10"  -10,
-    "100": 100,
-    "-100", -100
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail55.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail55.json b/fleece-core/src/test/resources/json/fails/fail55.json
deleted file mode 100644
index a3a4074..0000000
--- a/fleece-core/src/test/resources/json/fails/fail55.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    -10  -10,
-    "100": 100,
-    "-100", -100
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail56.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail56.json b/fleece-core/src/test/resources/json/fails/fail56.json
deleted file mode 100644
index 820d41e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail56.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    "-10", "-10",
-    "100": 100
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail57.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail57.json b/fleece-core/src/test/resources/json/fails/fail57.json
deleted file mode 100644
index ffe9c1c..0000000
--- a/fleece-core/src/test/resources/json/fails/fail57.json
+++ /dev/null
@@ -1 +0,0 @@
-["a":3]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail58.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail58.json b/fleece-core/src/test/resources/json/fails/fail58.json
deleted file mode 100644
index 270b5d5..0000000
--- a/fleece-core/src/test/resources/json/fails/fail58.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "0":["a":3]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail59.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail59.json b/fleece-core/src/test/resources/json/fails/fail59.json
deleted file mode 100644
index 81750b9..0000000
--- a/fleece-core/src/test/resources/json/fails/fail59.json
+++ /dev/null
@@ -1 +0,0 @@
-{
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail6.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail6.json b/fleece-core/src/test/resources/json/fails/fail6.json
deleted file mode 100644
index 290615e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail6.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        2
-    ]]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail60.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail60.json b/fleece-core/src/test/resources/json/fails/fail60.json
deleted file mode 100644
index 17be25b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail60.json
+++ /dev/null
@@ -1 +0,0 @@
-[ {}, [] }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail61.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail61.json b/fleece-core/src/test/resources/json/fails/fail61.json
deleted file mode 100644
index 0b9fc5b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail61.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": -
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail62.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail62.json b/fleece-core/src/test/resources/json/fails/fail62.json
deleted file mode 100644
index ac5e00d..0000000
--- a/fleece-core/src/test/resources/json/fails/fail62.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a":
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail63.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail63.json b/fleece-core/src/test/resources/json/fails/fail63.json
deleted file mode 100644
index 29bdc57..0000000
--- a/fleece-core/src/test/resources/json/fails/fail63.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a"
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail64.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail64.json b/fleece-core/src/test/resources/json/fails/fail64.json
deleted file mode 100644
index 3edb81e..0000000
--- a/fleece-core/src/test/resources/json/fails/fail64.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 1.,
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail65.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail65.json b/fleece-core/src/test/resources/json/fails/fail65.json
deleted file mode 100644
index 3adb8bb..0000000
--- a/fleece-core/src/test/resources/json/fails/fail65.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": .5,
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail66.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail66.json b/fleece-core/src/test/resources/json/fails/fail66.json
deleted file mode 100644
index 129cac0..0000000
--- a/fleece-core/src/test/resources/json/fails/fail66.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 1-,
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail67.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail67.json b/fleece-core/src/test/resources/json/fails/fail67.json
deleted file mode 100644
index 5df5fe3..0000000
--- a/fleece-core/src/test/resources/json/fails/fail67.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 1.-,
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail68.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail68.json b/fleece-core/src/test/resources/json/fails/fail68.json
deleted file mode 100644
index 2c44166..0000000
--- a/fleece-core/src/test/resources/json/fails/fail68.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a": 1.9e-1.2,
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail69.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail69.json b/fleece-core/src/test/resources/json/fails/fail69.json
deleted file mode 100644
index 349826b..0000000
--- a/fleece-core/src/test/resources/json/fails/fail69.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    12
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail7.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail7.json b/fleece-core/src/test/resources/json/fails/fail7.json
deleted file mode 100644
index 072487f..0000000
--- a/fleece-core/src/test/resources/json/fails/fail7.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        1..56,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail70.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail70.json b/fleece-core/src/test/resources/json/fails/fail70.json
deleted file mode 100644
index 0c90165..0000000
--- a/fleece-core/src/test/resources/json/fails/fail70.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    null null
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail71.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail71.json b/fleece-core/src/test/resources/json/fails/fail71.json
deleted file mode 100644
index 819e165..0000000
--- a/fleece-core/src/test/resources/json/fails/fail71.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    null
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail72.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail72.json b/fleece-core/src/test/resources/json/fails/fail72.json
deleted file mode 100644
index 02beb05..0000000
--- a/fleece-core/src/test/resources/json/fails/fail72.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "a","b"
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail8.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail8.json b/fleece-core/src/test/resources/json/fails/fail8.json
deleted file mode 100644
index 3de92f7..0000000
--- a/fleece-core/src/test/resources/json/fails/fail8.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        +1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/fail9.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/fail9.json b/fleece-core/src/test/resources/json/fails/fail9.json
deleted file mode 100644
index 9464907..0000000
--- a/fleece-core/src/test/resources/json/fails/fail9.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d"": [
-        1,
-        2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/fails/numbers.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/fails/numbers.json b/fleece-core/src/test/resources/json/fails/numbers.json
deleted file mode 100644
index d300022..0000000
--- a/fleece-core/src/test/resources/json/fails/numbers.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    "-10", -10,
-    "100": 100,
-    "-100", -100,
-    "456": 456,
-    "-456": -456,
-    "123.12345": 123.12345,
-    "-123.12345": -123.12345,
-    "999999999999999999999999999999": 999999999999999999999999999999,
-    "-999999999999999999999999999999": -999999999999999999999999999999
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/nested.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/nested.json b/fleece-core/src/test/resources/json/nested.json
deleted file mode 100644
index d6f09f8..0000000
--- a/fleece-core/src/test/resources/json/nested.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "a": "b",
-    "c": {
-        "d": [
-            1,
-            2
-        ]
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/numbers.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/numbers.json b/fleece-core/src/test/resources/json/numbers.json
deleted file mode 100644
index 847a9f8..0000000
--- a/fleece-core/src/test/resources/json/numbers.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "0": 0,
-    "0": -0,
-    "1": 1,
-    "-1": -1,
-    "9": 9,
-    "-9": -9,
-    "10": 10,
-    "-10": -10,
-    "100": 100,
-    "-100": -100,
-    "456": 456,
-    "-456": -456,
-    "123.12345": 123.12345,
-    "-123.12345": -123.12345,
-    "999999999999999999999999999999": 999999999999999999999999999999,
-    "-999999999999999999999999999999": -999999999999999999999999999999
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/simple.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/simple.json b/fleece-core/src/test/resources/json/simple.json
deleted file mode 100644
index 78be59e..0000000
--- a/fleece-core/src/test/resources/json/simple.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "a": "b",
-    "c": 4,
-    "d": [
-        1,
-        -2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/simple2.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/simple2.json b/fleece-core/src/test/resources/json/simple2.json
deleted file mode 100644
index 2578a23..0000000
--- a/fleece-core/src/test/resources/json/simple2.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "a": "b",
- "c": 4,
- "d": [
-  1,
-  -2
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/simple_utf16le.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/simple_utf16le.json b/fleece-core/src/test/resources/json/simple_utf16le.json
deleted file mode 100644
index c2e2137..0000000
Binary files a/fleece-core/src/test/resources/json/simple_utf16le.json and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/special.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/special.json b/fleece-core/src/test/resources/json/special.json
deleted file mode 100644
index 065c1b3..0000000
--- a/fleece-core/src/test/resources/json/special.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "a{": "b,,",
-    "c::::": ":4::,[{",
-    "d": [
-        1,
-        2,
-        null,
-        false,
-        true,
-        4.2
-    ],
-    "w":4.6676123,
-    "r": 0.001,
-    "1.4312":110,
-    "\u0044":null,
-    "\"":"\"",
-    "থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#":					"ন:4::,[{"
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/stringescape.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/stringescape.json b/fleece-core/src/test/resources/json/stringescape.json
deleted file mode 100644
index d9c3ddb..0000000
--- a/fleece-core/src/test/resources/json/stringescape.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "name": "s\"mit\""
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-core/src/test/resources/json/unicode.json
----------------------------------------------------------------------
diff --git a/fleece-core/src/test/resources/json/unicode.json b/fleece-core/src/test/resources/json/unicode.json
deleted file mode 100644
index 07e5d4d..0000000
--- a/fleece-core/src/test/resources/json/unicode.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "a": "\u6565",
-    "z": "",
-    "c": "\u0000",
-    "f": "\u0070\u0070\u0070a\u0070+++\u0070",
-    "d": [
-        
-        -2, "\u0020",""
-    ]
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/pom.xml
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/pom.xml b/fleece-jaxrs/pom.xml
deleted file mode 100644
index 00cdf69..0000000
--- a/fleece-jaxrs/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>fleece</artifactId>
-    <groupId>org.apache.fleece</groupId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>fleece-jaxrs</artifactId>
-  <name>Fleece :: JAX-RS</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>javax.ws.rs</groupId>
-      <artifactId>javax.ws.rs-api</artifactId>
-      <version>2.0</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.fleece</groupId>
-      <artifactId>fleece-mapper</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-rs-client</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-frontend-jaxrs</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-transports-local</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <properties>
-    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-    <cxf.version>3.0.0</cxf.version>
-  </properties>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/DelegateProvider.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/DelegateProvider.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/DelegateProvider.java
deleted file mode 100644
index 12bcc80..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/DelegateProvider.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.MessageBodyWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-public abstract class DelegateProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T>  {
-    private final MessageBodyReader<T> reader;
-    private final MessageBodyWriter<T> writer;
-
-    protected DelegateProvider(final MessageBodyReader<T> reader, final MessageBodyWriter<T> writer) {
-        this.reader = reader;
-        this.writer = writer;
-    }
-
-    @Override
-    public boolean isReadable(final Class<?> rawType, final Type genericType,
-                              final Annotation[] annotations, final MediaType mediaType) {
-        return reader.isReadable(rawType, genericType, annotations, mediaType);
-    }
-
-    @Override
-    public T readFrom(final Class<T> rawType, final Type genericType,
-                      final Annotation[] annotations, final MediaType mediaType,
-                      final MultivaluedMap<String, String> httpHeaders,
-                      final InputStream entityStream) throws IOException {
-        return reader.readFrom(rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
-    }
-
-    @Override
-    public long getSize(final T t, final Class<?> rawType, final Type genericType,
-                        final Annotation[] annotations, final MediaType mediaType) {
-        return writer.getSize(t, rawType, genericType, annotations, mediaType);
-    }
-
-    @Override
-    public boolean isWriteable(final Class<?> rawType, final Type genericType,
-                               final Annotation[] annotations, final MediaType mediaType) {
-        return writer.isWriteable(rawType, genericType, annotations, mediaType);
-    }
-
-    @Override
-    public void writeTo(final T t, final Class<?> rawType, final Type genericType,
-                        final Annotation[] annotations, final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders,
-                        final OutputStream entityStream) throws IOException {
-        writer.writeTo(t, rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyReader.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyReader.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyReader.java
deleted file mode 100644
index c34727a..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyReader.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.fleece.mapper.Mapper;
-import org.apache.fleece.mapper.MapperBuilder;
-
-import javax.json.JsonStructure;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-import static org.apache.fleece.jaxrs.Jsons.isJson;
-
-@Provider
-@Consumes(WILDCARD)
-public class FleeceMessageBodyReader<T> implements MessageBodyReader<T> {
-    private final Mapper mapper;
-
-    public FleeceMessageBodyReader() {
-        this(new MapperBuilder().setDoCloseOnStreams(false).build());
-    }
-
-    public FleeceMessageBodyReader(final Mapper mapper) {
-        this.mapper = mapper;
-    }
-
-    @Override
-    public boolean isReadable(final Class<?> rawType, final Type genericType,
-                              final Annotation[] annotations, final MediaType mediaType) {
-        return isJson(mediaType)
-                && InputStream.class != rawType && Reader.class != rawType
-                && String.class != rawType
-                && !JsonStructure.class.isAssignableFrom(rawType);
-    }
-
-    @Override
-    public T readFrom(final Class<T> rawType, final Type genericType,
-                      final Annotation[] annotations, final MediaType mediaType,
-                      final MultivaluedMap<String, String> httpHeaders,
-                      final InputStream entityStream) throws IOException {
-        if (rawType.isArray()) {
-            return (T) mapper.readArray(entityStream, rawType.getComponentType());
-        } else if (Collection.class.isAssignableFrom(rawType) && ParameterizedType.class.isInstance(genericType)) {
-            return (T) mapper.<Collection<T>,T>readCollection(entityStream, ParameterizedType.class.cast(genericType), rawType);
-        }
-        return mapper.readObject(entityStream, genericType);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyWriter.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyWriter.java
deleted file mode 100644
index b893222..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceMessageBodyWriter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.fleece.mapper.Mapper;
-import org.apache.fleece.mapper.MapperBuilder;
-
-import javax.json.JsonStructure;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-
-@Provider
-@Produces(WILDCARD)
-public class FleeceMessageBodyWriter<T> implements MessageBodyWriter<T> {
-    private final Mapper mapper;
-
-    public FleeceMessageBodyWriter() {
-        this(new MapperBuilder().setDoCloseOnStreams(false).build());
-    }
-
-    public FleeceMessageBodyWriter(final Mapper mapper) {
-        this.mapper = mapper;
-    }
-
-    @Override
-    public long getSize(final T t, final Class<?> rawType, final Type genericType,
-                        final Annotation[] annotations, final MediaType mediaType) {
-        return -1;
-    }
-
-    @Override
-    public boolean isWriteable(final Class<?> rawType, final Type genericType,
-                               final Annotation[] annotations, final MediaType mediaType) {
-        return Jsons.isJson(mediaType)
-                && InputStream.class != rawType
-                && OutputStream.class != rawType
-                && Writer.class != rawType
-                && StreamingOutput.class != rawType
-                && String.class != rawType
-                && Response.class != rawType
-                && !JsonStructure.class.isAssignableFrom(rawType);
-    }
-
-    @Override
-    public void writeTo(final T t, final Class<?> rawType, final Type genericType,
-                        final Annotation[] annotations, final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders,
-                        final OutputStream entityStream) throws IOException {
-        if (rawType.isArray()) {
-            mapper.writeArray(t, entityStream);
-        } else if (Collection.class.isAssignableFrom(rawType) && ParameterizedType.class.isInstance(genericType)) {
-            mapper.writeArray(Collection.class.cast(t), entityStream);
-        } else {
-            mapper.writeObject(t, entityStream);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceProvider.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceProvider.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceProvider.java
deleted file mode 100644
index 6f1beba..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/FleeceProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import org.apache.fleece.mapper.Mapper;
-import org.apache.fleece.mapper.MapperBuilder;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.ext.Provider;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-
-@Provider
-@Produces(WILDCARD)
-@Consumes(WILDCARD)
-public class FleeceProvider<T> extends DelegateProvider<T> {
-    public FleeceProvider(final Mapper mapper) {
-        super(new FleeceMessageBodyReader<T>(mapper), new FleeceMessageBodyWriter<T>(mapper));
-    }
-
-    public FleeceProvider() {
-        this(new MapperBuilder().setDoCloseOnStreams(false).build());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/Jsons.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/Jsons.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/Jsons.java
deleted file mode 100644
index 7872d28..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/Jsons.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import javax.ws.rs.core.MediaType;
-
-public class Jsons {
-    public static boolean isJson(final MediaType mediaType) {
-        if (mediaType != null) {
-            final String subtype = mediaType.getSubtype();
-            return "json".equalsIgnoreCase(subtype)
-                    || "javascript".equals(subtype)
-                    || "x-json".equals(subtype)
-                    || "x-javascript".equals(subtype)
-                    || subtype.endsWith("+json");
-        }
-        return true;
-    }
-
-    private Jsons() {
-        // no-op
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyReader.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyReader.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyReader.java
deleted file mode 100644
index f9a9e1c..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyReader.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import javax.json.Json;
-import javax.json.JsonReader;
-import javax.json.JsonReaderFactory;
-import javax.json.JsonStructure;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Collections;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-
-@Provider
-@Consumes(WILDCARD)
-public class JsrMessageBodyReader implements MessageBodyReader<JsonStructure> {
-    private final JsonReaderFactory factory;
-    private final boolean closeStream;
-
-    public JsrMessageBodyReader() {
-        this(Json.createReaderFactory(Collections.<String, Object>emptyMap()), false);
-    }
-
-    public JsrMessageBodyReader(final JsonReaderFactory factory, final boolean closeStream) {
-        this.factory = factory;
-        this.closeStream = closeStream;
-    }
-
-    @Override
-    public boolean isReadable(final Class<?> aClass, final Type type,
-                              final Annotation[] annotations, final MediaType mediaType) {
-        return JsonStructure.class.isAssignableFrom(aClass);
-    }
-
-    @Override
-    public JsonStructure readFrom(final Class<JsonStructure> jsonStructureClass, final Type type,
-                                  final Annotation[] annotations, final MediaType mediaType,
-                                  final MultivaluedMap<String, String> stringStringMultivaluedMap,
-                                  final InputStream inputStream) throws IOException, WebApplicationException {
-        JsonReader reader = null;
-        try {
-            reader = factory.createReader(inputStream);
-            return reader.read();
-        } finally {
-            if (closeStream && reader != null) {
-                reader.close();
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyWriter.java b/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyWriter.java
deleted file mode 100644
index dc77a30..0000000
--- a/fleece-jaxrs/src/main/java/org/apache/fleece/jaxrs/JsrMessageBodyWriter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.fleece.jaxrs;
-
-import javax.json.Json;
-import javax.json.JsonStructure;
-import javax.json.JsonWriter;
-import javax.json.JsonWriterFactory;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import javax.ws.rs.ext.Provider;
-import java.io.Flushable;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.Collections;
-
-import static javax.ws.rs.core.MediaType.WILDCARD;
-
-@Provider
-@Produces(WILDCARD)
-public class JsrMessageBodyWriter implements MessageBodyWriter<JsonStructure> {
-    private final JsonWriterFactory factory;
-    private final boolean close;
-
-    public JsrMessageBodyWriter() {
-        this(Json.createWriterFactory(Collections.<String, Object>emptyMap()), false);
-    }
-
-    public JsrMessageBodyWriter(final JsonWriterFactory factory, final boolean closeStreams) {
-        this.factory = factory;
-        this.close = closeStreams;
-    }
-
-    @Override
-    public boolean isWriteable(final Class<?> aClass, final Type type,
-                               final Annotation[] annotations, final MediaType mediaType) {
-        return JsonStructure.class.isAssignableFrom(aClass);
-    }
-
-    @Override
-    public long getSize(final JsonStructure jsonStructure, final Class<?> aClass,
-                        final Type type, final Annotation[] annotations,
-                        final MediaType mediaType) {
-        return -1;
-    }
-
-    @Override
-    public void writeTo(final JsonStructure jsonStructure,
-                        final Class<?> aClass, final Type type,
-                        final Annotation[] annotations, final MediaType mediaType,
-                        final MultivaluedMap<String, Object> stringObjectMultivaluedMap,
-                        final OutputStream outputStream) throws IOException, WebApplicationException {
-        JsonWriter writer = null;
-        try {
-            writer = factory.createWriter(outputStream);
-            writer.write(jsonStructure);
-        } finally {
-            if (writer != null) {
-                if (close) {
-                    writer.close();
-                } else if (Flushable.class.isInstance(writer)) {
-                    Flushable.class.cast(writer).flush();
-                }
-            }
-        }
-    }
-}


[03/20] renamed fleece to johnzon

Posted by sa...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/medium_11kb.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/medium_11kb.json b/johnzon-core/src/test/resources/bench/medium_11kb.json
new file mode 100644
index 0000000..ba8aafd
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/medium_11kb.json
@@ -0,0 +1,443 @@
+{
+	"special-0":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 0":"\u5656",
+	"bigdecimal0":7817265.00000111,
+	"bigdecimal-2-0":127655512123456.761009E-123,
+	"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int0":4561,
+	"ints0":0,
+	"false0":false,
+	"nil0":false,
+	"n0":      null                ,
+	"obj0":
+		{
+			"special-0":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 0":"\u5656",
+	"bigdecimal0":7817265.00000111,
+			"bigdecimal-2-0":127655512123456.761009E-123,
+			"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int0":4561,
+			"ints0":0,
+			"false0":false,
+			"nil0":false,
+			"obj0":      null                ,
+			"obj0":
+				[    true    ,
+				{
+				"special-0":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 0":"\u5656",
+				"bigdecimal0":7817265.00000111,
+				"bigdecimal-2-0":127655512123456.761009E-123,
+				"string-0":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int0":4561,
+				"ints0":0,
+				"false0":false,
+				"nil0":false,
+				"obj0":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-1":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 1":"\u5656",
+	"bigdecimal1":7817265.00000111,
+	"bigdecimal-2-1":127655512123456.761009E-123,
+	"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int1":4561,
+	"ints1":0,
+	"false1":false,
+	"nil1":false,
+	"n1":      null                ,
+	"obj1":
+		{
+			"special-1":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 1":"\u5656",
+	"bigdecimal1":7817265.00000111,
+			"bigdecimal-2-1":127655512123456.761009E-123,
+			"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int1":4561,
+			"ints1":0,
+			"false1":false,
+			"nil1":false,
+			"obj1":      null                ,
+			"obj1":
+				[    true    ,
+				{
+				"special-1":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 1":"\u5656",
+				"bigdecimal1":7817265.00000111,
+				"bigdecimal-2-1":127655512123456.761009E-123,
+				"string-1":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int1":4561,
+				"ints1":0,
+				"false1":false,
+				"nil1":false,
+				"obj1":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-2":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 2":"\u5656",
+	"bigdecimal2":7817265.00000111,
+	"bigdecimal-2-2":127655512123456.761009E-123,
+	"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int2":4561,
+	"ints2":0,
+	"false2":false,
+	"nil2":false,
+	"n2":      null                ,
+	"obj2":
+		{
+			"special-2":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 2":"\u5656",
+	"bigdecimal2":7817265.00000111,
+			"bigdecimal-2-2":127655512123456.761009E-123,
+			"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int2":4561,
+			"ints2":0,
+			"false2":false,
+			"nil2":false,
+			"obj2":      null                ,
+			"obj2":
+				[    true    ,
+				{
+				"special-2":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 2":"\u5656",
+				"bigdecimal2":7817265.00000111,
+				"bigdecimal-2-2":127655512123456.761009E-123,
+				"string-2":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int2":4561,
+				"ints2":0,
+				"false2":false,
+				"nil2":false,
+				"obj2":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-3":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 3":"\u5656",
+	"bigdecimal3":7817265.00000111,
+	"bigdecimal-2-3":127655512123456.761009E-123,
+	"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int3":4561,
+	"ints3":0,
+	"false3":false,
+	"nil3":false,
+	"n3":      null                ,
+	"obj3":
+		{
+			"special-3":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 3":"\u5656",
+	"bigdecimal3":7817265.00000111,
+			"bigdecimal-2-3":127655512123456.761009E-123,
+			"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int3":4561,
+			"ints3":0,
+			"false3":false,
+			"nil3":false,
+			"obj3":      null                ,
+			"obj3":
+				[    true    ,
+				{
+				"special-3":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 3":"\u5656",
+				"bigdecimal3":7817265.00000111,
+				"bigdecimal-2-3":127655512123456.761009E-123,
+				"string-3":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int3":4561,
+				"ints3":0,
+				"false3":false,
+				"nil3":false,
+				"obj3":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-4":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 4":"\u5656",
+	"bigdecimal4":7817265.00000111,
+	"bigdecimal-2-4":127655512123456.761009E-123,
+	"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int4":4561,
+	"ints4":0,
+	"false4":false,
+	"nil4":false,
+	"n4":      null                ,
+	"obj4":
+		{
+			"special-4":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 4":"\u5656",
+	"bigdecimal4":7817265.00000111,
+			"bigdecimal-2-4":127655512123456.761009E-123,
+			"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int4":4561,
+			"ints4":0,
+			"false4":false,
+			"nil4":false,
+			"obj4":      null                ,
+			"obj4":
+				[    true    ,
+				{
+				"special-4":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 4":"\u5656",
+				"bigdecimal4":7817265.00000111,
+				"bigdecimal-2-4":127655512123456.761009E-123,
+				"string-4":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int4":4561,
+				"ints4":0,
+				"false4":false,
+				"nil4":false,
+				"obj4":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-5":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 5":"\u5656",
+	"bigdecimal5":7817265.00000111,
+	"bigdecimal-2-5":127655512123456.761009E-123,
+	"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int5":4561,
+	"ints5":0,
+	"false5":false,
+	"nil5":false,
+	"n5":      null                ,
+	"obj5":
+		{
+			"special-5":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 5":"\u5656",
+	"bigdecimal5":7817265.00000111,
+			"bigdecimal-2-5":127655512123456.761009E-123,
+			"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int5":4561,
+			"ints5":0,
+			"false5":false,
+			"nil5":false,
+			"obj5":      null                ,
+			"obj5":
+				[    true    ,
+				{
+				"special-5":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 5":"\u5656",
+				"bigdecimal5":7817265.00000111,
+				"bigdecimal-2-5":127655512123456.761009E-123,
+				"string-5":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int5":4561,
+				"ints5":0,
+				"false5":false,
+				"nil5":false,
+				"obj5":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-6":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 6":"\u5656",
+	"bigdecimal6":7817265.00000111,
+	"bigdecimal-2-6":127655512123456.761009E-123,
+	"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int6":4561,
+	"ints6":0,
+	"false6":false,
+	"nil6":false,
+	"n6":      null                ,
+	"obj6":
+		{
+			"special-6":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 6":"\u5656",
+	"bigdecimal6":7817265.00000111,
+			"bigdecimal-2-6":127655512123456.761009E-123,
+			"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int6":4561,
+			"ints6":0,
+			"false6":false,
+			"nil6":false,
+			"obj6":      null                ,
+			"obj6":
+				[    true    ,
+				{
+				"special-6":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 6":"\u5656",
+				"bigdecimal6":7817265.00000111,
+				"bigdecimal-2-6":127655512123456.761009E-123,
+				"string-6":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int6":4561,
+				"ints6":0,
+				"false6":false,
+				"nil6":false,
+				"obj6":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-7":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 7":"\u5656",
+	"bigdecimal7":7817265.00000111,
+	"bigdecimal-2-7":127655512123456.761009E-123,
+	"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int7":4561,
+	"ints7":0,
+	"false7":false,
+	"nil7":false,
+	"n7":      null                ,
+	"obj7":
+		{
+			"special-7":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 7":"\u5656",
+	"bigdecimal7":7817265.00000111,
+			"bigdecimal-2-7":127655512123456.761009E-123,
+			"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int7":4561,
+			"ints7":0,
+			"false7":false,
+			"nil7":false,
+			"obj7":      null                ,
+			"obj7":
+				[    true    ,
+				{
+				"special-7":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 7":"\u5656",
+				"bigdecimal7":7817265.00000111,
+				"bigdecimal-2-7":127655512123456.761009E-123,
+				"string-7":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int7":4561,
+				"ints7":0,
+				"false7":false,
+				"nil7":false,
+				"obj7":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-8":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 8":"\u5656",
+	"bigdecimal8":7817265.00000111,
+	"bigdecimal-2-8":127655512123456.761009E-123,
+	"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int8":4561,
+	"ints8":0,
+	"false8":false,
+	"nil8":false,
+	"n8":      null                ,
+	"obj8":
+		{
+			"special-8":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 8":"\u5656",
+	"bigdecimal8":7817265.00000111,
+			"bigdecimal-2-8":127655512123456.761009E-123,
+			"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int8":4561,
+			"ints8":0,
+			"false8":false,
+			"nil8":false,
+			"obj8":      null                ,
+			"obj8":
+				[    true    ,
+				{
+				"special-8":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 8":"\u5656",
+				"bigdecimal8":7817265.00000111,
+				"bigdecimal-2-8":127655512123456.761009E-123,
+				"string-8":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int8":4561,
+				"ints8":0,
+				"false8":false,
+				"nil8":false,
+				"obj8":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      ,
+	"special-9":"\\f\n\r\t\uffff",
+	"unicode-\u0000- 9":"\u5656",
+	"bigdecimal9":7817265.00000111,
+	"bigdecimal-2-9":127655512123456.761009E-123,
+	"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+	"int9":4561,
+	"ints9":0,
+	"false9":false,
+	"nil9":false,
+	"n9":      null                ,
+	"obj9":
+		{
+			"special-9":"\\f\n\r\t\uffff",
+			"unicode-\u0000- 9":"\u5656",
+	"bigdecimal9":7817265.00000111,
+			"bigdecimal-2-9":127655512123456.761009E-123,
+			"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+			"int9":4561,
+			"ints9":0,
+			"false9":false,
+			"nil9":false,
+			"obj9":      null                ,
+			"obj9":
+				[    true    ,
+				{
+				"special-9":"\\f\n\r\t\uffff",
+				"unicode-\u0000- 9":"\u5656",
+				"bigdecimal9":7817265.00000111,
+				"bigdecimal-2-9":127655512123456.761009E-123,
+				"string-9":"lorem ipsum, ÄÖÜäöü.-,<!$%&/()9876543XXddddJJJJJJhhhhhhhh",
+				"int9":4561,
+				"ints9":0,
+				"false9":false,
+				"nil9":false,
+				"obj9":      null                
+				
+}
+			]
+		
+}
+
+
+
+                 	
                                                      
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/small_3kb.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/small_3kb.json b/johnzon-core/src/test/resources/bench/small_3kb.json
new file mode 100644
index 0000000..c8994f0
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/small_3kb.json
@@ -0,0 +1,86 @@
+[
+  {
+    "id": 0,
+    "guid": "94ab4571-718f-4734-b331-c68c5d8f3acb",
+    "isActive": false,
+    "balance": "$3,105.88",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "brown",
+    "name": "Weiss Perkins",
+    "gender": "male",
+    "company": "SHOPABOUT",
+    "address": "989 Lake Street, Kipp, Kansas, 2455",
+    "about": "Sint pariatur nostrud aliquip amet elit commodo aliqua. Fugiat nisi dolore aliquip eu. Exercitation dolore cupidatat mollit occaecat minim aliqua pariatur esse esse amet mollit. In dolor voluptate Lorem incididunt voluptate.\r\n",
+    "registered": "2014-03-23T01:37:39 -01:00",
+    "latitude": 80.963663,
+    "longitude": 4.258947,
+    "tags": [
+      "reprehenderit",
+      "incididunt",
+      "dolor",
+      "nostrud",
+      "id",
+      "culpa",
+      "id"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Kimberley Snider"
+      },
+      {
+        "id": 1,
+        "name": "Natasha Hoover"
+      },
+      {
+        "id": 2,
+        "name": "Susana Griffith"
+      }
+    ],
+    "greeting": "Hello, Weiss Perkins! You have 6 unread messages.",
+    "favoriteFruit": "banana"
+  },
+  {
+    "id": 1,
+    "guid": "ca3edf43-8a4c-4102-8f00-ab34fc3242e5",
+    "isActive": true,
+    "balance": "$1,349.81",
+    "picture": "http://placehold.it/32x32",
+    "age": 36,
+    "eyeColor": "blue",
+    "name": "Bessie Koch",
+    "gender": "female",
+    "company": "GEEKY",
+    "address": "318 Noll Street, Toftrees, Washington, 4804",
+    "about": "Consectetur ullamco occaecat cillum amet consequat laboris aliqua qui anim mollit. Esse cillum laborum ipsum esse in reprehenderit irure ex. Ex duis fugiat elit do minim amet Lorem fugiat. Eu ea sit sunt do consequat anim deserunt voluptate in cupidatat id. Labore Lorem est laborum consequat sint exercitation nostrud officia. In velit cupidatat et magna duis aute excepteur tempor eiusmod qui aliquip. Nisi ea anim dolore fugiat fugiat voluptate commodo ullamco id in magna consequat.\r\n",
+    "registered": "2014-06-15T14:31:59 -02:00",
+    "latitude": -22.556508,
+    "longitude": 96.155538,
+    "tags": [
+      "commodo",
+      "reprehenderit",
+      "consectetur",
+      "exercitation",
+      "culpa",
+      "voluptate",
+      "laboris"
+    ],
+    "friends": [
+      {
+        "id": 0,
+        "name": "Duffy Stokes"
+      },
+      {
+        "id": 1,
+        "name": "Faye Wilkins"
+      },
+      {
+        "id": 2,
+        "name": "Blackburn Franklin"
+      }
+    ],
+    "greeting": "Hello, Bessie Koch! You have 7 unread messages.",
+    "favoriteFruit": "strawberry"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/tiny_50b.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/tiny_50b.json b/johnzon-core/src/test/resources/bench/tiny_50b.json
new file mode 100644
index 0000000..33e0693
--- /dev/null
+++ b/johnzon-core/src/test/resources/bench/tiny_50b.json
@@ -0,0 +1,5 @@
+{
+    "debug": "false\ttrue",
+    "number" : 1.4E10
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/unicode_chars_1400kb.txt
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/unicode_chars_1400kb.txt b/johnzon-core/src/test/resources/bench/unicode_chars_1400kb.txt
new file mode 100644
index 0000000..576c24d
Binary files /dev/null and b/johnzon-core/src/test/resources/bench/unicode_chars_1400kb.txt differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/bench/unicode_chars_170kb.txt
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/bench/unicode_chars_170kb.txt b/johnzon-core/src/test/resources/bench/unicode_chars_170kb.txt
new file mode 100644
index 0000000..b06ecff
Binary files /dev/null and b/johnzon-core/src/test/resources/bench/unicode_chars_170kb.txt differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/array.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/array.json b/johnzon-core/src/test/resources/json/array.json
new file mode 100644
index 0000000..6e6bf04
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/array.json
@@ -0,0 +1,8 @@
+[
+    "a",
+    1,
+    {
+        "b": "c"
+    },
+    5
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/bigdecimal.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/bigdecimal.json b/johnzon-core/src/test/resources/json/bigdecimal.json
new file mode 100644
index 0000000..0e4f377
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/bigdecimal.json
@@ -0,0 +1,5 @@
+{
+    "a": 1.23E3,
+    "b": 1.23E-3,
+    "c": 1.23E+3
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/empty.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/empty.json b/johnzon-core/src/test/resources/json/empty.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/empty.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/emptyarray.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/emptyarray.json b/johnzon-core/src/test/resources/json/emptyarray.json
new file mode 100644
index 0000000..90b2a13
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/emptyarray.json
@@ -0,0 +1,3 @@
+[	
+ 
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/escaping.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/escaping.json b/johnzon-core/src/test/resources/json/escaping.json
new file mode 100644
index 0000000..0f4e49b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/escaping.json
@@ -0,0 +1,11 @@
+[
+    "\"",
+    "\\",
+    "\/",
+    "\b",
+    "\f",
+    "\n",
+    "\r",
+    "\t",
+    "\u0044"
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail1.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail1.json b/johnzon-core/src/test/resources/json/fails/fail1.json
new file mode 100644
index 0000000..45dd52e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail1.json
@@ -0,0 +1,8 @@
+{,
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail10.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail10.json b/johnzon-core/src/test/resources/json/fails/fail10.json
new file mode 100644
index 0000000..57374c0
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail10.json
@@ -0,0 +1,7 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail11.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail11.json b/johnzon-core/src/test/resources/json/fails/fail11.json
new file mode 100644
index 0000000..5c18af6
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail11.json
@@ -0,0 +1,8 @@
+
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail12.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail12.json b/johnzon-core/src/test/resources/json/fails/fail12.json
new file mode 100644
index 0000000..fec9295
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail12.json
@@ -0,0 +1,8 @@
+{    q
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail13.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail13.json b/johnzon-core/src/test/resources/json/fails/fail13.json
new file mode 100644
index 0000000..838ba2c
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail13.json
@@ -0,0 +1,8 @@
+{	
+    "a": "b",
+    "c": nul,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail14.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail14.json b/johnzon-core/src/test/resources/json/fails/fail14.json
new file mode 100644
index 0000000..f9e9a91
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail14.json
@@ -0,0 +1,8 @@
+{	"x":
+    "a": "b",
+    "c": 4,
+    "d"": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail15.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail15.json b/johnzon-core/src/test/resources/json/fails/fail15.json
new file mode 100644
index 0000000..518dcb3
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail15.json
@@ -0,0 +1,11 @@
+{
+
+	true,
+    "a": "b",
+    "c": {
+        "d": [
+            1,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail16.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail16.json b/johnzon-core/src/test/resources/json/fails/fail16.json
new file mode 100644
index 0000000..75f8856
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail16.json
@@ -0,0 +1,9 @@
+{
+    "a": "b",
+    "c": {
+        d: [
+            1,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail17.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail17.json b/johnzon-core/src/test/resources/json/fails/fail17.json
new file mode 100644
index 0000000..7e44be3
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail17.json
@@ -0,0 +1,9 @@
+{
+    "a": "b",
+    "c": true {
+        "d": [
+            1,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail18.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail18.json b/johnzon-core/src/test/resources/json/fails/fail18.json
new file mode 100644
index 0000000..c4048ac
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail18.json
@@ -0,0 +1,11 @@
+{
+
+	true
+    "a": "b",
+    "c": {
+        "d": [
+            1,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail19.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail19.json b/johnzon-core/src/test/resources/json/fails/fail19.json
new file mode 100644
index 0000000..686038c
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail19.json
@@ -0,0 +1,10 @@
+{
+
+    "a": "b",
+    "c": {
+        "d": [
+            1,
+            2
+        ]
+    }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail2.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail2.json b/johnzon-core/src/test/resources/json/fails/fail2.json
new file mode 100644
index 0000000..e5ac24b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail2.json
@@ -0,0 +1,8 @@
+{
+    "a":: "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail20.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail20.json b/johnzon-core/src/test/resources/json/fails/fail20.json
new file mode 100644
index 0000000..cb4b1a3
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail20.json
@@ -0,0 +1,10 @@
+{
+
+    "a": "b",
+    "c": {
+        "d": [
+            01,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail21.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail21.json b/johnzon-core/src/test/resources/json/fails/fail21.json
new file mode 100644
index 0000000..b992e92
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail21.json
@@ -0,0 +1,10 @@
+{
+
+    "a": "b",
+    "c": {
+        "d": [
+            1.24ee-20,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail22.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail22.json b/johnzon-core/src/test/resources/json/fails/fail22.json
new file mode 100644
index 0000000..3294a90
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail22.json
@@ -0,0 +1 @@
+garbage in garbage out
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail23.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail23.json b/johnzon-core/src/test/resources/json/fails/fail23.json
new file mode 100644
index 0000000..b10e1d9
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail23.json
@@ -0,0 +1,8 @@
+{
+    "a": "\u6565",
+    "c": "\u123",
+    "d": [
+        
+        -2, "\u0048"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail24.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail24.json b/johnzon-core/src/test/resources/json/fails/fail24.json
new file mode 100644
index 0000000..95fcffd
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail24.json
@@ -0,0 +1,5 @@
+{
+    "a": "a",
+    "c": \u0074\u0072\u0075\u0065
+   
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail25.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail25.json b/johnzon-core/src/test/resources/json/fails/fail25.json
new file mode 100644
index 0000000..f72b803
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail25.json
@@ -0,0 +1,8 @@
+{
+    "a": "\u6565",
+    "c": "\up000",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail26.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail26.json b/johnzon-core/src/test/resources/json/fails/fail26.json
new file mode 100644
index 0000000..128454e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail26.json
@@ -0,0 +1,7 @@
+,{
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail27.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail27.json b/johnzon-core/src/test/resources/json/fails/fail27.json
new file mode 100644
index 0000000..3ae9085
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail27.json
@@ -0,0 +1,7 @@
+"{
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail28.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail28.json b/johnzon-core/src/test/resources/json/fails/fail28.json
new file mode 100644
index 0000000..11ba875
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail28.json
@@ -0,0 +1,7 @@
+true, {
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail29.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail29.json b/johnzon-core/src/test/resources/json/fails/fail29.json
new file mode 100644
index 0000000..8eff000
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail29.json
@@ -0,0 +1,7 @@
+  :   {
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail3.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail3.json b/johnzon-core/src/test/resources/json/fails/fail3.json
new file mode 100644
index 0000000..edec226
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail3.json
@@ -0,0 +1,8 @@
+{
+    "a": , "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail30.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail30.json b/johnzon-core/src/test/resources/json/fails/fail30.json
new file mode 100644
index 0000000..555e395
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail30.json
@@ -0,0 +1,7 @@
+null{
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail31.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail31.json b/johnzon-core/src/test/resources/json/fails/fail31.json
new file mode 100644
index 0000000..f1c8332
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail31.json
@@ -0,0 +1,7 @@
+"string":{
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail32.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail32.json b/johnzon-core/src/test/resources/json/fails/fail32.json
new file mode 100644
index 0000000..7883a28
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail32.json
@@ -0,0 +1,7 @@
+{
+    "a": "\u6565",
+    "d": [
+        
+        -2, 20e-1.2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail33.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail33.json b/johnzon-core/src/test/resources/json/fails/fail33.json
new file mode 100644
index 0000000..308571d
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail33.json
@@ -0,0 +1,7 @@
+14{
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail34.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail34.json b/johnzon-core/src/test/resources/json/fails/fail34.json
new file mode 100644
index 0000000..619a684
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail34.json
@@ -0,0 +1,7 @@
+{
+    "a": "\u6565",
+    "d": [
+        
+        -2, 2.0e-1.2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail35.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail35.json b/johnzon-core/src/test/resources/json/fails/fail35.json
new file mode 100644
index 0000000..cfda2b8
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail35.json
@@ -0,0 +1,7 @@
+ ,   {
+    "a": "\u6565",
+    "d": [
+        
+        -2, "\u0044"
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail36.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail36.json b/johnzon-core/src/test/resources/json/fails/fail36.json
new file mode 100644
index 0000000..57fff2f
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail36.json
@@ -0,0 +1,3 @@
+{
+    "a": "	"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail37.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail37.json b/johnzon-core/src/test/resources/json/fails/fail37.json
new file mode 100644
index 0000000..6e894f9
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail37.json
@@ -0,0 +1,4 @@
+{
+    "a
+    ": "x"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail38.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail38.json b/johnzon-core/src/test/resources/json/fails/fail38.json
new file mode 100644
index 0000000..0c90427
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail38.json
@@ -0,0 +1,3 @@
+{
+    "a": 12.2e-
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail39.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail39.json b/johnzon-core/src/test/resources/json/fails/fail39.json
new file mode 100644
index 0000000..ac47891
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail39.json
@@ -0,0 +1,3 @@
+{
+    "a": 12.2e
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail4.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail4.json b/johnzon-core/src/test/resources/json/fails/fail4.json
new file mode 100644
index 0000000..70fbe2f
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail4.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",,
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail40.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail40.json b/johnzon-core/src/test/resources/json/fails/fail40.json
new file mode 100644
index 0000000..7a503fb
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail40.json
@@ -0,0 +1,4 @@
+{
+    "a": "v"
+}
+some garbage
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail41.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail41.json b/johnzon-core/src/test/resources/json/fails/fail41.json
new file mode 100644
index 0000000..352963d
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail41.json
@@ -0,0 +1,3 @@
+{
+    "a": "\vbadescape"
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail42.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail42.json b/johnzon-core/src/test/resources/json/fails/fail42.json
new file mode 100644
index 0000000..ed6e301
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail42.json
@@ -0,0 +1,3 @@
+{
+    "a": -055
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail43.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail43.json b/johnzon-core/src/test/resources/json/fails/fail43.json
new file mode 100644
index 0000000..46fcf2e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail43.json
@@ -0,0 +1,3 @@
+{
+    "a": -01.55
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail44.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail44.json b/johnzon-core/src/test/resources/json/fails/fail44.json
new file mode 100644
index 0000000..4e963bb
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail44.json
@@ -0,0 +1,3 @@
+{
+    "a": -00001.55
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail45.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail45.json b/johnzon-core/src/test/resources/json/fails/fail45.json
new file mode 100644
index 0000000..ccc49ff
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail45.json
@@ -0,0 +1,3 @@
+{
+    "a": " before this word the is a u+0001 char"
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail46.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail46.json b/johnzon-core/src/test/resources/json/fails/fail46.json
new file mode 100644
index 0000000..54b8681
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail46.json
@@ -0,0 +1,3 @@
+{
+    "a": "before this is a u+00031 char"
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail47.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail47.json b/johnzon-core/src/test/resources/json/fails/fail47.json
new file mode 100644
index 0000000..13f6f1d
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail47.json
@@ -0,0 +1 @@
+[1,]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail48.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail48.json b/johnzon-core/src/test/resources/json/fails/fail48.json
new file mode 100644
index 0000000..e4d4ddd
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail48.json
@@ -0,0 +1,6 @@
+[1,
+2,
+3,
+4,
+5,
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail49.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail49.json b/johnzon-core/src/test/resources/json/fails/fail49.json
new file mode 100644
index 0000000..3acaa8f
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail49.json
@@ -0,0 +1 @@
+{"a":1,}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail5.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail5.json b/johnzon-core/src/test/resources/json/fails/fail5.json
new file mode 100644
index 0000000..2fd140f
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail5.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        1 2,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail50.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail50.json b/johnzon-core/src/test/resources/json/fails/fail50.json
new file mode 100644
index 0000000..c7e2925
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail50.json
@@ -0,0 +1,4 @@
+{
+"a":1,
+"b":2,
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail51.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail51.json b/johnzon-core/src/test/resources/json/fails/fail51.json
new file mode 100644
index 0000000..dec2b86
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail51.json
@@ -0,0 +1 @@
+["\uDFAA (missing high surrogate)"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail52.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail52.json b/johnzon-core/src/test/resources/json/fails/fail52.json
new file mode 100644
index 0000000..eeea18b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail52.json
@@ -0,0 +1 @@
+["\uD888\u3210 (invalid second surrogate)"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail53.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail53.json b/johnzon-core/src/test/resources/json/fails/fail53.json
new file mode 100644
index 0000000..5819cae
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail53.json
@@ -0,0 +1,11 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    "-10", -10,
+    "100": 100
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail54.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail54.json b/johnzon-core/src/test/resources/json/fails/fail54.json
new file mode 100644
index 0000000..0fffc9b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail54.json
@@ -0,0 +1,12 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    "-10"  -10,
+    "100": 100,
+    "-100", -100
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail55.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail55.json b/johnzon-core/src/test/resources/json/fails/fail55.json
new file mode 100644
index 0000000..a3a4074
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail55.json
@@ -0,0 +1,12 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    -10  -10,
+    "100": 100,
+    "-100", -100
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail56.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail56.json b/johnzon-core/src/test/resources/json/fails/fail56.json
new file mode 100644
index 0000000..820d41e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail56.json
@@ -0,0 +1,11 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    "-10", "-10",
+    "100": 100
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail57.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail57.json b/johnzon-core/src/test/resources/json/fails/fail57.json
new file mode 100644
index 0000000..ffe9c1c
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail57.json
@@ -0,0 +1 @@
+["a":3]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail58.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail58.json b/johnzon-core/src/test/resources/json/fails/fail58.json
new file mode 100644
index 0000000..270b5d5
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail58.json
@@ -0,0 +1,3 @@
+{
+  "0":["a":3]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail59.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail59.json b/johnzon-core/src/test/resources/json/fails/fail59.json
new file mode 100644
index 0000000..81750b9
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail59.json
@@ -0,0 +1 @@
+{
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail6.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail6.json b/johnzon-core/src/test/resources/json/fails/fail6.json
new file mode 100644
index 0000000..290615e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail6.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        2
+    ]]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail60.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail60.json b/johnzon-core/src/test/resources/json/fails/fail60.json
new file mode 100644
index 0000000..17be25b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail60.json
@@ -0,0 +1 @@
+[ {}, [] }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail61.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail61.json b/johnzon-core/src/test/resources/json/fails/fail61.json
new file mode 100644
index 0000000..0b9fc5b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail61.json
@@ -0,0 +1,3 @@
+{
+    "a": -
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail62.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail62.json b/johnzon-core/src/test/resources/json/fails/fail62.json
new file mode 100644
index 0000000..ac5e00d
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail62.json
@@ -0,0 +1,3 @@
+{
+    "a":
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail63.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail63.json b/johnzon-core/src/test/resources/json/fails/fail63.json
new file mode 100644
index 0000000..29bdc57
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail63.json
@@ -0,0 +1,3 @@
+{
+    "a"
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail64.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail64.json b/johnzon-core/src/test/resources/json/fails/fail64.json
new file mode 100644
index 0000000..3edb81e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail64.json
@@ -0,0 +1,3 @@
+{
+    "a": 1.,
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail65.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail65.json b/johnzon-core/src/test/resources/json/fails/fail65.json
new file mode 100644
index 0000000..3adb8bb
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail65.json
@@ -0,0 +1,3 @@
+{
+    "a": .5,
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail66.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail66.json b/johnzon-core/src/test/resources/json/fails/fail66.json
new file mode 100644
index 0000000..129cac0
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail66.json
@@ -0,0 +1,3 @@
+{
+    "a": 1-,
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail67.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail67.json b/johnzon-core/src/test/resources/json/fails/fail67.json
new file mode 100644
index 0000000..5df5fe3
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail67.json
@@ -0,0 +1,3 @@
+{
+    "a": 1.-,
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail68.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail68.json b/johnzon-core/src/test/resources/json/fails/fail68.json
new file mode 100644
index 0000000..2c44166
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail68.json
@@ -0,0 +1,3 @@
+{
+    "a": 1.9e-1.2,
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail69.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail69.json b/johnzon-core/src/test/resources/json/fails/fail69.json
new file mode 100644
index 0000000..349826b
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail69.json
@@ -0,0 +1,3 @@
+{
+    12
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail7.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail7.json b/johnzon-core/src/test/resources/json/fails/fail7.json
new file mode 100644
index 0000000..072487f
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail7.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        1..56,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail70.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail70.json b/johnzon-core/src/test/resources/json/fails/fail70.json
new file mode 100644
index 0000000..0c90165
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail70.json
@@ -0,0 +1,3 @@
+{
+    null null
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail71.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail71.json b/johnzon-core/src/test/resources/json/fails/fail71.json
new file mode 100644
index 0000000..819e165
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail71.json
@@ -0,0 +1,3 @@
+{
+    null
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail72.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail72.json b/johnzon-core/src/test/resources/json/fails/fail72.json
new file mode 100644
index 0000000..02beb05
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail72.json
@@ -0,0 +1,3 @@
+{
+    "a","b"
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail8.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail8.json b/johnzon-core/src/test/resources/json/fails/fail8.json
new file mode 100644
index 0000000..3de92f7
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail8.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        +1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/fail9.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/fail9.json b/johnzon-core/src/test/resources/json/fails/fail9.json
new file mode 100644
index 0000000..9464907
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/fail9.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d"": [
+        1,
+        2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/fails/numbers.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/fails/numbers.json b/johnzon-core/src/test/resources/json/fails/numbers.json
new file mode 100644
index 0000000..d300022
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/fails/numbers.json
@@ -0,0 +1,18 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    "-10", -10,
+    "100": 100,
+    "-100", -100,
+    "456": 456,
+    "-456": -456,
+    "123.12345": 123.12345,
+    "-123.12345": -123.12345,
+    "999999999999999999999999999999": 999999999999999999999999999999,
+    "-999999999999999999999999999999": -999999999999999999999999999999
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/nested.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/nested.json b/johnzon-core/src/test/resources/json/nested.json
new file mode 100644
index 0000000..d6f09f8
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/nested.json
@@ -0,0 +1,9 @@
+{
+    "a": "b",
+    "c": {
+        "d": [
+            1,
+            2
+        ]
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/numbers.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/numbers.json b/johnzon-core/src/test/resources/json/numbers.json
new file mode 100644
index 0000000..847a9f8
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/numbers.json
@@ -0,0 +1,18 @@
+{
+    "0": 0,
+    "0": -0,
+    "1": 1,
+    "-1": -1,
+    "9": 9,
+    "-9": -9,
+    "10": 10,
+    "-10": -10,
+    "100": 100,
+    "-100": -100,
+    "456": 456,
+    "-456": -456,
+    "123.12345": 123.12345,
+    "-123.12345": -123.12345,
+    "999999999999999999999999999999": 999999999999999999999999999999,
+    "-999999999999999999999999999999": -999999999999999999999999999999
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/simple.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/simple.json b/johnzon-core/src/test/resources/json/simple.json
new file mode 100644
index 0000000..78be59e
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/simple.json
@@ -0,0 +1,8 @@
+{
+    "a": "b",
+    "c": 4,
+    "d": [
+        1,
+        -2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/simple2.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/simple2.json b/johnzon-core/src/test/resources/json/simple2.json
new file mode 100644
index 0000000..2578a23
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/simple2.json
@@ -0,0 +1,8 @@
+{
+ "a": "b",
+ "c": 4,
+ "d": [
+  1,
+  -2
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/simple_utf16le.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/simple_utf16le.json b/johnzon-core/src/test/resources/json/simple_utf16le.json
new file mode 100644
index 0000000..c2e2137
Binary files /dev/null and b/johnzon-core/src/test/resources/json/simple_utf16le.json differ

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/special.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/special.json b/johnzon-core/src/test/resources/json/special.json
new file mode 100644
index 0000000..065c1b3
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/special.json
@@ -0,0 +1,18 @@
+{
+    "a{": "b,,",
+    "c::::": ":4::,[{",
+    "d": [
+        1,
+        2,
+        null,
+        false,
+        true,
+        4.2
+    ],
+    "w":4.6676123,
+    "r": 0.001,
+    "1.4312":110,
+    "\u0044":null,
+    "\"":"\"",
+    "থii:üäöÖ.,;.-<>!§$%&()=?ß´'`*+#":					"ন:4::,[{"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/stringescape.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/stringescape.json b/johnzon-core/src/test/resources/json/stringescape.json
new file mode 100644
index 0000000..d9c3ddb
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/stringescape.json
@@ -0,0 +1,3 @@
+{
+    "name": "s\"mit\""
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-core/src/test/resources/json/unicode.json
----------------------------------------------------------------------
diff --git a/johnzon-core/src/test/resources/json/unicode.json b/johnzon-core/src/test/resources/json/unicode.json
new file mode 100644
index 0000000..07e5d4d
--- /dev/null
+++ b/johnzon-core/src/test/resources/json/unicode.json
@@ -0,0 +1,10 @@
+{
+    "a": "\u6565",
+    "z": "",
+    "c": "\u0000",
+    "f": "\u0070\u0070\u0070a\u0070+++\u0070",
+    "d": [
+        
+        -2, "\u0020",""
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/pom.xml b/johnzon-jaxrs/pom.xml
new file mode 100644
index 0000000..a328c08
--- /dev/null
+++ b/johnzon-jaxrs/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>johnzon</artifactId>
+    <groupId>org.apache.johnzon</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>johnzon-jaxrs</artifactId>
+  <name>Johnzon :: JAX-RS</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.ws.rs</groupId>
+      <artifactId>javax.ws.rs-api</artifactId>
+      <version>2.0</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.johnzon</groupId>
+      <artifactId>johnzon-mapper</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-rs-client</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-local</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <properties>
+    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
+    <cxf.version>3.0.0</cxf.version>
+  </properties>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/DelegateProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/DelegateProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/DelegateProvider.java
new file mode 100644
index 0000000..aee0790
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/DelegateProvider.java
@@ -0,0 +1,73 @@
+/*
+ * 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.jaxrs;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.MessageBodyWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+public abstract class DelegateProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T>  {
+    private final MessageBodyReader<T> reader;
+    private final MessageBodyWriter<T> writer;
+
+    protected DelegateProvider(final MessageBodyReader<T> reader, final MessageBodyWriter<T> writer) {
+        this.reader = reader;
+        this.writer = writer;
+    }
+
+    @Override
+    public boolean isReadable(final Class<?> rawType, final Type genericType,
+                              final Annotation[] annotations, final MediaType mediaType) {
+        return reader.isReadable(rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public T readFrom(final Class<T> rawType, final Type genericType,
+                      final Annotation[] annotations, final MediaType mediaType,
+                      final MultivaluedMap<String, String> httpHeaders,
+                      final InputStream entityStream) throws IOException {
+        return reader.readFrom(rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
+    }
+
+    @Override
+    public long getSize(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType) {
+        return writer.getSize(t, rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public boolean isWriteable(final Class<?> rawType, final Type genericType,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return writer.isWriteable(rawType, genericType, annotations, mediaType);
+    }
+
+    @Override
+    public void writeTo(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType,
+                        final MultivaluedMap<String, Object> httpHeaders,
+                        final OutputStream entityStream) throws IOException {
+        writer.writeTo(t, rawType, genericType, annotations, mediaType, httpHeaders, entityStream);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
new file mode 100644
index 0000000..ad55a4d
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyReader.java
@@ -0,0 +1,75 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.johnzon.mapper.Mapper;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+import javax.json.JsonStructure;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+import static org.apache.johnzon.jaxrs.Jsons.isJson;
+
+@Provider
+@Consumes(WILDCARD)
+public class JohnzonMessageBodyReader<T> implements MessageBodyReader<T> {
+    private final Mapper mapper;
+
+    public JohnzonMessageBodyReader() {
+        this(new MapperBuilder().setDoCloseOnStreams(false).build());
+    }
+
+    public JohnzonMessageBodyReader(final Mapper mapper) {
+        this.mapper = mapper;
+    }
+
+    @Override
+    public boolean isReadable(final Class<?> rawType, final Type genericType,
+                              final Annotation[] annotations, final MediaType mediaType) {
+        return isJson(mediaType)
+                && InputStream.class != rawType && Reader.class != rawType
+                && String.class != rawType
+                && !JsonStructure.class.isAssignableFrom(rawType);
+    }
+
+    @Override
+    public T readFrom(final Class<T> rawType, final Type genericType,
+                      final Annotation[] annotations, final MediaType mediaType,
+                      final MultivaluedMap<String, String> httpHeaders,
+                      final InputStream entityStream) throws IOException {
+        if (rawType.isArray()) {
+            return (T) mapper.readArray(entityStream, rawType.getComponentType());
+        } else if (Collection.class.isAssignableFrom(rawType) && ParameterizedType.class.isInstance(genericType)) {
+            return (T) mapper.<Collection<T>,T>readCollection(entityStream, ParameterizedType.class.cast(genericType), rawType);
+        }
+        return mapper.readObject(entityStream, genericType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
new file mode 100644
index 0000000..a540d6d
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonMessageBodyWriter.java
@@ -0,0 +1,88 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.johnzon.mapper.Mapper;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+import javax.json.JsonStructure;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+
+@Provider
+@Produces(WILDCARD)
+public class JohnzonMessageBodyWriter<T> implements MessageBodyWriter<T> {
+    private final Mapper mapper;
+
+    public JohnzonMessageBodyWriter() {
+        this(new MapperBuilder().setDoCloseOnStreams(false).build());
+    }
+
+    public JohnzonMessageBodyWriter(final Mapper mapper) {
+        this.mapper = mapper;
+    }
+
+    @Override
+    public long getSize(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    public boolean isWriteable(final Class<?> rawType, final Type genericType,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return Jsons.isJson(mediaType)
+                && InputStream.class != rawType
+                && OutputStream.class != rawType
+                && Writer.class != rawType
+                && StreamingOutput.class != rawType
+                && String.class != rawType
+                && Response.class != rawType
+                && !JsonStructure.class.isAssignableFrom(rawType);
+    }
+
+    @Override
+    public void writeTo(final T t, final Class<?> rawType, final Type genericType,
+                        final Annotation[] annotations, final MediaType mediaType,
+                        final MultivaluedMap<String, Object> httpHeaders,
+                        final OutputStream entityStream) throws IOException {
+        if (rawType.isArray()) {
+            mapper.writeArray(t, entityStream);
+        } else if (Collection.class.isAssignableFrom(rawType) && ParameterizedType.class.isInstance(genericType)) {
+            mapper.writeArray(Collection.class.cast(t), entityStream);
+        } else {
+            mapper.writeObject(t, entityStream);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
new file mode 100644
index 0000000..a72e9f1
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JohnzonProvider.java
@@ -0,0 +1,41 @@
+/*
+ * 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.jaxrs;
+
+import org.apache.johnzon.mapper.Mapper;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.ext.Provider;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+
+@Provider
+@Produces(WILDCARD)
+@Consumes(WILDCARD)
+public class JohnzonProvider<T> extends DelegateProvider<T> {
+    public JohnzonProvider(final Mapper mapper) {
+        super(new JohnzonMessageBodyReader<T>(mapper), new JohnzonMessageBodyWriter<T>(mapper));
+    }
+
+    public JohnzonProvider() {
+        this(new MapperBuilder().setDoCloseOnStreams(false).build());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/Jsons.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/Jsons.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/Jsons.java
new file mode 100644
index 0000000..542347e
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/Jsons.java
@@ -0,0 +1,39 @@
+/*
+ * 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.jaxrs;
+
+import javax.ws.rs.core.MediaType;
+
+public class Jsons {
+    public static boolean isJson(final MediaType mediaType) {
+        if (mediaType != null) {
+            final String subtype = mediaType.getSubtype();
+            return "json".equalsIgnoreCase(subtype)
+                    || "javascript".equals(subtype)
+                    || "x-json".equals(subtype)
+                    || "x-javascript".equals(subtype)
+                    || subtype.endsWith("+json");
+        }
+        return true;
+    }
+
+    private Jsons() {
+        // no-op
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyReader.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyReader.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyReader.java
new file mode 100644
index 0000000..b4e70f7
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyReader.java
@@ -0,0 +1,75 @@
+/*
+ * 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.jaxrs;
+
+import javax.json.Json;
+import javax.json.JsonReader;
+import javax.json.JsonReaderFactory;
+import javax.json.JsonStructure;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+
+@Provider
+@Consumes(WILDCARD)
+public class JsrMessageBodyReader implements MessageBodyReader<JsonStructure> {
+    private final JsonReaderFactory factory;
+    private final boolean closeStream;
+
+    public JsrMessageBodyReader() {
+        this(Json.createReaderFactory(Collections.<String, Object>emptyMap()), false);
+    }
+
+    public JsrMessageBodyReader(final JsonReaderFactory factory, final boolean closeStream) {
+        this.factory = factory;
+        this.closeStream = closeStream;
+    }
+
+    @Override
+    public boolean isReadable(final Class<?> aClass, final Type type,
+                              final Annotation[] annotations, final MediaType mediaType) {
+        return JsonStructure.class.isAssignableFrom(aClass);
+    }
+
+    @Override
+    public JsonStructure readFrom(final Class<JsonStructure> jsonStructureClass, final Type type,
+                                  final Annotation[] annotations, final MediaType mediaType,
+                                  final MultivaluedMap<String, String> stringStringMultivaluedMap,
+                                  final InputStream inputStream) throws IOException, WebApplicationException {
+        JsonReader reader = null;
+        try {
+            reader = factory.createReader(inputStream);
+            return reader.read();
+        } finally {
+            if (closeStream && reader != null) {
+                reader.close();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/6e86a53e/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyWriter.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyWriter.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyWriter.java
new file mode 100644
index 0000000..a6acfbe
--- /dev/null
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/JsrMessageBodyWriter.java
@@ -0,0 +1,88 @@
+/*
+ * 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.jaxrs;
+
+import javax.json.Json;
+import javax.json.JsonStructure;
+import javax.json.JsonWriter;
+import javax.json.JsonWriterFactory;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.Flushable;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+
+import static javax.ws.rs.core.MediaType.WILDCARD;
+
+@Provider
+@Produces(WILDCARD)
+public class JsrMessageBodyWriter implements MessageBodyWriter<JsonStructure> {
+    private final JsonWriterFactory factory;
+    private final boolean close;
+
+    public JsrMessageBodyWriter() {
+        this(Json.createWriterFactory(Collections.<String, Object>emptyMap()), false);
+    }
+
+    public JsrMessageBodyWriter(final JsonWriterFactory factory, final boolean closeStreams) {
+        this.factory = factory;
+        this.close = closeStreams;
+    }
+
+    @Override
+    public boolean isWriteable(final Class<?> aClass, final Type type,
+                               final Annotation[] annotations, final MediaType mediaType) {
+        return JsonStructure.class.isAssignableFrom(aClass);
+    }
+
+    @Override
+    public long getSize(final JsonStructure jsonStructure, final Class<?> aClass,
+                        final Type type, final Annotation[] annotations,
+                        final MediaType mediaType) {
+        return -1;
+    }
+
+    @Override
+    public void writeTo(final JsonStructure jsonStructure,
+                        final Class<?> aClass, final Type type,
+                        final Annotation[] annotations, final MediaType mediaType,
+                        final MultivaluedMap<String, Object> stringObjectMultivaluedMap,
+                        final OutputStream outputStream) throws IOException, WebApplicationException {
+        JsonWriter writer = null;
+        try {
+            writer = factory.createWriter(outputStream);
+            writer.write(jsonStructure);
+        } finally {
+            if (writer != null) {
+                if (close) {
+                    writer.close();
+                } else if (Flushable.class.isInstance(writer)) {
+                    Flushable.class.cast(writer).flush();
+                }
+            }
+        }
+    }
+}