zoukankan      html  css  js  c++  java
  • android中json的序列化与反序列化

    最近项目中需要在android中将对象转为json字串以及反序列化为对象,查阅了android sdk文档后,发现android中没有类似C#里DataContractJsonSerializer的类,想想需求也不算复杂,就自己写了两个方法解决,代码如下:

    public static String getJson(Object objSource){
            try{
                Object object = getJsonObject(objSource);
                if(object == null)
                    return "";
                return ((JSONObject)object).toString();
            }catch(Exception err){
                Log.e(TAG, "getJson exception:"+err.getMessage());
                return "";
            }
        }
        
        private static Object getJsonObject(Object objSource) throws Exception{
            if(objSource != null){            
                Class<?> objClass = objSource.getClass();
                if(objClass.getPackage().getName().startsWith(PackageString)){
                    JSONObject jsonObject = new JSONObject();
                    Field[] publicFields = objClass.getFields();
                    Object val;            
                    for(Field field : publicFields){
                        val = field.get(objSource);
                        if(val != null){    
                            Class<?> valClass = val.getClass();
                            if(valClass.isArray()){
                                JSONArray array = new JSONArray();
                                int length = Array.getLength(val);
                                for(int i = 0; i<length; i++){
                                    array.put(getJsonObject(Array.get(val, i)));
                                }
                                jsonObject.put(field.getName(), array);
                            }else if(valClass.equals(ArrayList.class)){
                                ArrayList<?> aList = ArrayList.class.cast(val);
                                Iterator<?> iterator = aList.iterator();
                                JSONArray array = new JSONArray();
                                while (iterator.hasNext()) {
                                    array.put(getJsonObject(iterator.next()));                                
                                }
                                jsonObject.put(field.getName(), array);
                            }else{
                                jsonObject.put(field.getName(),getJsonObject(val));
                            }
                        }else{
                            jsonObject.put(field.getName(), null);
                        }                
                    }
                    return jsonObject;
                }else{
                    return objSource;
                }
            }
            return null;
        }
        
        
        public static Object parseJson(Class<?> targetClass,String jsonString){
            try{
                Object object = targetClass.newInstance();
                JSONObject jsonObject = new JSONObject(jsonString);
                String key;
                Class<?> fieldClass;
                Object element;
                Class<?> elementType;
                Field[] fields = targetClass.getFields();
                
                for(Field field : fields){
                    
                    key = field.getName();
                    fieldClass = field.getType();
                    if(fieldClass.equals(ArrayList.class)){
                        String genericType = field.getGenericType().toString();
                        if(genericType.indexOf("<") > 0){
                            genericType = genericType.substring(genericType.indexOf("<")+1,genericType.lastIndexOf(">"));    
                        }
                        ArrayList<Object> aList = new ArrayList<Object>();
                        JSONArray array = jsonObject.getJSONArray(key);
                        int length = array.length();
                        if(genericType.startsWith(PackageString)){
                            elementType = Class.forName(genericType);
                            Field[] elementFields = elementType.getFields();
                            JSONObject subJsonObject;
                            for(int i=0;i<length;i++){
                                element = elementType.newInstance();
                                subJsonObject = array.getJSONObject(i);
                                for(Field subField : elementFields){
                                    subField.set(element, subJsonObject.get(subField.getName()));
                                }
                                aList.add(element);                        
                            }
                        }else{
                            for(int i=0;i<length;i++){
                                aList.add(array.get(i));
                            }
                        }
                        field.set(object, aList);
                        
                    }else if(fieldClass.isArray()){
                        JSONArray array = jsonObject.getJSONArray(key);
                        int length = array.length();
                        String arrayTypeName = fieldClass.getComponentType().getName();
                        Object[] objArray = new Object[length];
                         
                        if(arrayTypeName.startsWith(PackageString)){
                            elementType = Class.forName(arrayTypeName);
                            Field[] elementFields = elementType.getFields();
                            JSONObject subJsonObject;
                            for(int i=0;i<length;i++){
                                element = elementType.newInstance();
                                subJsonObject = array.getJSONObject(i);
                                for(Field subField : elementFields){
                                    subField.set(element, subJsonObject.get(subField.getName()));
                                }
                                objArray[i] = element;                        
                            }
                        }else{
                            for(int i=0;i<length;i++){
                                objArray[i] = array.get(i);
                            }
                        }
                        field.set(object, objArray);
                        
                    }else{
                        field.set(object, jsonObject.get(key));
                    }
                }
                return object;
            }catch(Exception err){
                Log.e(TAG, "parseJson exception:"+err.getMessage());
                return null;
            }
        }

     支持基本类型、数组、ArrayList成员组成的类

  • 相关阅读:
    hbase源码分析.客户端.预备知识.ExecutorService
    Dijkstra for MapReduce (1)
    [leetcode]Palindrome.Partitioning
    CSS3兼容性写法
    C#延时
    python学习日记180823
    2012年11月11日 本周随笔
    2012年11月20日 上周回顾 && 疯狂的程序员书摘
    2012年11月27日 上周回顾
    hadoop loadBalance源码分析
  • 原文地址:https://www.cnblogs.com/hdjjun/p/2663981.html
Copyright © 2011-2022 走看看