Json详解
Json介绍
我们在开发基于网络的程序时,经常会使用到JSON。
相比XML这种数据交换格式来说,JSON相对解析更加简单一些,因此客户端和服务器的数据交换格式往往通过JSON进行交换。
1、什么是JSON?
JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。
采用一种完全独立于编程语言的“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。
简洁和清晰的层次结构,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、JSON格式
(1)对象Object
以(key/value)对形式存在的无序的JsonObject对象,
一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号); “名称/值”对之间使用“,”(逗号)
例如:
{"name":"lihuawei"}
这就是一个最简单的json对象,对于这种数据格式,key值必须是String,而value则可以是String,Number,Object,Array等数据类型。
(2)数组Array
有序的value的集合,这种形式被称为是JsonArray,数组是值(value)的有序集合。
一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
例如,
[{"Name" : "Jim"},{"Name" : "Jerry"}]
[{"Name" : "Jim", "Age" : 22} , {"Name" : "Jerry", "Age" : 23}]
如果数组中没有一个JSON对象,那这个JSON数组就是空数组。
[] // 空数组
3、JSON的值
JSON 值可以是:
- 字符串(在双引号中)
- 数字(整数或浮点数)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null(意思是空值)
4、JSON的嵌套
JSON的嵌套就比较复杂了。
何为嵌套呢?那就是JSON对象的值不是一个简单的值类型,而是另一个完整的JSON对象,甚至JSON数组。
(1)JSON中嵌套JSON对象
{"Info":{"Name":"Zhangsan","Height":"180cm"}}
(2)JSON中嵌套数组
{"Address":[{"Pronvice":"山东","City":"烟台"},{"Pronvice":"江苏","City":"苏州"}]}
JSON解析
1、Android中解析JSON
Android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject
例如,解析如下格式的JSON,通过分析可以看出,这个JSON就是一个JSONObject。
{
"msg": "操作成功",
"code": 200,
"token": "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImIzODI4NWUzLTY2NDgtNGIwYi04ZGNmLTk4YzNkMzc3ZjEwNyJ9.bR6Tm9SujlTbjb9G4npDBuhgIt6-UVZ4AaLFKs4wVvDPQOfI8QOcmjjhKQPowEpBoc5NRYm4Rswg4WiCcOciwA"
}
我们定义一个Bean类
public class LoginData {
private int code;
private String msg;
private String token;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
public String toString() {
return "LoginData{" +
"code=" + code +
", msg='" + msg + '\'' +
", token='" + token + '\'' +
'}';
}
}
解析JSON的方法
/**
* 原生的JSON解析方式,单个对象
* Json形式:{"msg":"操作成功","code":200,"token":"XXXX123"}
*
* @param jsonString
* @return 登录信息
*/
public static LoginData getObjectByJson(String jsonString) {
LoginData loginData = null;
try {
JSONObject jsonObject = new JSONObject(jsonString);
loginData = new LoginData();
loginData.setCode((int) jsonObject.get("code"));
loginData.setMsg((String) jsonObject.get("msg"));
loginData.setToken((String) jsonObject.get("token"));
} catch (Exception e) {
e.printStackTrace();
}
return loginData;
}
JSONArray
/**
* JSON 解析方法
*
* @param jsonData
* @return String
*/
public static String readJSONContent(String jsonData) {
try {
Log.d(TAG, "readJSONContent: jsonData = " + jsonData);
StringBuffer sb = new StringBuffer();
JSONArray jsonArray = new JSONArray(jsonData);
Log.d(TAG, "readJSONContent: jsonArray = " + jsonArray.length());
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
sb.append(jsonObject.getString("total") + "\n");
sb.append(jsonObject.getString("rows") + "\n");
}
return sb.toString();
} catch (JSONException e) {
Log.e(TAG, "readJSONContent: " + e.toString());
return e.toString();
}
}
2、使用Gson库解析JSON
导入gson库