Author: davidb
Date: Mon Jun 13 16:22:44 2016
New Revision: 1748281

URL: http://svn.apache.org/viewvc?rev=1748281&view=rev
Log:
Felix Converter - Additional JSON serialization tests.

Added:
    
felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/JSONSerializationTest.java
Removed:
    
felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/SerializationTest.java
Modified:
    
felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/JsonEncodingImpl.java

Modified: 
felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/JsonEncodingImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/JsonEncodingImpl.java?rev=1748281&r1=1748280&r2=1748281&view=diff
==============================================================================
--- 
felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/JsonEncodingImpl.java
 (original)
+++ 
felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/JsonEncodingImpl.java
 Mon Jun 13 16:22:44 2016
@@ -18,8 +18,12 @@ package org.apache.felix.converter.impl;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.reflect.Array;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -56,6 +60,7 @@ public class JsonEncodingImpl implements
         return encode(object);
     }
 
+    @SuppressWarnings("rawtypes")
     public String encode(Object obj) {
         if (obj == null) {
             return ignoreNull() ? "" : "null";
@@ -63,6 +68,10 @@ public class JsonEncodingImpl implements
 
         if (obj instanceof Map) {
             return encodeMap((Map) obj);
+        } else if (obj instanceof Collection) {
+            return encodeCollection((Collection) obj);
+        } else if (obj.getClass().isArray()) {
+            return encodeCollection(asCollection(obj));
         } else if (obj instanceof Number) {
             return obj.toString();
         } else if (obj instanceof Boolean) {
@@ -72,6 +81,34 @@ public class JsonEncodingImpl implements
         return "\"" + converter.convert(obj).to(String.class) + "\"";
     }
 
+    private Collection<?> asCollection(Object arr) {
+        // Arrays.asList() doesn't work for primitive arrays
+        int len = Array.getLength(arr);
+        List<Object> l = new ArrayList<>(len);
+        for (int i=0; i<len; i++) {
+            l.add(Array.get(arr, i));
+        }
+        return l;
+    }
+
+    private String encodeCollection(Collection<?> collection) {
+        StringBuilder sb = new StringBuilder("[");
+
+        boolean first = true;
+        for (Object o : collection) {
+            if (first)
+                first = false;
+            else
+                sb.append(',');
+
+            sb.append(encode(o));
+        }
+
+        sb.append("]");
+        return sb.toString();
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     private String encodeMap(Map m) {
         StringBuilder sb = new StringBuilder("{");
         for (Entry<?,?> entry : (Set<Entry>) m.entrySet()) {

Added: 
felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/JSONSerializationTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/JSONSerializationTest.java?rev=1748281&view=auto
==============================================================================
--- 
felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/JSONSerializationTest.java
 (added)
+++ 
felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/JSONSerializationTest.java
 Mon Jun 13 16:22:44 2016
@@ -0,0 +1,69 @@
+/*
+ * 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.felix.converter.impl;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class JSONSerializationTest {
+    @Test
+    public void testComplexMapSerialization() {
+        Map<String, Object> m = new HashMap<>();
+        m.put("sKey", "a string");
+        m.put("iKey", 42);
+        m.put("bKey",  true);
+        m.put("noKey", null);
+        m.put("simpleArray", new int[] {1,2,3});
+
+        Map<String, Object> m1 = new HashMap<>();
+        m1.put("a", 1L);
+        m1.put("b", "hello");
+        m.put("simpleObject", m1);
+
+        String expected = "{\"bKey\":true,"
+                + "\"simpleArray\":[1,2,3],"
+                + "\"iKey\":42,"
+                + "\"sKey\":\"a string\","
+                + "\"simpleObject\":{\"a\":1,\"b\":\"hello\"},"
+                + "\"noKey\":null}";
+        assertEquals(expected, new JsonCodecImpl().encode(m).toString());
+    }
+
+    @Test
+    public void testComplexMapSerialization2() {
+        Map<String, Object> m2 = new HashMap<>();
+        m2.put("yes", Boolean.TRUE);
+        m2.put("no", Collections.singletonMap("maybe", false));
+
+        Map<String, Object> cm = new HashMap<>();
+        cm.put("list", Arrays.asList(
+                Collections.singletonMap("x", "y"),
+                Collections.singletonMap("x", "b")));
+        cm.put("embedded", m2);
+
+        String expected = "{\"list\":[{\"x\":\"y\"},{\"x\":\"b\"}],"
+                + "\"embedded\":"
+                + "{\"no\":{\"maybe\":false},\"yes\":true}}";
+        assertEquals(expected, new JsonCodecImpl().encode(cm).toString());
+    }
+}


Reply via email to