Author: davidb
Date: Thu May 25 15:20:26 2017
New Revision: 1796155

URL: http://svn.apache.org/viewvc?rev=1796155&view=rev
Log:
Add support for top-level lists to the JSON Parser.

Usage can be found in the new unit tests.

Modified:
    felix/trunk/utils/src/main/java/org/apache/felix/utils/json/JSONParser.java
    
felix/trunk/utils/src/test/java/org/apache/felix/utils/json/JSONParserTest.java

Modified: 
felix/trunk/utils/src/main/java/org/apache/felix/utils/json/JSONParser.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/json/JSONParser.java?rev=1796155&r1=1796154&r2=1796155&view=diff
==============================================================================
--- felix/trunk/utils/src/main/java/org/apache/felix/utils/json/JSONParser.java 
(original)
+++ felix/trunk/utils/src/main/java/org/apache/felix/utils/json/JSONParser.java 
Thu May 25 15:20:26 2017
@@ -72,7 +72,7 @@ public class JSONParser {
         }
     }
 
-    private final Map<String, Object> parsed;
+    private final Object parsed;
 
     public JSONParser(CharSequence json) {
         String str = json.toString();
@@ -84,8 +84,20 @@ public class JSONParser {
         this(readStreamAsString(is));
     }
 
+    @SuppressWarnings("unchecked")
     public Map<String, Object> getParsed() {
-        return parsed;
+        if (parsed instanceof Map)
+            return (Map<String, Object>) parsed;
+        else
+            return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<Object> getParsedList() {
+        if (parsed instanceof List)
+            return (List<Object>) parsed;
+        else
+            return null;
     }
 
     private static Pair<String, Object> parseKeyValue(String jsonKeyValue) {
@@ -167,8 +179,16 @@ public class JSONParser {
         return sb.toString();
     }
 
-    private static Map<String, Object> parseObject(String jsonObject) {
-        if (!(jsonObject.startsWith("{") && jsonObject.endsWith("}")))
+    private static Object parseObject(String jsonObject) {
+        if (jsonObject.startsWith("[") && jsonObject.endsWith("]")) {
+            // It's a list
+            List<Object> values = new ArrayList<Object>();
+
+            for(String val : parseListValuesRaw(jsonObject)) {
+                values.add(parseValue(val));
+            }
+            return values;
+        } else if (!(jsonObject.startsWith("{") && jsonObject.endsWith("}")))
             throw new IllegalArgumentException("Malformatted JSON object: " + 
jsonObject);
 
         Map<String, Object> values = new HashMap<String, Object>();

Modified: 
felix/trunk/utils/src/test/java/org/apache/felix/utils/json/JSONParserTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/utils/src/test/java/org/apache/felix/utils/json/JSONParserTest.java?rev=1796155&r1=1796154&r2=1796155&view=diff
==============================================================================
--- 
felix/trunk/utils/src/test/java/org/apache/felix/utils/json/JSONParserTest.java 
(original)
+++ 
felix/trunk/utils/src/test/java/org/apache/felix/utils/json/JSONParserTest.java 
Thu May 25 15:20:26 2017
@@ -20,11 +20,13 @@ import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class JSONParserTest {
@@ -103,4 +105,41 @@ public class JSONParserTest {
         assertEquals("\r\r\r", parsed.get("\n\n\n"));
         assertEquals("\u2202", parsed.get("!\u2708!\u2708!"));
     }
+
+    @Test
+    public void testTopLevelArraySimple() throws Exception {
+        String s = "[\"a one\", 5, true]";
+
+        JSONParser jp = new JSONParser(s);
+        List<Object> res = jp.getParsedList();
+        assertEquals(3, res.size());
+        assertEquals("a one", res.get(0));
+        assertEquals(5L, res.get(1));
+        assertEquals(true, res.get(2));
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Test
+    public void testTopLevelArrayComplex() throws Exception{
+        String s = "[{\"key1\": 123, \"key2\": 321}, [[true, false], \"hi 
\"]]";
+
+        JSONParser jp = new JSONParser(s);
+        List<Object> res = jp.getParsedList();
+        assertEquals(2, res.size());
+
+        Map m = (Map) res.get(0);
+        assertEquals(2, m.size());
+        assertEquals(123L, m.get("key1"));
+        assertEquals(321L, m.get("key2"));
+
+        List l = (List) res.get(1);
+        assertEquals(2, l.size());
+
+        List l2 = (List) l.get(0);
+        assertEquals(2, l2.size());
+        assertTrue((Boolean) l2.get(0));
+        assertFalse((Boolean) l2.get(1));
+
+        assertEquals("hi ", l.get(1));
+    }
 }


Reply via email to