JSON
这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了
JSON格式数据使用JsonObject和JsonArray相配合不难。只要注意分清是所要解析的数据是Object还是Array即可
[ {"id" : 5 , "version" : "1.0" , "name" :"Googlemap"},
{"id" : 5 , "version" : "1.0" , "name" :"Chrome"},
{"id" : 5 , "version" : "1.0" , "name" :"GooglePlay"}]
一个JsonArray中包含三个JsonObject
String data=......; //返回的字符串数据
JsonObject object=new JsonObject(data);
JsonArray array=object.getJsonArray(String key);
//在对象中解析出某一key所对应的数组
String data=......;
JsonArray array=new JsonArray(data);
JsonObject object=array.getJsonObject(int index);
//解析出此数组中的第几个对象
要注意的是:此方法解析式对象数组交错嵌套的数据要一级一级解析下去,切不可直接以所要解析的数据的key直接去解析,会报所要解析数据为空的错
此方法不想逢数据解析就一级一级写代码的话就将其作为工具类封装起来吧
开源GSON
GSON很直观,因为所有的key对应的对象GSON都实例化为具体的类了,其中的对象定义为此类中的参数
比如前面的Json数组可定一类
public class APP{
private String id;
private String version;
private String name;
GETTER;SETTER;
}
GSON使用
1、添加依赖
compile 'com.google.code.gson:gson:2.7'
2、得到Gson对象
Gson gson=new Gson();
3、将数据解析到与之相对应的对象中
gson.fromJson(String jsonData , ClassName.class);
Gson gson=new Gson();
//数组使用此方法解析
List<APP> apps=gson.fromJson(jsonData
,new TypeToken<List<APP>>(){}.getType());
for(APP app:apps){
//遍历逻辑;此例中会得到三个APP对象分别为数组的三个元素
logd(TAG , app.getId());
logd(TAG , app.getVersion());
logd(TAG , app.getName());
}
假如Json数据上一级对象向key为Google的话,新建Google类解析式为
Google google=gson.fromJson(jsonData ,Google.class);
注意
解析时json对象实体类中的参数的名字要与json数据中的key是一样的,但很多时候由于我们要方便辨认具体是什么所以要命名的更详细,如此Gson便识别不出,就会报错可以用标注(@SerializedName("key"))来实现,比如:
{"id" : "5" , "version" : "1.5" ,"name" : "Googlemap"}
public class App{
@SerializedName("id")
private String appid;
@SerializedName("version")
private String appversion;
@SerializedName("name")
private String appname;
GETTER;SETTER;
}
这样GSON就会自动将自定义的命名和key对应起来
如果是数组
比如
{"area" : "China" ,
"phone" : [ {"id" : 5 , "version" : "1.0" , "name" :"Googlemap"},
{"id" : 5 , "version" : "1.0" , "name" :"Chrome"},
{"id" : 5 , "version" : "1.0" , "name" :"GooglePlay"}]}
在创建实体类时
public class Phone{
//Phone的实体类
public String id;
public String version;
public String name;
}
public class Terminal{
//终端类下的参数为地区和手机类的对象集合
public String area;
public List<Phone> phonelist;
}