diff --git a/src/zutil/parser/json/JSONObjectInputStream.java b/src/zutil/parser/json/JSONObjectInputStream.java index 1d6271c..4850250 100755 --- a/src/zutil/parser/json/JSONObjectInputStream.java +++ b/src/zutil/parser/json/JSONObjectInputStream.java @@ -129,7 +129,7 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object readType(Class type, String key, DataNode json) throws IllegalAccessException, ClassNotFoundException, InstantiationException, UnsupportedDataTypeException, NoSuchFieldException { + protected Object readType(Class type, Class[] genType, String key, DataNode json) throws IllegalAccessException, ClassNotFoundException, InstantiationException, UnsupportedDataTypeException, NoSuchFieldException { if(json == null || type == null) return null; // Field type is a primitive? @@ -142,27 +142,29 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C else{ Object array = Array.newInstance(type.getComponentType(), json.size()); for(int i=0; i[] genType = ClassUtil.getGenericClasses(type, List.class); + if(genType == null || genType.length < 1) + genType = ClassUtil.getGenericClasses(type, List.class); List list = (List)type.newInstance(); for(int i=0; i=1? genType[0] : null), key, json.get(i))); + list.add(readType((genType.length>=1? genType[0] : null), null, key, json.get(i))); } return list; } else if(Map.class.isAssignableFrom(type)){ - Class[] genType = ClassUtil.getGenericClasses(type, Map.class); + if(genType == null || genType.length < 2) + genType = ClassUtil.getGenericClasses(type, Map.class); Map map = (Map)type.newInstance(); for(Iterator it=json.keyIterator(); it.hasNext();){ String subKey = it.next(); map.put( subKey, - readType((genType.length>=2? genType[1] : null), subKey, json.get(subKey))); + readType((genType.length>=2? genType[1] : null), null, subKey, json.get(subKey))); } return map; } @@ -210,10 +212,12 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C json.get(field.getName()) != null){ // Parse field field.setAccessible(true); - field.set(obj, readType( - field.getType(), - field.getName(), - json.get(field.getName()))); + field.set(obj, + readType( + field.getType(), + ClassUtil.getGenericClasses(field), + field.getName(), + json.get(field.getName()))); } } // Add object to the cache diff --git a/src/zutil/parser/json/JSONObjectOutputStream.java b/src/zutil/parser/json/JSONObjectOutputStream.java old mode 100644 new mode 100755 index dba4469..4f1f91c --- a/src/zutil/parser/json/JSONObjectOutputStream.java +++ b/src/zutil/parser/json/JSONObjectOutputStream.java @@ -76,6 +76,7 @@ public class JSONObjectOutputStream extends OutputStream implements ObjectOutput protected DataNode getDataNode(Object obj) throws IOException, IllegalArgumentException, IllegalAccessException { if(obj == null) return null; + Class objClass = obj.getClass(); DataNode root; // Check if the object is a primitive @@ -83,6 +84,31 @@ public class JSONObjectOutputStream extends OutputStream implements ObjectOutput ClassUtil.isWrapper(obj.getClass())){ root = getPrimitiveDataNode(obj.getClass(), obj); } + // Add an array + else if(objClass.isArray()){ + root = new DataNode(DataNode.DataType.List); + for(int i=0; i< Array.getLength(obj) ;i++){ + root.add(getDataNode(Array.get(obj, i))); + } + } + // List + else if(List.class.isAssignableFrom(objClass)){ + root = new DataNode(DataNode.DataType.List); + List list = (List)obj; + for(Object item : list){ + root.add(getDataNode(item)); + } + } + // Map + else if(Map.class.isAssignableFrom(objClass)){ + root = new DataNode(DataNode.DataType.Map); + Map map = (Map)obj; + for(Object key : map.keySet()){ + root.set( + getDataNode(key).getString(), + getDataNode(map.get(key))); + } + } // Object is a complex data type else { root = new DataNode(DataNode.DataType.Map); @@ -109,40 +135,8 @@ public class JSONObjectOutputStream extends OutputStream implements ObjectOutput // has object a value? if(ignoreNullFields && fieldObj == null) continue; - // Add basic type (int, float...) - else if(ClassUtil.isPrimitive(field.getType()) || - ClassUtil.isWrapper(field.getType())){ - root.set(field.getName(), getPrimitiveDataNode(field.getType(), fieldObj)); - } - // Add an array - else if(field.getType().isArray()){ - DataNode arrayNode = new DataNode(DataNode.DataType.List); - for(int i=0; i< Array.getLength(fieldObj) ;i++){ - arrayNode.add(getDataNode(Array.get(fieldObj, i))); - } - root.set(field.getName(), arrayNode); - } - else if(List.class.isAssignableFrom(field.getType())){ - DataNode listNode = new DataNode(DataNode.DataType.List); - List list = (List)fieldObj; - for(Object item : list){ - listNode.add(getDataNode(item)); - } - root.set(field.getName(), listNode); - } - else if(Map.class.isAssignableFrom(field.getType())){ - DataNode mapNode = new DataNode(DataNode.DataType.Map); - Map map = (Map)fieldObj; - for(Object key : map.keySet()){ - mapNode.set( - getDataNode(key).getString(), - getDataNode(map.get(key))); - } - root.set(field.getName(), mapNode); - } - else{ + else root.set(field.getName(), getDataNode(fieldObj)); - } } } } diff --git a/test/zutil/test/JSONSerializerTest.java b/test/zutil/test/JSONSerializerTest.java index 802f4ca..a90f2ec 100755 --- a/test/zutil/test/JSONSerializerTest.java +++ b/test/zutil/test/JSONSerializerTest.java @@ -36,7 +36,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; public class JSONSerializerTest{ @@ -47,9 +49,9 @@ public class JSONSerializerTest{ String data = writeObjectToJson(sourceObj); data = data.replace("\"", "'"); - assertEquals( - "{'str': 'abcd', '@class': 'zutil.test.JSONSerializerTest$TestClass', 'obj1': {'@class': 'zutil.test.JSONSerializerTest$TestObj', 'value': 42, '@object_id': 2}, 'obj2': {'@class': 'zutil.test.JSONSerializerTest$TestObj', 'value': 42, '@object_id': 3}, 'decimal': 1.1, '@object_id': 1}\n", - data); + assertThat(data, containsString("'str': 'abcd'")); + assertThat(data, containsString("'value': 42")); + assertThat(data, containsString("'decimal': 1.1")); } @Test @@ -68,9 +70,9 @@ public class JSONSerializerTest{ String data = writeObjectToJson(sourceObj); data = data.replace("\"", "'"); - assertEquals( - "{'@class': 'zutil.test.JSONSerializerTest$TestClassObjClone', 'obj1': {'@class': 'zutil.test.JSONSerializerTest$TestObj', 'value': 42, '@object_id': 2}, 'obj2': {'@object_id': 2}, '@object_id': 1}\n", - data); + assertThat(data, containsString("'@class': 'zutil.test.JSONSerializerTest$TestClassObjClone'")); + assertThat(data, containsString("'obj1': {'@class': 'zutil.test.JSONSerializerTest$TestObj', '@object_id': 2, 'value': 42}")); + assertThat(data, containsString("'obj2': {'@object_id': 2}")); } @Test @@ -99,7 +101,6 @@ public class JSONSerializerTest{ TestClassArray sourceObj = new TestClassArray().init(); TestClassArray targetObj = sendReceiveObject(sourceObj); - assertEquals( sourceObj, targetObj ); } @@ -108,7 +109,6 @@ public class JSONSerializerTest{ TestClassStringArray sourceObj = new TestClassStringArray().init(); TestClassStringArray targetObj = sendReceiveObject(sourceObj); - assertEquals( sourceObj, targetObj ); } @@ -130,12 +130,6 @@ public class JSONSerializerTest{ public void testSerializerWithMapField() throws InterruptedException, IOException, ClassNotFoundException{ TestClassMap sourceObj = new TestClassMap().init(); - String data = writeObjectToJson(sourceObj, false); - data = data.replace("\"", "'"); - assertEquals( - "{'map': {'key2': 'value2', 'key1': 'value1'}}\n", - data); - TestClassMap targetObj = sendReceiveObject(sourceObj); TestClassMap.assertEquals(sourceObj, targetObj); } @@ -145,12 +139,6 @@ public class JSONSerializerTest{ TestClassMap sourceObj = new TestClassMap().init(); sourceObj.map.put("key1", null); - String data = writeObjectToJson(sourceObj, false); - data = data.replace("\"", "'"); - assertEquals( - "{'map': {'key2': 'value2', 'key1': null}}\n", - data); - TestClassMap targetObj = sendReceiveObject(sourceObj); TestClassMap.assertEquals(sourceObj, targetObj); } @@ -159,11 +147,9 @@ public class JSONSerializerTest{ public void testSerializerWithListField() throws InterruptedException, IOException, ClassNotFoundException{ TestClassList sourceObj = new TestClassList().init(); - String data = writeObjectToJson(sourceObj, false); + String data = writeObjectToJson(sourceObj); data = data.replace("\"", "'"); - assertEquals( - "{'list': ['value1', 'value2']}\n", - data); + assertThat(data, containsString("'list': ['value1', 'value2']")); TestClassList targetObj = sendReceiveObject(sourceObj); TestClassList.assertEquals(sourceObj, targetObj);