首先这里,我们使用的工具是谷歌封装的Gson,在写这篇博文是用到的是gson 2.7,调用时需要在build.gradle 中添加下面的依赖项
compile 'com.google.code.gson:gson:2.7'
下面通过这个json串来讲解一下一些概念
{
"status": [],
"message": "logout successfully",
"data": [
{
"pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
"fensi": 0,
"guanzhu": 0
},
{
"pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
"fensi": 0,
"guanzhu": 0
}
]
}
基础知识:因为在学习使用的过程,需要知道这三个基础概念:
(1)JsonElement,每一个节点就是一个JsonElement,例如,”status”: 1
(2)JsonArray ,被[…]包住的整一个部分,这种类型的JsonElement
(3)JsonObject,被{ … }包住的整一个部分,这种类型的JsonElement
我们现在要分解它们里面的元素,我们需要记住
JsonArray中可以有多个或无JsonObject,JsonObject中可以有多个或无JsonElement;
每一个JsonElement可以是JsonObject,也可以是JsonArray;
通过下面这串Json为例子,我要取”pic_dir” ,“fensi”,“guanzhu”里面的数据,可以联想为一个JsonObejct里,某个是JsonArray的JsonElement里的某个是JsonObject的JsonElement的某一个JsonElement;(相对于取“fensi”这个JsonElement,联想为取一个JsonObejct里,”data“这个是JsonArray的JsonElement里的某个是JsonObject的JsonElement的“fensi”这个JsonElement的数据;)
总结: 三个基本要素你中有我,我中有你
下面开始讲一些常见的,开发中可能会遇见的Json格式·
1.常见的第一种Json格式
{
"status": 1,
"message": "logout successfully",
"data": []
}
相关代码(保持和返回Json字串的name对应一致)
public class LoginResult {
private String status;
private String message;
private String data;
public LoginResult(String status, String message, String data) {
this.status = status;
this.message = message;
this.data = data;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
解析方法,通过ViewModel类的get/set方法来获取对应某个JsonElement的数据
//使用工具将其封装成一个类的对象
Gson gson = new Gson();
//fromJson这个方法可以将json字符串转换成ViewModel,前提是ViewModel的Filed要和
//json字符串的一致
LoginResult result = gson.fromJson(sb.toString(), LoginResult.class);
例如,获取json中message节点
Logger.d(result.getMessage());
2.常见的第二种Json格式
{
"status": 1,
"message": "query success",
"data": {
"pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
"fensi": 0,
"guanzhu": 0
}
}
notes: 这种情况下,data节点下的数据对应的是 JsonObject,知道这一点后面的解析方法就清晰了,而整一个Json串又是一个JsonObject。
相关代码
public class ViewModelResult {
private String status;
private String message;
private JsonObject data;
public ViewModelResult(String status, String message, JsonObject data) {
this.status = status;
this.message = message;
this.data = data;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public JsonObject getData() {
return data;
}
public void setData(JsonObject data) {
this.data = data;
}
}
解析相关代码
Logger.d(receiverJsonString);
ViewModelResult result = gson.fromJson(receiverJsonString,ViewModelResult.class);
JsonObject dataStr = result.getData();
Logger.d(dataStr.toString());
...
JsonObject receiveJson;
FansViewModel viewModel;
//将整一个json字符串转换成json对象
receiveJson = dataStr;
viewModel = new FansViewModel();
viewModel.setPic_dir(receiveJson.get("pic_dir").getAsString());
viewModel.setFensi(receiveJson.get("fensi").getAsInt());
viewModel.setGuanzhu(receiveJson.get("guanzhu").getAsInt());
viewModels.add(viewModel);
3.第三种Json格式
{
"status": 1,
"message": "logout successfully",
"data": [
{
"pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
"fensi": 0,
"guanzhu": 0
},
{
"pic_dir": "uploads/touxiang/20170624/fc4c604edaf2f32f6f5b4af939337d38.jpg",
"fensi": 0,
"guanzhu": 0
}
]
}
解析相关代码,获取”pic_dir”,原理就是通过利用fromJson方法解析后获得的ViewModel的第三个JsonElement是一个JsonArray,先通过JsonArray的方法获取到JsonObject然后再获取你想要的JsonElement。方法就不赘述了。
//关键方法
jsonArray.get(i).getAsJsonObject();
jsonObject.get(i).getAsString();
//先将下面这个服务器返回的字符串转换成Json数组
String receiverJsonString = readStream(is);
Logger.d(receiverJsonString);
HomeInitialResult result = gson.fromJson(receiverJsonString,HomeInitialResult.class);
JsonArray receiveJson = result.getData();
int size = receiveJson.size();
Logger.d(receiveJson.toString()+"\nJsonArraySize --- " + size);
//JsonObject 进一步拆分
HomeInitialItem viewModel = null;
for(int i=0; i<size; i++) {
//将整一个json字符串转换成json对象
viewModel = new HomeInitialItem();
viewModel.setPic_dir(receiveJson.get(i).getAsJsonObject().get("pic_dir").getAsString());
viewModel.setAct_id(receiveJson.get(i).getAsJsonObject().get("act_id").getAsInt());
viewModel.setAct_title(receiveJson.get(i).getAsJsonObject().get("act_title").getAsString());
dataLists.add(viewModel);
}
这是我的一些见解,大神勿喷,如有错误会及时勘正。