json数据是一种轻量级的数据交换格式,一键值对的形式表现的。用[]括起来的可以理解为数组、用{}括起来的可以理解为对象。
例如:
//对象
{
"id":123,
"username":"ws",
"password":"admin",
"phone":"15333333333"
}
//数组
[{
"id":123,
"username":"ws",
"password":"admin",
"phone":"15333333333"
},
{
"id":123,
"username":"ws",
"password":"admin",
"phone":"15333333333"
}]
json解析是一种原声的解析方式,主要注意两种对象:JSONObject和JSONArray。
JSONObject———>{}
JSONArray———>[]
也就是说,遇到[]就解析为数组JSONArray,遇到{}就解析为JSONObject。
下面拿一个小例子来说明:
{
"id":001,
"username":"ws",
"pasword":"admin",
"action":[{"type":"eat",
"time":"6"},
{"type":"sleep"
"time":"11"
}]
}
接下来进行解析喽:
public Map<String,Object> getDate(String json){
//最外层为{},所以我这里解析为Map
Map<String,Object> map = new HashMap<>();
try {
//一定不要忘了传参数哈
JSONObject jsonObject = new JSONObject(json);
int id = jsonObject.getInt("id");
map.put("id",id);
String username = jsonObject.getString("username");
map.put("username",username);
//使用opt防止出现空指针
String password = jsonObject.optString("password");
map.put("password",password);
//此处可以看到有一个[],所以解析为数组
JSONArray jsonArray = jsonObject.getJSONArray("action");
//存放数组,就需要有集合
List<PersonClass> list = new ArrayList<>();
//对集合进行遍历,取出所有的对象
for(int i = 0 ;i<jsonArray.length();i++){
jsonObject = jsonArray.getJSONObject(i);
String type = jsonObject.getString("type");
String time = jsonObject.getString("time");
//对象可以放Map中也可以放对象(类)中
PersonClass personClass = new PersonClass(type,time);
list.add(personClass);
}
//最后将集合整体放到Map中
map.put("action",list);
return map;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
class PersonClass{
private String type;
private String time;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public PersonClass() {
}
public PersonClass(String type, String time) {
this.type = type;
this.time = time;
}
}
说明一下:
1、我们可以把解析出来的东西放到map里,或者解析成对象,我这里都一起使用了。
2、解析的时候我使用的有getXXX还有optXXX,个人推荐使用optXXX因为使用它可以避免空指针的出现。
3、之前也说过遇到[]就理解为数组、{}理解为对象,所以在解析的时候遇到[]就创建一个集合,遇到{}就创建一个对象或者Map。
这一块就是多加练习就OK的。
Gson是在json的封装基础上产生的,有的时候用着很方便,但是没有原声的灵活,所以大多数都是两种一起使用。
1、使用Gson是将{}解析成了对象,所以就需要有一个相应的实体类;
2、类中的属性必须和json数据的key的字段一样;
3、json数据中的字段,在实体类中不一定包含该属性;
4、若{}中包涵{},只需在实体类中在创建一个内部类就可以;
5、若{}中包涵[],只需使得实体类中对应的属性为集合就可以了;
6、若一开始就是[],就要使用TypeToken
//使用Gson进行解析Person
public static T getPerson(String jsonString, Class<T> cls) {
T t = null;
try {
Gson gson = new Gson();
t = gson.fromJson(jsonString, cls);
} catch (Exception e) {
// TODO: handle exception
}
return t;
}
// 使用Gson进行解析 List
public static List getPersons(String jsonString, Class<T> cls) {
List list = new ArrayList();
try {
Gson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List>() {
}.getType());
} catch (Exception e) {
}
return list;
}
更多的Gson学习点击这里