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

之前在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.敬请期待。

6.源码地址

点我跳转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值