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<String, Object>}.
* <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