您的位置:首页 > 其它

Gson之基本用法

2016-04-20 22:02 423 查看
        项目中,解析json数据时,一直使用Gson解析。对于Gson的基本使用没有什么问题,但并没有Gson更深入的认识。json作为主流的数据传递方式,深入理解Gson的用法还是很有必要的,那么系统的了解下Gson到底可以做什么。

1.Gson的对象

        Gson是google推出的的一个开源库,可以用来将Java对象转换为Json对象,当然,也可以用来将json对象转换为Java对象。

2.Gson的目标

        1.提供简单易用的方法比如 toString() ,构造方法来转化JAVA为JSON以及反转化。

        2.提供已存在的不可修改对象转化为JSON以及反转化。

        3.提供对象的惯例表示

        4.支持任意复杂对象

        5.生成健壮、可读的JSON输出

3.JsonElement

        该类是一个抽象类,代表着json串的某一个元素。这个元素可以是一个Json(JsonObject)、可以是 一个数组(JsonArray)、可以是一个Java的基本类型(JsonPrimitive)、当然也可以为null(JsonNull); JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。JsonElement提供了一系列的方法来判断当前的JsonElement是否是上述子类的一种:比如isJsonObject()用来判断当
前的json元素是否是一个数组类型

4.基本用法

        1. Gson提供了toJson()和fromJson()两个直接用于解析和生成的方法,前者实现序列化,后者实现反序列化。
<span style="font-size:14px;">        public class User {
private String userName;
private int userAge;
private String userEmail;
}

Gson gson = new Gson();
// 序列化
User user = new User("张三", 23, "男");
String jsonUser = gson.toJson(user, User.class);
System.out.println("jsonUser = [" + jsonUser + "]"); // jsonUser = [{"userName":"张三","userAge":23,"userEmail":"男"}]
// 反序列化
User user_ = gson.fromJson(jsonUser, User.class);
System.out.println(user_.toString()); // User{userName='张三', userAge=23, userEmail='男'}

// 序列化数组
String names[] = new String[]{"Teaphy", "Job", "Lous", "Flosd"};
String jsonNames = gson.toJson(names);
System.out.println(jsonNames); // ["Teaphy","Job","Lous","Flosd"]
// 反序列化
String[] strings = gson.fromJson(jsonNames, String[].class);
System.out.println(strings.toString()); //[Teaphy, Job, Lous, Flosd]

// 序列话集合
Type type = new TypeToken<ArrayList<User>>() {
}.getType();
List<User> lists = new ArrayList<>();
lists.add(new User("Jso", 23, "M"));
lists.add(new User("Taad", 45, "W"));
lists.add(new User("Goos", 23, "M"));
String jsonList = gson.toJson(lists, type);
System.out.println(jsonList);  // [{"userName":"Jso","userAge":23,"userEmail":"M"},
// {"userName":"Taad","userAge":45,"userEmail":"W"},
// {"userName":"Goos","userAge":23,"userEmail":"M"}]

// 反序列化集合
List<User> lists_ = gson.fromJson(jsonList, type);
System.out.println(lists_.toString()); // [User{userName='Jso', userAge=23, userEmail='M'},
// User{userName='Taad', userAge=45, userEmail='W'},
// User{userName='Goos', userAge=23, userEmail='M'}]</span>


        2. 泛型的引用
<span style="font-size:14px;">        {
"retCode": "0000",
"resInfo": "成功",
"User":{
"userName":"张三",
"userAge":23,
"userEmail":"xxx@xx.com"
}
}</span>


        该如何解析上面的Json呢?个人而言,有两种思路,第一种是创建一个包含retCode、retInfo、User等字段的类, 另外一种是通过getJsonObject("User"),获取到User的json对象进行解析。第一种方法对于封装处理不好,显得繁琐,对于第二种方法,虽然封装好了,但是代码冗余。不得不承认,我习惯了第二张解析方式。偶尔翻看博客时,发现Gson解析,还可以使用泛型封装,简单粗爆啊,果断学习在案。
<span style="font-size:14px;">        2.1 封装Result<>泛型类
public class Result<T> {
public int code;
public String message;
public T data;
}
2. 解析
{"retCode": "0000","resInfo": "成功","User":{ ...}}
{"retCode": "0000","resInfo": "成功","Users":{ {...}...}}

* 没有引入泛型以前
public class UserResult {
public int code;
public String message;
public User data;
}
//=========
public class UserListResult {
public int code;
public String message;
public List<User> data;
}
//=========
String json = "{..........}";
Gson gson = new Gson();
UserResult userResult = gson.fromJson(json,UserResult.class);
User user = userResult.data;

UserListResult userListResult = gson.fromJson(json,UserListResult.class);
List<User> users = userListResult.data;
解析时,针对不同的情况,总是要写一不同的接口。
* 引入泛型以后
//不再重复定义Result类
Type userType = new TypeToken<Result<User>>(){}.getType();
Result<User> userResult = gson.fromJson(json,userType);
User user = userResult.data;

Type userListType = new TypeToken<Result<List<User>>>(){}.getType();
Result<List<User>> userListResult = gson.fromJson(json,userListType);
List<User> users = userListResult.data;</span>
       

        引入泛型以后,只需要一个接口,即可解析。

        Gson博大精深,还需继续领悟啊!!!

参考资料:

            1.Gson使用细节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: