Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 學習筆記之 JSON的序列化基本用法

Android 學習筆記之 JSON的序列化基本用法

編輯:關於Android編程

最近在找怎樣可以將一個數據對象通過WCF傳給服務器,在網上看到了一個對象序列化成JSON的數據格式的帖子,這裡整理下。   用到了JSON中的JSONStringer這個類,此類的主要功能就是可以快速的將一個數據類型序列化,成為一個標准的JSON數據。   其中需要注意的是:   .object()和.endObject()必須同時使用,是為了按照Object標准給數值添加邊界。同樣,針對數組也有一組標准的方法來生成邊界.array()和.endArray()。   基本原理就是一個數據傳入先判斷它是屬於哪個類型,再根據具體的類型進行序列化(對象,數組,集合,Map,單個的基礎數據類型如String)。   我是以對象為列子的   一、數據對象   復制代碼  1 public class ListInfoObj {  2   3     private List<String> Names;  4     private List<String> Sixs;  5   6     public List<String> getNames() {  7         return Names;  8     }  9  10     public void setNames(List<String> names) { 11         Names = names; 12     } 13  14     public List<String> getSixs() { 15         return Sixs; 16     } 17  18     public void setSixs(List<String> sixs) { 19         Sixs = sixs; 20     } 復制代碼 二、主界面(初始化對象並賦值)調用序列化方法   復制代碼  1 public class MainActivity extends Activity {  2     private Button toJsonBut;  3     private TextView msgView;  4     private ListInfoObj mListInfoObj;  5   6     @Override  7     protected void onCreate(Bundle savedInstanceState) {  8         super.onCreate(savedInstanceState);  9         setContentView(R.layout.activity_main); 10         this.toJsonBut = (Button) this.findViewById(R.id.tojson); 11         this.msgView = (TextView) this.findViewById(R.id.msg); 12         this.toJsonBut.setOnClickListener(listener); 13     } 14  15     View.OnClickListener listener = new View.OnClickListener() { 16  17         @Override 18         public void onClick(View v) { 19             // TODO Auto-generated method stub 20             String jsonList; 21             //初始化對象並賦值 22             getObj(); 23             //對象序列化 24             ObjtoJson blObjtoJson = new ObjtoJson(); 25             jsonList = blObjtoJson.toJson(mListInfoObj); 26             //顯示數據 27             msgView.setText(jsonList); 28  29         } 30     }; 31  32     /** 33      * 給數據對象賦值 34      */ 35     private void getObj() {     36         this.mListInfoObj = new ListInfoObj(); 37         List<String> name = new ArrayList<String>(); 38         name.add("大寶"); 39         name.add("中寶"); 40         name.add("小寶"); 41         List<String> six = new ArrayList<String>(); 42         six.add("男"); 43         six.add("妖"); 44         six.add("女"); 45         this.mListInfoObj.setNames(name); 46         this.mListInfoObj.setSixs(six); 47     } 復制代碼 三、JSON序列化(這才是主菜)   復制代碼   1 public class ObjtoJson {   2    3     public String toJson(Object obj) {   4         String jsonStr = null;   5         //生成一個JSONStringer對象   6         JSONStringer js = new JSONStringer();   7         //調用序列化方法   8         serialize(js, obj);   9         //轉換成字符串  10         jsonStr = js.toString();  11         return jsonStr;  12     }  13   14     /**  15      * 根據所傳的數據類型進行序列化  16      * @param js  17      * @param obj  傳入的數據類型  18      */  19     private static void serialize(JSONStringer js, Object obj) {  20         //判斷是否為空  21         if (isNull(obj)) {  22             try {  23                 js.value(null);  24             } catch (Exception e) {  25                 // TODO: handle exception  26                 Log.i("js賦值異常", e.toString());  27             }  28         }  29         Class<?> clazz = obj.getClass();  30         if (isObject(clazz)) { // 對象  31             serializeObject(js, obj);  32         } else if (isArray(clazz)) { // 數組  33             serializeArray(js, obj);  34         } else if (isCollection(clazz)) { // 集合  35             Collection<?> collection = (Collection<?>) obj;  36             serializeCollect(js, collection);  37         } else if (isMap(clazz)) { // 集合  38             HashMap<?, ?> collection = (HashMap<?, ?>) obj;  39             serializeMap(js, collection);  40         } else { // 單個值  41             try {  42                 js.value(obj);  43             } catch (JSONException e) {  44                 e.printStackTrace();  45             }  46         }  47   48     }  49   50     /**  51      * 序列化數組  52      *   53      * @param js  54      *            json對象  55      * @param array  56      *            數組  57      */  58     private static void serializeArray(JSONStringer js, Object array) {  59         try {  60             js.array();  61             for (int i = 0; i < Array.getLength(array); ++i) {  62                 Object o = Array.get(array, i);  63                 //回調序列化方法  64                 serialize(js, o);  65             }  66             js.endArray();  67         } catch (Exception e) {  68             e.printStackTrace();  69         }  70     }  71   72     /**  73      * 序列化集合  74      *   75      * @param js  76      *            json對象  77      * @param collection  78      *            集合  79      */  80     private static void serializeCollect(JSONStringer js,  81             Collection<?> collection) {  82         try {  83             js.array();  84             for (Object o : collection) {  85                 serialize(js, o);  86             }  87             js.endArray();  88         } catch (Exception e) {  89             e.printStackTrace();  90         }  91     }  92   93     /**  94      * 序列化Map  95      *   96      * @param js  97      *            json對象  98      * @param map  99      *            map對象 100      */ 101     private static void serializeMap(JSONStringer js, Map<?, ?> map) { 102         try { 103             js.object(); 104             @SuppressWarnings("unchecked") 105             Map<String, Object> valueMap = (Map<String, Object>) map; 106             Iterator<Map.Entry<String, Object>> it = valueMap.entrySet() 107                     .iterator(); 108             while (it.hasNext()) { 109                 Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it 110                         .next(); 111                 js.key(entry.getKey()); 112                 serialize(js, entry.getValue()); 113             } 114             js.endObject(); 115         } catch (Exception e) { 116             e.printStackTrace(); 117         } 118     } 119      120     /** 121      * 序列化對象 122      *  123      * @param js 124      *            json對象 125      * @param obj 126      *            待序列化對象 127      */ 128     private static void serializeObject(JSONStringer js, Object obj) { 129         try { 130             js.object(); 131             Class<? extends Object> objClazz = obj.getClass(); 132             Method[] methods = objClazz.getDeclaredMethods(); 133             Field[] fields = objClazz.getDeclaredFields(); 134             for (Field field : fields) { 135                 try { 136                     String fieldType = field.getType().getSimpleName(); 137                     String fieldGetName = parseMethodName(field.getName(), 138                             "get"); 139                     if (!haveMethod(methods, fieldGetName)) { 140                         continue; 141                     } 142                     Method fieldGetMet = objClazz.getMethod(fieldGetName, 143                             new Class[] {}); 144                     Object fieldVal = fieldGetMet.invoke(obj, new Object[] {}); 145                     String result = null; 146                     if ("Date".equals(fieldType)) { 147                         SimpleDateFormat sdf = new SimpleDateFormat( 148                                 "yyyy-MM-dd HH:mm:ss", Locale.US); 149                         result = sdf.format((Date) fieldVal); 150  151                     } else { 152                         if (null != fieldVal) { 153                             result = String.valueOf(fieldVal); 154                         } 155                     } 156                     js.key(field.getName()); 157                     serialize(js, result); 158                 } catch (Exception e) { 159                     continue; 160                 } 161             } 162             js.endObject(); 163         } catch (Exception e) { 164             e.printStackTrace(); 165         } 166     } 167  168     /** 169      * 判斷是否存在某屬性的 get方法 170      *  171      * @param methods 172      *            引用方法的數組 173      * @param fieldMethod 174      *            方法名稱 175      * @return true或者false 176      */ 177     public static boolean haveMethod(Method[] methods, String fieldMethod) { 178         for (Method met : methods) { 179             if (fieldMethod.equals(met.getName())) { 180                 return true; 181             } 182         } 183         return false; 184     } 185  186     /** 187      * 拼接某屬性的 get或者set方法 188      *  189      * @param fieldName 190      *            字段名稱 191      * @param methodType 192      *            方法類型 193      * @return 方法名稱 194      */ 195     public static String parseMethodName(String fieldName, String methodType) { 196         if (null == fieldName || "".equals(fieldName)) { 197             return null; 198         } 199         return methodType + fieldName.substring(0, 1).toUpperCase() 200                 + fieldName.substring(1); 201     } 202  203     private static boolean isNull(Object obj) { 204         if (obj instanceof JSONObject) { 205             return JSONObject.NULL.equals(obj); 206         } 207         return obj == null; 208     } 209  210     /** 211      * 判斷是否是值類型 212      *  213      * @param clazz 214      * @return 215      */ 216     private static boolean isSingle(Class<?> clazz) { 217         return isBoolean(clazz) || isNumber(clazz) || isString(clazz); 218     } 219  220     /** 221      * 是否布爾值 222      *  223      * @param clazz 224      * @return 225      */ 226     public static boolean isBoolean(Class<?> clazz) { 227         return (clazz != null) 228                 && ((Boolean.TYPE.isAssignableFrom(clazz)) || (Boolean.class 229                         .isAssignableFrom(clazz))); 230     } 231  232     /** 233      * 是否數值 234      *  235      * @param clazz 236      * @return 237      */ 238     public static boolean isNumber(Class<?> clazz) { 239         return (clazz != null) 240                 && ((Byte.TYPE.isAssignableFrom(clazz)) 241                         || (Short.TYPE.isAssignableFrom(clazz)) 242                         || (Integer.TYPE.isAssignableFrom(clazz)) 243                         || (Long.TYPE.isAssignableFrom(clazz)) 244                         || (Float.TYPE.isAssignableFrom(clazz)) 245                         || (Double.TYPE.isAssignableFrom(clazz)) || (Number.class 246                             .isAssignableFrom(clazz))); 247     } 248  249     /** 250      * 判斷是否是字符串 251      *  252      * @param clazz 253      * @return 254      */ 255     public static boolean isString(Class<?> clazz) { 256         return (clazz != null) 257                 && ((String.class.isAssignableFrom(clazz)) 258                         || (Character.TYPE.isAssignableFrom(clazz)) || (Character.class 259                             .isAssignableFrom(clazz))); 260     } 261  262     /** 263      * 判斷是否是對象 264      *  265      * @param clazz 266      * @return 267      */ 268     private static boolean isObject(Class<?> clazz) { 269         return clazz != null && !isSingle(clazz) && !isArray(clazz) 270                 && !isCollection(clazz) && !isMap(clazz); 271     } 272  273     /** 274      * 判斷是否是數組 275      *  276      * @param clazz 277      * @return 278      */ 279     public static boolean isArray(Class<?> clazz) { 280         return clazz != null && clazz.isArray(); 281     } 282  283     /** 284      * 判斷是否是集合 285      *  286      * @param clazz 287      * @return 288      */ 289     public static boolean isCollection(Class<?> clazz) { 290         return clazz != null && Collection.class.isAssignableFrom(clazz); 291     } 292  293     /** 294      * 判斷是否是Map 295      *  296      * @param clazz 297      * @return 298      */ 299     public static boolean isMap(Class<?> clazz) { 300         return clazz != null && Map.class.isAssignableFrom(clazz); 301     } 302  303     /** 304      * 判斷是否是列表 305      *  306      * @param clazz 307      * @return 308      */ 309     public static boolean isList(Class<?> clazz) { 310         return clazz != null && List.class.isAssignableFrom(clazz); 311     } 復制代碼 注:裡面這些方法具體我也不知道怎麼說,自己去試下,讓後一步步調試,看看裡面是怎麼走的應該就會很清楚的。還是希望大家可以多多指出問題。相互學習。。。。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved