各位看官们,大家好,上一回中咱们说的是Android中解析JSON对象的例子,这一回中咱们介绍的例子是解析JSON数组。闲话休提,言归正转。让我们一起Talk Android吧!
看官们,本章回中我们将介绍特殊的JSON数组,此数组和上一章回中解析的混合数组类似,特殊之处在于key的string没有英文,只有数字,生成的JavaBean类比较特殊。下面是一个示例数据,请大家参考:
{"age":20,"list":{"0":{"id":33,"name":"Jack"},"1":{"id":98,"name":"Nik"}}}
注意一下key的值为0和1这样的字符串,不带有英文字符。这里涉及三种解析:普通标量解析、JSON对象解析、JSON数组解析。和解析混合数组一样使用分层的思路进行解析。
分层思路:
使用GsonFormat创建JavaBean类,先解析主类再解析子类,也就是从外到内一层一层地解析.这个示例中包含三层(最外层一个主类,主类中包含两个子类)
- 第一层解析获取JSON对象 ;
- 第二层解析获取获取JSON对象和JSON数组;
- 第三层解析是从第二层解析到的JOSON数组中获取JSON对象
这里的解析思路也是使用了分层思路,特殊之处在于转换成Java对象时,内部类的名称比较特殊。因为JSON数据的key中只有数字没有英文,因此GsonFormat工具自动生成了特殊的内部类名:_$1Bean,详细可以查看示例程序中代码。如果觉得这样的名字不好,可以自己手动修改。下面是示例程序,程序中包含GsonFormat自动生成的JavaBean类和解析程序:
import com.google.gson.annotations.SerializedName;
public class JavaBeanSpecial {
/**
* age : 20
* list : {"0":{"id":33,"name":"Jack"},"1":{"id":98,"name":"Nik"}}
*/
private int age;
private ListBean list;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public ListBean getList() {
return list;
}
public void setList(ListBean list) {
this.list = list;
}
public static class ListBean {
/**
* 0 : {"id":33,"name":"Jack"}
* 1 : {"id":98,"name":"Nik"}
*/
@SerializedName("0")
private _$0Bean _$0;
@SerializedName("1")
private _$1Bean _$1;
public _$0Bean get_$0() {
return _$0;
}
public void set_$0(_$0Bean _$0) {
this._$0 = _$0;
}
public _$1Bean get_$1() {
return _$1;
}
public void set_$1(_$1Bean _$1) {
this._$1 = _$1;
}
public static class _$0Bean {
/**
* id : 33
* name : Jack
*/
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "_$0Bean{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static class _$1Bean {
/**
* id : 98
* name : Nik
*/
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "_$1Bean{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@Override
public String toString() {
return "ListBean{" +
"_$0=" + _$0 +
", _$1=" + _$1 +
'}';
}
}
@Override
public String toString() {
return "JavaBeanSpecial{" +
"age=" + age +
", list=" + list +
'}';
}
}
private void parseJsonSpecialByJavaNative() {
String jsonDataStr = "{\"age\":20,\"list\":{\"0\":{\"id\":33,\"name\":\"Jack\"},\"1\":{\"id\":98,\"name\":\"Nik\"}}}\n";
try {
JSONObject jsonObject = new JSONObject(jsonDataStr);
//解析第一层
int age = jsonObject.optInt("age");
JSONObject jsonObjectLevel1 = jsonObject.optJSONObject("list");
//解析第二层,注意这里的key是数字,不包含英文
JSONObject jsonObjectLevel2_1 = jsonObjectLevel1.optJSONObject("0");
JSONObject jsonObjectLevel2_2 = jsonObjectLevel1.optJSONObject("1");
//解析第三层,同时转换第三层
JavaBeanSpecial.ListBean._$0Bean special1 = new JavaBeanSpecial.ListBean._$0Bean();
special1.setId(jsonObjectLevel2_1.optInt("id"));
special1.setName(jsonObjectLevel2_1.optString("name"));
JavaBeanSpecial.ListBean._$1Bean special2 = new JavaBeanSpecial.ListBean._$1Bean();
special2.setId(jsonObjectLevel2_2.optInt("id"));
special2.setName(jsonObjectLevel2_2.optString("name"));
//转换第二层
JavaBeanSpecial.ListBean listBean = new JavaBeanSpecial.ListBean();
listBean.set_$0(special1);
listBean.set_$1(special2);
//转换第一层
JavaBeanSpecial javaBeanSpecial = new JavaBeanSpecial();
javaBeanSpecial.setAge(age);
javaBeanSpecial.setList(listBean);
Log.d(TAG, "parseJsonSpecialByJavaNative: "+javaBeanSpecial.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
编译并且运行上面的程序,可以得到以下解析后的结果:
parseJsonSpecialByJavaNative: JavaBeanSpecial{age=20, list=ListBean{_$0=_$0Bean{id=33, name='Jack'}, _$1=_$1Bean{id=98, name='Nik'}}}
看官们,关于Android中解析JSON数组的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!