Android网络编程之操作JSON对象库-Gson

来源:互联网 发布:linux文件写入权限 编辑:程序博客网 时间:2024/06/05 22:43

之前在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特殊字符,如&lt; &gt;等等,不设置默认忽略这些字符                .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.敬请期待。

6.源码地址

点我跳转

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做主播留不住人怎么办 直播间留不住人怎么办 淘宝直播间留不住人怎么办 干了一个月不发工资怎么办 16岁长白色头发怎么办 腾讯乘车码解约了怎么办 蓝洞棋牌客封号怎么办 草莓被蚂蚁吃了怎么办 脖子被种了草莓怎么办 2岁的宝宝说脏话怎么办 欠钱的人跑路了怎么办 美国非婚生子父亲不认怎么办 孕4个月肚子胀气怎么办 8个月孕妇感冒了怎么办 孕8个月感冒鼻塞怎么办 怀孕八个月感冒了怎么办 孕八个月咳嗽了怎么办 享物说同城自提怎么办 锤基意外怀孕怎么办 08 蛐蛐罐底翻砂了怎么办 剑网3中被盗号后怎么办 本人想离婚对方躲避怎么办 微信不能说语音怎么办 微信语音发不了怎么办 吃鸡语音用不了怎么办 要杀我的人见面怎么办 转晕了想吐怎么办 原地转圈头晕恶心想吐怎么办 孩子吃凉的呕吐头还晕怎么办 孩子转晕了想吐怎么办 转圈晕了想吐怎么办 我爸总是骂我妈怎么办 转圈转的想吐怎么办 大便干燥拉不出来怎么办 吹完头发很干燥怎么办 腿摔伤了结痂疼怎么办 蹭wifi被禁止后怎么办 电脑wifi给拉黑怎么办 电脑想用无线网怎么办 中路被对方打崩了怎么办 英雄联盟队友太坑怎么办