gson:谷歌提供的JSON的解決方案。它的站點(diǎn)是http://code.google.com/p/google-gson/。
本人用過(guò)org.json和的JSON - lib中提供的解決方案。
先說(shuō)下org.json,它屬于輕量級的JSON的。它能夠將Object或者ArrayList的轉換為JSONObject的和JsonArrayList。但是在反轉換的JSON字符串時(shí)卻只能夠提供字符串的結果。所以比較適合
開(kāi)發(fā)者后期處理。
至于的JSON - lib的在反轉方面做得比前者強了許多。它通過(guò)JSONObject.fromObject和JSONObject.toBean可以將Bean、ArrayList、HashMap中與JSONObject的互相轉換。但是遇到嵌套問(wèn)題
如一個(gè)Bean1->HashMap-> Bean2。當它對該對象反轉換時(shí)將出現Bean2為JSONObject的對象的情況.
現在講到gson了.它通過(guò)reflection來(lái)識別對象.見(jiàn)下面例子:
<Bean>
------------------------ 華麗的分割線(xiàn)-----------------------------
package org.gson.bean;
import java.util.Date;
import com.google.gson.annotations.Expose;
/**
* 普通的UserBean
*/
public class UserBean {
@Expose
private String id;
@Expose
private String name;
private Date birthday;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "UserBean [birthday=" + birthday + ", id=" + id + ", name="
+ name + "]";
}
}
------------------------ 華麗的分割線(xiàn)------------------------------
package org.gson.bean;
import java.util.List;
import java.util.Map;
/**
* 包含Arrylist和HashMap,里面保持UserBean
*/
public class GroupBean {
private String id;
private Map<String, UserBean> userMap;
private List<UserBean> userList;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Map<String, UserBean> getUserMap() {
return userMap;
}
public void setUserMap(Map<String, UserBean> userMap) {
this.userMap = userMap;
}
public List<UserBean> getUserList() {
return userList;
}
public void setUserList(List<UserBean> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "GroupBean [id=" + id + ", userList=" + userList + ", userMap="
+ userMap + "]";
}
}
------------------------ 華麗的分割線(xiàn)------------------------------
<Gson Test>
------------------------ 華麗的分割線(xiàn)------------------------------
package org.gson.main;
import org.gson.bean.UserBean;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* 通過(guò)註釋過(guò)濾轉換對象
*/
public class FilterAnnotationTest {
public static void main(String[] args) {
UserBean user = new UserBean();
user.setId("1001");
user.setName("張三");
/**
* 設置注釋過(guò)濾功能
* Gson gson = new GsonBuilder()
* .registerTypeAdapter(Id.class, new IdTypeAdapter())
* .serializeNulls()
* .setDateFormat(DateFormat.LONG)
* .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
* .setPrettyPrinting()
* .setVersion(1.0)
* .create();
*/
GsonBuilder builder = new GsonBuilder();
// 不轉換沒(méi)有 @Expose 注解的字段
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
// 將JavaBean字符串轉換為 JSON
String sUser = gson.toJson(user);
System.out.println(sUser);
// {"id":1001,"name":"張三"}
// 將JSON字符串轉換為 JavaBean
UserBean user2 = gson.fromJson(sUser, UserBean.class);
System.out.println(user2.getId() + ", " + user2.getName());
// 1001, 張三
}
}
------------------------ 華麗的分割線(xiàn)------------------------------
package org.gson.main;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.gson.bean.UserBean;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 模板反射對象Bean
* @author yansheng
*/
public class TemplateTest {
public static void main(String... strings) {
List<UserBean> testBeanList = new ArrayList<UserBean>();
UserBean testBean = new UserBean();
testBean.setId("1");
testBean.setName("name");
testBeanList.add(testBean);
Gson gson = new Gson();
Type type = new TypeToken<List<UserBean>>(){}.getType();
String beanListToJson = gson.toJson(testBeanList, type);
System.out.println(beanListToJson);
// prints [{"id":"id","name":"name"}]
List<UserBean> testBeanListFromJson = gson.fromJson(beanListToJson, type);
System.out.println(testBeanListFromJson);
// prints [TestBean@1ea5671[id=id,name=name,birthday=<null>]]
}
}
------------------------ 華麗的分割線(xiàn)------------------------------
package org.gson.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 簡(jiǎn)單的集合使用
* @author yansheng
*/
public class SimpleCollectionTest {
public static void main(String[] args) {
Gson gson = new Gson();
// 將ArrayList字符串轉換為 JSON
List<String> testList = new ArrayList<String>();
testList.add("first");
testList.add("second");
String listToJson = gson.toJson(testList);
System.out.println(listToJson);
// prints ["first","second"]
// 將JSON字符串轉換為 ArrayList
List<String> testList2 = (List<String>) gson.fromJson(listToJson,
new TypeToken<List<String>>() {
}.getType());
System.out.println(testList2);
// 將HashMap字符串轉換為 JSON
Map<String, String> testMap = new HashMap<String, String>();
testMap.put("id", "id.first");
testMap.put("name", "name.second");
String mapToJson = gson.toJson(testMap);
System.out.println(mapToJson);
// prints {"id":"id.first","name":"name.second"}
// 將JSON字符串轉換為 HashMap
Map<String, String> userMap2 = (Map<String, String>) gson.fromJson(mapToJson,
new TypeToken<Map<String, String>>() {
}.getType());
System.out.println(userMap2.get("id"));
}
}
------------------------ 華麗的分割線(xiàn)------------------------------
package org.gson.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gson.bean.GroupBean;
import org.gson.bean.UserBean;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 嵌套使用對象Bean
* @author yansheng
*/
public class NestedTest {
public static void main(String[] args) {
UserBean user1 = new UserBean();
user1.setId("1001");
user1.setName("張三");
UserBean user2 = new UserBean();
user2.setId("1002");
user2.setName("李四");
Map<String, UserBean> userMap = new HashMap<String, UserBean>();
userMap.put("user1", user1);
userMap.put("user2", user2);
List<UserBean> userList = new ArrayList<UserBean>();
userList.add(user1);
userList.add(user2);
GroupBean groupBean = new GroupBean();
groupBean.setId("1");
groupBean.setUserMap(userMap);
groupBean.setUserList(userList);
Gson gson = new Gson();
String sGroupBean = gson.toJson(groupBean, new TypeToken<GroupBean>() {
}.getType());
System.out.println(sGroupBean);
// {"user1":{"id":1001,"name":"張三"},"user2":{"id":1002,"name":"李四"}}
// 將JSON字符串轉換為 HashMap
GroupBean groupBean2 = (GroupBean) gson.fromJson(sGroupBean,
new TypeToken<GroupBean>() {
}.getType());
System.out.println(groupBean2);
// 張三
}
}
------------------------ 華麗的分割線(xiàn)-----------------------------
/**
* 定義對Date的轉換
*/
package org.gson.main;
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
/**
* 反串行Data
*/
public class UtilDateDeserializer implements JsonDeserializer<java.util.Date>{
@Override
public java.util.Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new java.util.Date(json.getAsJsonPrimitive().getAsLong());
}
}
------------------------ 華麗的分割線(xiàn)-----------------------------
package org.gson.main;
import java.lang.reflect.Type;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
/**
* 串行Data
*/
public class UtilDateSerializer implements JsonSerializer<java.util.Date> {
@Override
public JsonElement serialize(java.util.Date src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.getTime());
}
}
------------------------ 華麗的分割線(xiàn)-----------------------------
package org.gson.main;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import org.gson.bean.UserBean;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* date測試類(lèi)
*/
public class DateTest {
/**
* 序列化方法
*
* @param bean
* @param type
* @return
*/
public static String bean2json(Object bean, Type type) {
Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class,
new UtilDateSerializer()).setDateFormat(DateFormat.LONG)
.create();
return gson.toJson(bean);
}
/**
* 反序列化方法
*
* @param json
* @param type
* @return
*/
public static <T> T json2bean(String json, Type type) {
Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class,
new UtilDateDeserializer()).setDateFormat(DateFormat.LONG)
.create();
return gson.fromJson(json, type);
}
public static void main(String[] args) {
List<UserBean> testBeanList = new ArrayList<UserBean>();
UserBean testBean = new UserBean();
testBean.setId("id");
testBean.setName("name");
testBean.setBirthday(new java.util.Date());
testBeanList.add(testBean);
java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<UserBean>>() {
}.getType();
String beanListToJson = bean2json(testBeanList, type);
System.out.println("beanListToJson:" + beanListToJson);
// prints [{"id":"id","name":"name","birthday":1256531559390}]
List<UserBean> testBeanListFromJson = json2bean(beanListToJson, type);
System.out.println(testBeanListFromJson);
// prints [TestBean@77a7f9[id=id,name=name,birthday=Mon Oct 26 12:39:05
// CST 2009]]
}
}
json是以字符串為基礎實(shí)現的數據載體格式.所以從大局上來(lái)講相對于xml有其自己的靈活性.所以使用gson可以很好的解決以對象為主題的傳輸問(wèn)題,畢竟<think in java>第一章即提到一切接
對象.但是這樣做也散失了json的靈活性.所以開(kāi)發(fā)的時(shí)候還是需要根據情況選擇的.
聯(lián)系客服