Json 数据是android 客户端与服务端进行数据传递,非常重要的数据组织格式。
这篇blog主要来记载如何用alibaba的json解析库,com.alibaba:fastjson,进行json数据转换成java对象
首先,我们先来简单介绍下json数组的组织语法:
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
现在,我们来看看如何去解析json数据
1.首先创建一个json文档。 我们在res/raw目录下,新建文本json_test.txt,其具体内容如下:
{
"v": "20160613",
"type": "1",
"list": [
{
"pkgs":[ "ic_app_phone",
"ic_app_phone_other"],
"loc": "0",
"screen": "0"
},
{
"pkgs": ["ic_app_settings",
"ic_app_settings_test1",
"ic_app_settings_test2"],
"loc": "11",
"screen": "0"
}
]
}
注意:key、value(普通类型与数组类型的组织形式)
2.com.alibaba:fastjson包的导入。
在build.gradle文件中 dependencies 内容中加入如下:
compile 'com.alibaba:fastjson:1.2.17'
3.创建Json转换成Java对象的Bean类型。
public class JsonBean {
public String v;
public String type;
public List<Info> list;
//注意:这里关键字的名字一定要与Json文本中key值相同。
public static class Info{
public List<String> pkgs;
public String loc;
public String screen ;
//注意:这里关键字的名字一定要与Json文本中key值相同。
}}
4. 读入文本,并进行解析
public class Controller {
private Context mContext;
public Controller(Context context) {
mContext = context;
String jsonStr = getJsonInfoFromRaw();
JsonBean bean = JSON.parseObject(jsonStr, JsonBean.class);
printJsonInfo(bean);
}
private String getJsonInfoFromRaw(){
String result="";
try {
InputStreamReader inputReader = new InputStreamReader( mContext.getResources().openRawResource(R.raw.json_test));
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
while((line = bufReader.readLine()) != null)
result += line;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private void printJsonInfo(JsonBean bean) {
String version = bean.v;
String type = bean.type;
Log.e("vnbo","vnbo hello test version is "+version + " type is "+type);
List<JsonBean.Info> list = bean.list;
if(list != null && list.size() != 0) {
for(int i = 0; i < list.size(); i++) {
Log.e("vnbo","vnbo hello test loc is "+list.get(i).loc + " screen is "+list.get(i).screen);
for(int j = 0 ; j < list.get(i).pkgs.size(); j++) {
Log.e("vnbo","vnbo hello test pkgs is "+list.get(i).pkgs.get(j));
}
}
}
}