You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by da...@apache.org on 2016/07/05 13:45:41 UTC

svn commit: r1751471 - in /felix/trunk/converter/src: main/java/org/apache/felix/converter/impl/json/ test/java/org/apache/felix/converter/impl/json/

Author: davidb
Date: Tue Jul  5 13:45:41 2016
New Revision: 1751471

URL: http://svn.apache.org/viewvc?rev=1751471&view=rev
Log:
Felix Converter Service - use the Json Parser with the decoder.

Modified:
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java
    felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java
    felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonParserTest.java
    felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonSerializationTest.java

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java?rev=1751471&r1=1751470&r2=1751471&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonDecodingImpl.java Tue Jul  5 13:45:41 2016
@@ -19,7 +19,6 @@ package org.apache.felix.converter.impl.
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.nio.charset.Charset;
-import java.util.HashMap;
 import java.util.Map;
 
 import org.osgi.service.converter.Converter;
@@ -42,82 +41,14 @@ public class JsonDecodingImpl<T> impleme
         return deserializeSingleJSONValue(clazz, in);
     }
 
+    @SuppressWarnings("unchecked")
     private T createMapFromJSONString(CharSequence in) {
-        Map m = new HashMap();
-        String s = in.toString().trim();
-        if (!s.startsWith("{") || !s.endsWith("}"))
-            throw new IllegalArgumentException("JSON Should start and end with '{' and '}': " + s);
-
-        // Eat braces
-        s = s.substring(1, s.length() - 1);
-
-        int commaIdx = -1;
-        do {
-            int colonIdx = s.indexOf(':');
-            if (colonIdx <= 0)
-                throw new IllegalArgumentException("JSON Should contain key-value pairs: " + s);
-
-            String key = s.substring(0, colonIdx).trim();
-            if (!key.startsWith("\"") || !key.endsWith("\""))
-                throw new IllegalArgumentException("JSON key should be double-quoted: " + s);
-            key = key.substring(1, key.length() - 1);
-
-            // move to after ':'
-            s = s.substring(colonIdx + 1);
-
-            commaIdx = getNextComma(s);
-            String val;
-            if (commaIdx > 0) {
-                val = s.substring(0, commaIdx);
-
-                // move to after ','
-                s = s.substring(commaIdx + 1);
-            } else {
-                val = s;
-            }
-
-
-            val = val.trim();
-            Object parsed;
-            if (val.startsWith("{")) {
-                parsed = new JsonCodecImpl().decode(Map.class).from(val);
-            } else {
-                if ("null".equals(val))
-                    parsed = null;
-                else if ("true".equals(val))
-                    parsed = true;
-                else if ("false".equals(val))
-                    parsed = false;
-                else if (val.startsWith("\"") && val.endsWith("\""))
-                    parsed = val.substring(1, val.length() - 1);
-                else if (val.contains("."))
-                    parsed = Double.valueOf(val);
-                else
-                    parsed = Long.valueOf(val);
-            }
-            m.put(key, parsed);
-        } while (commaIdx > 0);
-
-        return (T) m;
-    }
-
-    private int getNextComma(String s) {
-        int bracelevel = 0;
-        for (int i=0; i<s.length(); i++) {
-            switch(s.charAt(i)) {
-            case '{': bracelevel++;
-                break;
-            case '}': bracelevel--;
-                break;
-            case ',': if (bracelevel == 0) return i;
-                break;
-            }
-        }
-        return -1;
+        JsonParser jp = new JsonParser((String) in);
+        return (T) jp.getParsed();
     }
 
     @SuppressWarnings("unchecked")
