之前在Volley框架JsonObjectRequest和JsonArrayRequest的使用中搭配了Gson库,操作JSON数据格式非常方便,所以这里详细阐述下Gson的使用方法。
Gson下载地址:http://code.google.com/p/google-gson/downloads/list
Gson主要提供两种方法:toJson序列化方法以及fromJson反序列化方法。从字面意思可以理解,toJson是将一种数据格式转换为JSON格式,fromJson则是将JSON格式转换为其他数据格式。
1.序列化及反序列化
下面的代码片段列出了封装的集中常见格式的转换
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonUtils {
private GsonUtils gsonUtils;
public GsonUtils() {
// TODO Auto-generated constructor stub
}
public GsonUtils getInstance() {
if (gsonUtils == null) {
gsonUtils = new GsonUtils();
}
return gsonUtils;
}
public static Gson getGsonBuilder() {
Gson gson = new GsonBuilder()// GSONBUILDER实现更高级的一些序列化反序列化操作
// 自定义JSON序列化反序列化类,实现自己的需求
// .registerTypeAdapter(Id.class, new IdTypeAdapter())
.excludeFieldsWithoutExposeAnnotation() // 不导出实体中没有用@Expose注解的属性
.enableComplexMapKeySerialization() // 支持Map的key为复杂对象的形式
.serializeNulls()// 序列化空字段。默认情况下,GSON省略所有序列化过程中的空字段
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")// 时间转化为特定格式
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)// 会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
.setPrettyPrinting() // 格式化输出,只影响序列化输出JSON.
.disableHtmlEscaping() // 设置显示HTML特殊字符,如< >等等,不设置默认忽略这些字符
.setVersion(1.0) // 高于1.0版本的字段序列化和反序列化的时候忽略
.create();
return gson;
}
public static Gson getGson() {
Gson gson = new Gson();
return gson;
}
// 各种数据格式转换为JSON
public static String toJson(Gson gson, Object object) {
String msg = gson.toJson(object);
return msg;
}
// JSON转换为字符串
public static String jsonToString(Gson gson, String string, Type typeOfT) {
String msg = gson.fromJson(string, typeOfT);
return msg;
}
// JSON转换为Map
public static Map<String, Object> jsonToMap(Gson gson, String string, Type typeOfT) {
Map<String, Object> msg = gson.fromJson(string, typeOfT);
return msg;
}
// JSON转换为普通List
public static List<Map<String, Object>> jsonToList(Gson gson, String string, Type typeOfT) {
List<Map<String, Object>> msg = gson.fromJson(string, typeOfT);
return msg;
}
// JSON转换为List对象
public static List<People> jsonToListB(Gson gson, String string, Type typeOfT) {
List<People> msg = gson.fromJson(string, typeOfT);
return msg;
}
}
2.用到的一些数据集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataUtils {
private static DataUtils dataUtils;
public DataUtils() {
// TODO Auto-generated constructor stub
}
public DataUtils getInstance() {
if (dataUtils == null) {
dataUtils = new DataUtils();
}
return dataUtils;
}
// 获取String数组
public static String[][] getStringArrays() {
return new String[][] { { "gaoruan", "22", "true" }, { "xudong", "22", "false", "true" } };
}
// 获取map
public static Map<String, Object> getMap(String name, int age, int height, boolean isfool) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", name);
map.put("age", age);
map.put("height", height);
map.put("isfool", isfool);
People people1 = new People();
people1.setName("xudong");
people1.setAge(22);
people1.setHeight(122);
People people2 = new People();
people2.setName("zhangming");
people2.setAge(22);
people2.setHeight(122);
List<People> list = new ArrayList<People>();
list.add(people1);
list.add(people2);
map.put("peoples", list);
return map;
}
// 获取list
public static List<Map<String, Object>> getList() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
list.add(getMap("gaoruan", 22, 122, true));
Map<String, Object> map = getMap("xudong", 22, 122, true);
map.put("weight", 222);
map.put("ismarried", false);
list.add(map);
return list;
}
// 获取list<people>
public static List<People> getPeopleList() {
List<People> list = new ArrayList<People>();
list.add(new People("xudong", 22, 122, 222, false, true));
People people = new People();
people.setName("gaoruan");
people.setAge(22);
people.setHeight(122);
list.add(people);
return list;
}
}
3.用到的JavaBean
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Since;
import com.google.gson.annotations.Until;
public class People {
@Expose
String name;
@Expose(deserialize = false) // 反序列化时删除此字段 default true
int age;
@Expose(serialize = false) // 序列化时删除此字段 default true
int height;
@Expose
@Since(1.1) // 1.0版本增加此字段
@Until(3.0) // 3.0版本删除此字段
int weight;
@Expose
@Since(1.1)
boolean ismarried;
@Expose
@SerializedName(value = "fool") // 设置序列化和反序列化时的替代字段名称
boolean isfool;
public People() {
// TODO Auto-generated constructor stub
}
public People(String name, int age, int height, int weight, boolean ismarried, boolean isfool) {
// TODO Auto-generated constructor stub
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
this.ismarried = ismarried;
this.isfool = isfool;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public boolean isIsmarried() {
return ismarried;
}
public void setIsmarried(boolean ismarried) {
this.ismarried = ismarried;
}
public boolean isIsfool() {
return isfool;
}
public void setIsfool(boolean isfool) {
this.isfool = isfool;
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + ", height=" + height + ", weight=" + weight + ", ismarried="
+ ismarried + ", isfool=" + isfool + "]";
}
}
4.方法调用Activity
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ruan.test.LogUtils;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new GsonUtils().getInstance();
new DataUtils();
// Gson gson = GsonUtils.getGson();
Gson gson = GsonUtils.getGsonBuilder();
// String msg = GsonUtils.toJson(gson, DataUtils.getStringArrays());
// String msg = GsonUtils.toJson(gson, DataUtils.getList());
// String msg = GsonUtils.toJson(gson, DataUtils.getPeopleList());
/**
* Map List<Bean> List<Map>与JSON相互转换
*/
String msg = GsonUtils.toJson(gson, DataUtils.getMap("gaoruan", 22, 122, true));
Map<String, Object> msg2 = GsonUtils.jsonToMap(gson, msg, new TypeToken<Map<String, Object>>() {
}.getType());
LogUtils.e(msg);
for (String key : msg2.keySet()) {
if (key.equals("peoples")) {
// String msg3 = GsonUtils.jsonToString(gson,string, typeOfT)
List<People> msg3 = GsonUtils.jsonToListB(gson, msg2.get(key).toString(),
new TypeToken<List<People>>() {
}.getType());
for (People people : msg3) {
LogUtils.e(("name:" + people.getName() + " age:" + people.getAge()));
}
} else
LogUtils.e(("key:" + key + " values:" + msg2.get(key)));
}
// String msg = GsonUtils.toJson(gson,DataUtils.getList());
// LogUtils.e(msg);
// List<Map<String, Object>> msg2 = GsonUtils.jsonToList(gson,msg, new
// TypeToken<List<Map<String, Object>>>() {
// }.getType());
// for (Map<String, Object> map : msg2) {
// for (String key : map.keySet()) {
// LogUtils.e(("keys:" + key + " values:" + map.get(key)));
// }
//
// }
}
}
5.总结
1.Gson主要用作JSON格式数据的序列化反序列化,一些简单的操作例如JSONObject和JSONArray可以完成的没必要套用Gson来操作。
2.敬请期待。