C#轉Java有一段時間了,之前做ASP.NET WebAPI微軟竟將第三方類庫Newtonsoft.Json作為VS新建MVC和WebAPI項目默認必備的Json工具Nuget包,可想而知這個包有多受寵。
現在Newtonsoft.Json的最新版本已經出到v10.0.2了,而Java則是谷歌的開源Json工具包:Gson,目前最新版本是v2.8.0,最新他和Newtonsoft.Json的原理一樣,也是使用反射來實現的。
如果要在Android Studio使用非常簡單,先在AndroidManifest.xml添加
compile 'com.google.code.gson:gson:2.8.0'
然后Android Studio就會提示你gradle文件已經更改過了,需要同步,點擊上方黃色提示框右邊的Sync Now然后等一會就可以盡情的使用了。
那如何使用它呢?我這里有一個復雜一點的Json,先看這段Json;
{
"data": [
{
"Avatar": "/Image/avatar0.jpg",
"Id": 0,
"IsDelete": true,
"Name": "旋風小伙0"
},
{
"Avatar": "/Image/avatar1.jpg",
"Id": 1,
"IsDelete": true,
"Name": "旋風小伙1"
},
{
"Avatar": "/Image/avatar2.jpg",
"Id": 2,
"IsDelete": true,
"Name": "旋風小伙2"
}
],
"result": {
"code": 1,
"msg": "Ok"
}
}
分析這段Json,Java的對象模型大概是這樣的:
對了,如果你想在Android Studio快速生成Setter和Getter方法,只需要在當前類使用Alt+Insert快捷鍵選擇你想快速生成的代碼類型即可
用戶信息的模型:UserInfo
public class UserInfo { private int Id; private String Name; private String Avatar; private boolean IsDelete;
...Setter和Getter方法 }
返回狀態代碼的模型:BaseResult
public class BaseResult { private int code; private String msg;
...Setter和Getter方法
}
Result-Data模型
public class DataResult { private BaseResult result; private List<UserInfo> data;
...Setter和Getter方法
}
生成模型后我們就要開始實例化對象,打開MainActicity.java在onCreate方法添加如下代碼:
DataResult model = new DataResult(); List<UserInfo> users = new ArrayList<>(); //使用for循環添加UserInfo for (int i = 0;i < 3;i++){ UserInfo user = new UserInfo(); user.setAvatar("/Image/avatar" + i + ".jpg"); user.setId(i); user.setName("旋風小伙" + i); user.setDelete(true); users.add(user); } BaseResult result = new BaseResult(); result.setCode(1); result.setMsg("Ok"); model.setData(users); model.setResult(result);
最后,要用到我們強大的Gson類了,在這里Newtonsoft.Json和Gson的使用有點不同,Newtonsoft.Json序列化和反序列化的方法是靜態的,而Gson則不是,這里我們封裝一個JsonUitl為了以后方便靜態調用使用:
我們新建一個JsonUtil類:
1,定義一個靜態私有變量mGson,並將它實例化;
2,定義一個靜態方法ToObject,將json反序列轉化成指定對象,這個方法只有一行代碼,其實就是調用了Gson的fromJson方法,將一段json和要轉換的目標傳進去,他就會以什么類型返回;
2,定義一個靜態方法ToJson,將對象序列化轉化成Json,這個方法也是調用了Gson的ToJson方法將對象轉換成一段Json返回String類型;
import com.google.gson.Gson; /** * Created by Administrator on 2017/4/17. */ public class JsonUtil { private static Gson mGson = new Gson(); public static Object toObject(String json , Class classOfT){ return mGson.fromJson(json , classOfT) ; } public static <T> String toJson(T object) { return mGson.toJson(object); } }
這樣就好了,我們只需要一行代碼就可以把上面的model對象轉換成Json對象了。
String jsonData = JsonUtil.toJson(model);
Log.d("Test", jsonData);
運行模擬器,查看Android Monitor序列化結果,反序列也是如此。
