Gson 的日常使用

 创建一个 Peson对象

public class Person{

    private String name; //属性都定义成String类型,并且属性名要和Json数据中的键值对的键名完全一样

    private String age;

    ...//提供所有属性的getter和setter方法

}

 

1.将对象转换为字符串

        Person p=new Person("张丽丽",18);
        Gson gson=new Gson();
        String json=gson.toJson(p);
        Log.i(TAG, json);

输出结果为: {"name": 张丽丽","age":18}

1.2.对象数组转换为String 字符串

ArrayList<Person> p=new ArrayList<Person>();
        p.add(new Person("张三",18));
        p.add(new Person("里斯",23));
        Gson gson=new Gson();
        String json=gson.toJson(p);
        Log.i(TAG, json);

输出结果为:[ {"name": 张三","age":18},{"name": 里斯","age":18}]

2.Gson的反序列化,将字符串转换为Json对象

jsonstr= {"name":"jack","age":18}

Gson gson = new Gson;

Person person  = gson.formJson(jsonstr,Person.class)

2.1 将字符串数组转化为Json 对象

jsonstr= [{"name":"jack","age":18},{"name":"alex","age":23},{"name":"jane","age":15}]

        Gson gson=new Gson();
        Person[] person1=gson.fromJson(jsonstr, Person[].class);

3.集合类就必须要用TypeToken。它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。

Set<Long> idSet = StaticVariables.gson.fromJson(user.getDocpermission(), new TypeToken<Set<Long>>() {
                }.getType());

 ArrayList<Person> person2=gson.fromJson(jsonstr, new TypeToken<ArrayList<Person>>(){}.getType());

4.

还要说一下如果对象的某个值为null。这个属性将不会在String中显示。

复制代码
        ArrayList<Person> p=new ArrayList<Person>();
        p.add(new Person("jack",18));
        p.add(new Person(null,23));
        p.add(new Person("jane",15));
        Gson gson=new Gson();
        String json=gson.toJson(p);
        Log.i(TAG, json);
复制代码

  输出结果:[{"name":"jack","age":18},{"age":23},{"name":"jane","age":15}]

  如果要被序列化的String缺少某个属性例如上面的输出。也会转换成功。并且对应值为null。

 3.Gson序列化的类屏蔽

  比如你想将一个类的几个属性序列化,但他继承自一个很复杂的父类。你不想序列化他的父类。

  又或者你在反序列化一个类时,因为复杂的父类而序列化失败。

  使用这个类。屏蔽父类或属性类成员不应序列化的类。

复制代码
public class SpecificClassExclusionStrategy implements ExclusionStrategy {

    private final Class<?> excludedThisClass;
    private final Class<?> excludedThisClassFields;

    /***
     * 过滤器初始化
     *
     * @param excludedThisClass
     *            该类和继承自该类的对象实例将被忽略
     * @param excluedThisClassFields
     *            该类的属性将不被序列化
     */
    public SpecificClassExclusionStrategy(Class<?> excludedThisClass, Class<?> excluedThisClassFields) {
        this.excludedThisClass = excludedThisClass;
        this.excludedThisClassFields = excluedThisClassFields;
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        if (clazz == null) return false;
        if (clazz.equals(excludedThisClass)) return true;
        return shouldSkipClass(clazz.getSuperclass());
    }

    @Override
    public boolean shouldSkipField(FieldAttributes f) {
        return f.getDeclaringClass().equals(excludedThisClassFields);
    }

}
复制代码
Gson gson2 = new GsonBuilder().setExclusionStrategies(new SpecificClassExclusionStrategy(null, Model.class)).create();
PersonBrief.PersonBriefResult result = gson2.fromJson(response, PersonBrief.PersonBriefResult.class);

  感觉平时就用到这么多了。

 

  还有一个在对象与JsonObject直接转的。但这个JsonObject不是Android的JSONObject所以很少用。

        Person p=new Person("jack",18);
        Gson gson=new Gson();
        JsonElement jsonele=gson.toJsonTree(p);
        JsonObject json=jsonele.getAsJsonObject();
posted @ 2017-11-24 13:11  一只深海的蓝鲸  阅读(119)  评论(0)    收藏  举报