解析Json数据时,遇到二维数组或者更多维的数组的处理方法。
Json如下:
{"code": 1,
"data": [
[
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
}
],
[
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
}
],
[
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
}
]
],
"message": "success!"}
看到这种JSON,新入门的伙伴们肯定会感到头大,好像很麻烦也!?
JsonObject
采用原生的JsonObject,JsonArray方式会非常非常麻烦,首先解析JsonObject==》解析"data" JsonArray==>再解析JsonArray[i]==>再解析JsonObject。
是不是看上去就懵逼,而且很复杂。
那么肯定有更简单的方式去解析这种多维的JSON数组。
Gson
今天就讲一下Gson解析多维数组:
切记一定要实现Serializable序列化接口,只有这样才能正常解析或者转换。
public class UserBean implements Serializable {
private String addr;
private String nodename;
private String uid;
//=====================================
//上面3个参数名就是对应的json对象
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
}
//=====================================
public String getUid() {
return userid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getNodename() {
return nodename;
}
}
2.分析要解析的Json结构:
{"code": 1,
"data": [
[
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
}
]
],
"message": "success!"}
分析步骤:①把最外围的键对当做实体类中的参数名 ,一定要与json数据中的键名保持一致,我们生成实体类的时候,一般参数名都是小写
②键值对相对应的值的类型就是我们实体类中参数名的类型。扩展:
如"data":[] 碰到这种键值对,实体类中的参数就可以写成 List
言归正传,仔细观察我们的Json,会发现"data"的值是一个二维数组,而第二维中的数据才是我们需要的数据,也就是我们的UserBean,很简单,用于直接解析的根实体这么写就OK了:
class MyDataBean implements Serializable {
private List> data;
//=====================================
"data": [
[
{
"nodename": "测试",
"addr": "中国北京市xx区xx路x号",
"uid": "123",
} "{}"里的是UserBean
] 这一维数组"[]"是List
] 最外围的数组"[]"是List>
//=====================================
private String code;
private String message;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public List> getData() {
return data;
}
public void setData(List> data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
最后解析就用两行代码就完事了:
//=====================================
Gson gson = new Gson();
//解析成我们的根实体类,这样,二维数组就完全导入到我们的实体类中了
MyDataBean myDataBean = gson.fromJson(jsonstr, MyDataBean.class);
//=====================================
//想要取值只需要遍历一下即可:
UserBeanList = new ArrayList();
for (int i = 0; i < myDataBean.getData().size(); i++) {
//这个就是我们的二维Json数组
List> mlslsAmb = myDataBean.getData();
if (mlslsAmb != null && mlslsAmb.size() > 0) {
//因为第二维数组只存在一个元素,所以只需要获取第一个,也就是get(0)
UserBean abean = mlslsAmb.get(i).get(0);
//最后装载进我们的UserBeanList就可以正常使用了
UserBeanList.add(abean);
}
}
扩展:
解析JsonArray
//直接解析JsonArray
//json代码如下:
//=====================================
[
{
"nodename": "测试",
"uid": "11",
"addr": "中国北京市xx区xx路x号",
},
{
"nodename": "zhangsan",
"uid": "10",
"addr": "中国北京市xx区xx路x号",
}
]
//=====================================
//使用以下方法进行解析
List ls_userBean = new Gson().fromJson(user, new TypeToken>() {}.getType());
这样就把jsonArray直接变成ArrayList了