最近在找怎樣可以將一個數據對象通過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 }
復制代碼
注:裡面這些方法具體我也不知道怎麼說,自己去試下,讓後一步步調試,看看裡面是怎麼走的應該就會很清楚的。還是希望大家可以多多指出問題。相互學習。。。。