Json是一種輕量級的數據交換格式,采用一種“鍵:值”對的文本格式來存儲和表示數據,在系統交換數據過程中常常被使用,是一種理想的數據交換語言。在使用Java做Web開發時,不可避免的會遇到Json的使用。下面我們就簡單講一下Json的使用以及fastjson.jar包的使用。
一:JSON形式與語法
1.1:JSON對象
我們先來看以下數據:
{
"ID": 1001,
"name": "張三",
"age": 24
}
第一個數據就是一個Json對象,觀察它的數據形式,可以得出以下語法:
1:數據在花括號中
2:數據以"鍵:值"對的形式出現(其中鍵多以字符串形式出現,值可取字符串,數值,甚至其他json對象)
3:每兩個"鍵:值"對以逗號分隔(最后一個"鍵:值"對省略逗號)
遵守上面3點,便可以形成一個json對象。
1.2:JSON對象數組
接下來我們再看第二個數據,觀察它的數據形式,可以得出以下語法:
[
{"ID": 1001, "name": "張三", "age": 24},
{"ID": 1002, "name": "李四", "age": 25},
{"ID": 1003, "name": "王五", "age": 22}
]
1:數據在方括號中(可理解為數組)
2:方括號中每個數據以json對象形式出現
3:每兩個數據以逗號分隔(最后一個無需逗號)
遵守上面3點,便可形成一個json對象數組(及一個數組中,存儲了多個json對象)
理解了上面兩種基本的形式,我們就可以得出其他的數據形式,例如下面這個:
{
"部門名稱":"研發部",
"部門成員":[
{"ID": 1001, "name": "張三", "age": 24},
{"ID": 1002, "name": "李四", "age": 25},
{"ID": 1003, "name": "王五", "age": 22}],
"部門位置":"xx樓21號"
}
這是上面兩個基本形式結合出來的一種變形,通過這種變形,使得數據的封裝具有很大的靈活性,能讓開發者自由的發揮想象力。
1.3:JSON字符串
JSON字符串也是在平時開發中使用較多的,json字符串應滿足以下條件:
1:它必須是一個字符串,由" "或者' '包裹數據,支持字符串的各種操作
2:里面的數據格式應該要滿足其中一個格式,可以是json對象,也可以是json對象數組或者是兩種基本形式的組合變形。
總結:json可以簡單的分為基本形式:json對象,json對象數組。兩種基本格式組合變形出其他的形式,但其本質還是json對象或者json對象數組中的一種。json對象或對象數組可以轉化為json字符串,使用於不同的場合。
注意點:在封裝json數據的時候,很容易出現錯誤,比如粗心的在最后一條數據的末尾加上了逗號等等,可以使用一些工具去驗證json數據格式的正確性,也可以用在線檢測:https://www.json.cn/。
二:fastjson介紹與使用
2.1:fastjson簡介與jar下載
fastjson.jar是阿里爸爸開發的一款專門用於Java開發的包,可以方便的實現json對象與JavaBean對象的轉換,實現JavaBean對象與json字符串的轉換,實現json對象與json字符串的轉換。除了這個fastjson以外,還有Google開發的Gson包,其他形式的如net.sf.json包,都可以實現json的轉換。方法名稱不同而已,最后的實現結果都是一樣的。
2.2:首先理解JSONArrary和JsonObject
1、JSONObject和JSONArray的數據表示形式
JSONObject的數據是用 { } 來表示的,
例如: { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業", "content" : null }
而JSONArray,顧名思義是由JSONObject構成的數組,用 [ { } , { } , ...... , { } ] 來表示
例如: [ { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業" } , { "content" : null, "beginTime" : 1398873600000 "endTime" } ] ;
表示了包含2個JSONObject的JSONArray。
可以看到一個很明顯的區別,一個最外面用的是 { } ,一個最外面用的是 [ ] ;
2、如何從字符串String獲得JSONObject對象和JSONArray對象
JSONObject jsonObject = new JSONObject ( String str);
JSONArray jsonArray = new JSONArray(String str ) ;
3、如何從JSONArray中獲得JSONObject對象
大家可以把JSONArray當成一般的數組來對待,只是獲取的數據內數據的方法不一樣
JSONObject jsonObject = jsonArray.getJSONObject(i) ;
4、獲取JSON內的數據
int mid= jsonObject.getInt ( "id" ) ; // 這里的mid得到的數據就是123.
String mcourse=jsonObject.getString( " courseID") ; // 這里的mcourse得到的數據就是huangt-test.
1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.apache.commons.io.IOUtils;
8 import org.junit.Test;
9
10 import com.alibaba.fastjson.JSON;
11 import com.alibaba.fastjson.JSONArray;
12 import com.alibaba.fastjson.JSONObject;
13 import com.alibaba.fastjson.serializer.SerializerFeature;
14
15 /**
16 * JSONArray : 相當於List </br>
17 * JSONObject: 相當於Map<String,Object>
18 * @author yang.han
19 *
20 */
21 public class TestFastJosn {
22
23 /**
24 * java對象轉 json字符串
25 */
26 @Test
27 public void objectToJson() {
28 // 簡單java類轉json字符串
29 User user = new User("dmego", "123456");
30 String UserJson = JSON.toJSONString(user);
31 System.out.println("簡單java類轉json字符串:" + UserJson);
32
33 // List<Object>轉json字符串
34 User user1 = new User("zhangsan", "123123");
35 User user2 = new User("lisi", "321321");
36 List<User> users = new ArrayList<User>();
37 users.add(user1);
38 users.add(user2);
39 String ListUserJson = JSON.toJSONString(users);
40 System.out.println("List<Object>轉json字符串:" + ListUserJson);
41
42 // 復雜java類轉json字符串
43 UserGroup userGroup = new UserGroup("userGroup", users);
44 String userGroupJson = JSON.toJSONString(userGroup);
45 System.out.println("復雜java類轉json字符串:" + userGroupJson);
46
47 }
48
49 /**
50 * json字符串轉java對象 注:字符串中使用雙引號需要轉義 (" --> \"),這里使用的是單引號
51 */
52 @Test
53 public void JsonToObject() {
54 /*
55 * json字符串轉簡單java對象 字符串:{"password":"123456","username":"dmego"}
56 */
57
58 String jsonStr1 = "{'password':'123456','username':'dmego'}";
59 User user = JSON.parseObject(jsonStr1, User.class);
60 System.out.println("json字符串轉簡單java對象:" + user.toString());
61
62 /*
63 * json字符串轉List<Object>對象
64 * 字符串:[{"password":"123123","username":"zhangsan"
65 * },{"password":"321321","username":"lisi"}]
66 */
67 String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
68 List<User> users = JSON.parseArray(jsonStr2, User.class);
69 System.out.println("json字符串轉List<Object>對象:" + users.toString());
70
71 /*
72 * json字符串轉復雜java對象
73 * 字符串:{"name":"userGroup","users":[{"password":"123123"
74 * ,"username":"zhangsan"},{"password":"321321","username":"lisi"}]}
75 */
76 String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
77 UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class);
78 System.out.println("json字符串轉復雜java對象:" + userGroup);
79 }
80
81 @Test
82 public void parserJsonTxt() throws IOException{
83 ClassLoader cl = this.getClass().getClassLoader();
84 InputStream inputStream = cl.getResourceAsStream("date1.json");
85 String jsontext = IOUtils.toString(inputStream, "utf8");
86
87 JSONObject obj=JSONObject.parseObject(jsontext);//獲取jsonobject對象
88 JSONObject obj1 = obj.getJSONObject("data");
89 JSONArray jsonArray = obj1.getJSONArray("rows");
90 System.out.println("jsonArray:"+jsonArray);
91 JSONObject obj2 = jsonArray.getJSONObject(1);
92 System.out.println("obj2:" +obj2);
93 for(Iterator iterator = jsonArray.iterator(); iterator.hasNext();) {
94 JSONObject jsonObject1 = (JSONObject) iterator.next();
95 System.out.println(jsonObject1);
96 }
97
98 info_util iu = JSON.parseObject(jsontext, info_util.class);//取得第一層JSONObject
99 info_data_util du = JSON.parseObject(iu.getData(), info_data_util.class);//取得第二層JSONObject
100 List<info_array_Util> olist = JSON.parseArray(du.getRows(), info_array_Util.class);//取得第三層JSONArray
101 System.out.println(iu);
102 System.out.println(du);
103 System.out.println(olist);
104
105 }
106
107 }
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
import java.util.ArrayList;
import java.util.List;
public class UserGroup {
private String name;
private List<User> users = new ArrayList<User>();
public UserGroup() {
}
public UserGroup(String name, List<User> users) {
this.name = name;
this.users = users;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return "UserGroup [name=" + name + ", users=" + users + "]";
}
}
public class info_util {
private int status;
private String msg;
private String data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@Override
public String toString() {
return "info_util [status=" + status + ", msg=" + msg + ", data="
+ data + "]";
}
}
public class info_data_util {
private int start, limit, total;
private String rows;
@Override
public String toString() {
return "info_data_util [start=" + start + ", limit=" + limit
+ ", total=" + total + ", rows=" + rows + "]";
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public String getRows() {
return rows;
}
public void setRows(String rows) {
this.rows = rows;
}
}
public class info_array_Util {
private String messageNo, memberNo, mobileNo, nickname, headPath, content;
private int messageType, readFlag;
private long sendTime, updateTime;
public String getMessageNo() {
return messageNo;
}
public void setMessageNo(String messageNo) {
this.messageNo = messageNo;
}
public String getMemberNo() {
return memberNo;
}
public void setMemberNo(String memberNo) {
this.memberNo = memberNo;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getHeadPath() {
return headPath;
}
public void setHeadPath(String headPath) {
this.headPath = headPath;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getMessageType() {
return messageType;
}
public void setMessageType(int messageType) {
this.messageType = messageType;
}
public int getReadFlag() {
return readFlag;
}
public void setReadFlag(int readFlag) {
this.readFlag = readFlag;
}
public long getSendTime() {
return sendTime;
}
public void setSendTime(long sendTime) {
this.sendTime = sendTime;
}
public long getUpdateTime() {
return updateTime;
}
public void setUpdateTime(long updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "info_array_Util [messageNo=" + messageNo + ", memberNo="
+ memberNo + ", mobileNo=" + mobileNo + ", nickname="
+ nickname + ", headPath=" + headPath + ", content=" + content
+ ", messageType=" + messageType + ", readFlag=" + readFlag
+ ", sendTime=" + sendTime + ", updateTime=" + updateTime + "]";
}
}
date1.json 文件內容
{
"status": 1,
"msg": null,
"data": {
"start": 0,
"limit": 10,
"total": 5,
"rows": [
{
"messageNo": "Me201607211148242364423",
"memberNo": "AD2016070812145640900000003",
"mobileNo": "151****1314",
"nickname": "遠方",
"headPath": "/fileupload/memberImage/83788978A0614007BF7F5D20F668088A1468667650848.jpg",
"messageType": 0,
"readFlag": 0,
"sendTime": 1469072904000,
"content": " ",
"updateTime": 1469072904000
},
{
"messageNo": "Me201607211146458551987",
"memberNo": "AD2016070812145640900000003",
"mobileNo": "151****1314",
"nickname": "遠方",
"headPath": "/fileupload/memberImage/83788978A0614007BF7F5D20F668088A1468667650848.jpg",
"messageType": 0,
"readFlag": 0,
"sendTime": 1469072805000,
"content": "有6",
"updateTime": 1469072805000
},
{
"messageNo": "Me201607191730505629442",
"memberNo": "AD2016070810124275700000002",
"mobileNo": "156****3913",
"nickname": "呵呵",
"headPath": "/fileupload/memberImage/FD5DAE12CB79447BB5263EB0EE4E75F41469069984778.jpg",
"messageType": 0,
"readFlag": 0,
"sendTime": 1468920650000,
"content": "額",
"updateTime": 1468920650000
},
{
"messageNo": "Me201607161049255579387",
"memberNo": "AD2016070812145640900000003",
"mobileNo": "151****1314",
"nickname": "遠方",
"headPath": "/fileupload/memberImage/83788978A0614007BF7F5D20F668088A1468667650848.jpg",
"messageType": 1,
"readFlag": 0,
"sendTime": 1468637365000,
"content": "111",
"updateTime": 1468637365000
},
{
"messageNo": "Me201607161037444613493",
"memberNo": "AD2016070812145640900000003",
"mobileNo": "151****1314",
"nickname": "遠方",
"headPath": "/fileupload/memberImage/83788978A0614007BF7F5D20F668088A1468667650848.jpg",
"messageType": 0,
"readFlag": 0,
"sendTime": 1468636664000,
"content": "哈哈哈",
"updateTime": 1468636664000
}
],
"otherData": null
}
}

