一、什么是json
json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
二、JSON 语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔,如图
另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
图片来源博客园
三、json序列化反序列的两种方法
通过第三方jar包json-lib(http://json-lib.sourceforge.net/)
封装代码直接调用
package com.Platforms.enterprise_Service.Service;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONStringer;
import android.util.Log;
/**
* @author keane
*
*/
public class JSONHelper {
private static String TAG = "JSONHelper";
/**
* 将对象转换成Json字符串
* @param obj
* @return json类型字符串
*/
public static String toJSON(Object obj) {
JSONStringer js = new JSONStringer();
serialize(js, obj);
return js.toString();
}
/**
* 序列化为JSON
* @param js json对象
* @param o 待需序列化的对象
*/
private static void serialize(JSONStringer js, Object o) {
if (isNull(o)) {
try {
js.value(null);
} catch (JSONException e) {
e.printStackTrace();
}
return;
}
Class<?> clazz = o.getClass();
if (isObject(clazz)) { // 对象
serializeObject(js, o);
} else if (isArray(clazz)) { // 数组
serializeArray(js, o);
} else if (isCollection(clazz)) { // 集合
Collection<?> collection = (Collection<?>) o;
serializeCollect(js, collection);
}else if (isMap(clazz)) { // 集合
HashMap<?,?> collection = (HashMap<?,?>) o;
serializeMap(js, collection);
} else { // 单个值
try {
js.value(o);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
/**
* 序列化数组
* @param js json对象
* @param array 数组
*/
private static void serializeArray(JSONStringer js, Object array) {
try {
js.array();
for (int i = 0; i < Array.getLength(array); ++i) {
Object o = Array.get(array, i);
serialize(js, o);
}
js.endArray();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 序列化集合
* @param js json对象
* @param collection 集合
*/
private static void serializeCollect(JSONStringer js, Collection<?> collection) {
try {
js.array();
for (Object o : collection) {
serialize(js, o);
}
js.endArray();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 序列化Map
* @param js json对象
* @param map map对象
*/
private static void serializeMap(JSONStringer js, Map<?,?> map) {
try {
js.object();
@SuppressWarnings("unchecked")
Map<String, Object> valueMap = (Map<String, Object>) map;
Iterator<Map.Entry<String, Object>> it = valueMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>)it.next();
js.key(entry.getKey());
serialize(js,entry.getValue());
}
js.endObject();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 序列化对象
* @param js json对象
* @param obj 待序列化对象
*/
private static void serializeObject(JSONStringer js, Object obj) {
try {
js.object();
Class<? extends Object> objClazz = obj.getClass();
//获取所有的数组
Method[] methods = objClazz.getDeclaredMethods();
//获取所有的字段
Field[] fields = objClazz.getDeclaredFields();
//遍历这个对象
for (Field field : fields) {
try {
String fieldType = field.getType().getSimpleName();
String fieldGetName = parseMethodName(field.getName(),"get");
if (!haveMethod(methods, fieldGetName)) {
continue;
}
Method fieldGetMet = objClazz.getMethod(fieldGetName, new Class[] {});
Object fieldVal = fieldGetMet.invoke(obj, new Object[] {});
Object result = null;
if ("Date".equals(fieldType)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US);
result = sdf.format((Date)fieldVal);
} else {
if (null != fieldVal) {
result = fieldVal;
}
}
js.key(field.getName());
serialize(js, result);
} catch (Exception e) {
continue;
}
}
js.endObject();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 判断是否存在某属性的 get方法
* &