-    private <T> T deserializeSingleJSONValue(Class<T> cls, CharSequence cs) {
+    private T deserializeSingleJSONValue(Class<T> cls, CharSequence cs) {
         try {
             Method m = cls.getDeclaredMethod("valueOf", String.class);
             if (m != null) {

Modified: felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java?rev=1751471&r1=1751470&r2=1751471&view=diff
==============================================================================
--- felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java (original)
+++ felix/trunk/converter/src/main/java/org/apache/felix/converter/impl/json/JsonParser.java Tue Jul  5 13:45:41 2016
@@ -40,8 +40,6 @@ import org.apache.felix.converter.impl.U
  * <li>Nested JSON objects are parsed into a {@link java.util.Map Map&lt;String, Object&gt;}.
  * <li>JSON lists are parsed into a {@link java.util.List} which may contain any of the above values.
  * </ul>
- *
- * @author David Bosschaert
  */
 public class JsonParser {
     private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("^\\s*[\"](.+?)[\"]\\s*[:]\\s*(.+)$");
@@ -119,6 +117,9 @@ public class JsonParser {
         case 'f':
         case 'F':
             return Boolean.parseBoolean(jsonValue);
+        case 'n':
+        case 'N':
+            return null;
         default:
             return Long.parseLong(jsonValue);
         }

Modified: felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonParserTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonParserTest.java?rev=1751471&r1=1751470&r2=1751471&view=diff
==============================================================================
--- felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonParserTest.java (original)
+++ felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonParserTest.java Tue Jul  5 13:45:41 2016
@@ -16,6 +16,7 @@
  */
 package org.apache.felix.converter.impl.json;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import org.junit.Test;
@@ -25,7 +26,7 @@ import static org.junit.Assert.assertTru
 
 public class JsonParserTest {
     @Test
-    public void testJSON() {
+    public void testJsonSimple() {
         String json = "{\"hi\": \"ho\", \"ha\": true}";
         JsonParser jp = new JsonParser(json);
         Map<String, Object> m = jp.getParsed();
@@ -36,11 +37,12 @@ public class JsonParserTest {
 
     @Test
     @SuppressWarnings("unchecked")
-    public void testJSON2() {
-        String json = "{\"b\": {\"x\": 12, \"y\": 42, \"z\": {\"test test\": \"hello hello\"}}}";
+    public void testJsonComplex() {
+        String json = "{\"a\": [1,2,3,4,5], \"b\": {\"x\": 12, \"y\": 42, \"z\": {\"test test\": \"hello hello\"}}}";
         JsonParser jp = new JsonParser(json);
         Map<String, Object> m = jp.getParsed();
-        assertEquals(1, m.size());
+        assertEquals(2, m.size());
+        assertEquals(Arrays.asList(1L, 2L, 3L, 4L, 5L), m.get("a"));
         Map<String, Object> mb = (Map<String, Object>) m.get("b");
         assertEquals(3, mb.size());
         assertEquals(12L, mb.get("x"));
@@ -49,4 +51,13 @@ public class JsonParserTest {
         assertEquals(1, mz.size());
         assertEquals("hello hello", mz.get("test test"));
     }
+
+    @Test
+    public void testJsonArray() {
+        String json = "{\"abc\": [\"x\", \"y\", \"z\"]}";
+        JsonParser jp = new JsonParser(json);
+        Map<String, Object> m = jp.getParsed();
+        assertEquals(1, m.size());
+        assertEquals(Arrays.asList("x", "y", "z"), m.get("abc"));
+    }
 }

Modified: felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonSerializationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonSerializationTest.java?rev=1751471&r1=1751470&r2=1751471&view=diff
==============================================================================
--- felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonSerializationTest.java (original)
+++ felix/trunk/converter/src/test/java/org/apache/felix/converter/impl/json/JsonSerializationTest.java Tue Jul  5 13:45:41 2016
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertEqu
 
 public class JsonSerializationTest {
     @Test
+    @SuppressWarnings("unchecked")
     public void testComplexMapSerialization() {
         Map<String, Object> m = new LinkedHashMap<>();
         m.put("sKey", "a string");
@@ -47,6 +48,16 @@ public class JsonSerializationTest {
                 + "\"simpleArray\":[1,2,3],"
                 + "\"simpleObject\":{\"a\":1,\"b\":\"hello\"}}";
         assertEquals(expected, new JsonCodecImpl().encode(m).toString());
+
+        Map<String, Object> dm = new JsonCodecImpl().decode(Map.class).from(expected);
+        Map<String, Object> expected2 = new LinkedHashMap<>();
+        expected2.put("sKey", "a string");
+        expected2.put("iKey", 42L);
+        expected2.put("bKey",  true);
+        expected2.put("noKey", null);
+        expected2.put("simpleArray", Arrays.asList(1L,2L,3L));
+        expected2.put("simpleObject", m1);
+        assertEquals(expected2, dm);
     }
 
     @Test