一文弄懂fastjson
一、fastjson介紹
?在前后端數(shù)據(jù)傳輸交互中,經(jīng)常會(huì)遇到字符串(String)與json,XML等格式相互轉(zhuǎn)換與解析,其中json以跨語(yǔ)言,跨前后端的優(yōu)點(diǎn)在開發(fā)中被頻繁使用,基本上可以說(shuō)是標(biāo)準(zhǔn)的數(shù)據(jù)交換格式。fastjson 是一個(gè)java語(yǔ)言編寫的高性能且功能完善的JSON庫(kù),它采用一種“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了極致。它的接口簡(jiǎn)單易用,已經(jīng)被廣泛使用在緩存序列化,協(xié)議交互,Web輸出等各種應(yīng)用場(chǎng)景中。
FastJson是啊里巴巴的的開源庫(kù),用于對(duì)JSON格式的數(shù)據(jù)進(jìn)行解析和打包。
特點(diǎn)如下:
- 能夠支持將java bean序列化成JSON字符串,也能夠?qū)SON字符串反序列化成Java bean。
- 顧名思義,fastjson操作 JSON的速度是非??斓?。
- 無(wú)其他包的依賴。
- 使用比較方便。
二、fastjson使用
maven依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <!--(起碼1.2.48以上)因?yàn)檫@個(gè)版本一下存在漏洞--> <version>版本根據(jù)自己需要</version> </dependency>
三、fastjson常用API
fastjson API 入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態(tài)方法直接完成。
public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject? public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean? public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray? public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合? public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文本? public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本? public static final Object toJSON(Object javaObject); //將JavaBean轉(zhuǎn)換為JSONObject或者JSONArray。
四、示例
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 + '\'' + ? ? ? ? ? ? ? ? '}'; ? ? } }
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 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 + '}'; } }
1. java類轉(zhuǎn)換為json字符串:
?? ?/** ? ? ?* java對(duì)象轉(zhuǎn)換為json字符串 ? ? ?*/ ? ? @Test ? ? public void objToJson() { ? ? ? ? //簡(jiǎn)單對(duì)象轉(zhuǎn)換 ? ? ? ? User user = new User("root", "123456"); ? ? ? ? //調(diào)用toJSONString() ? ? ? ? String userJson = JSON.toJSONString(user); ? ? ? ? System.out.println("java類轉(zhuǎn)換為json串:" + userJson); ? ? ? ? //集合轉(zhuǎn)json串 ? ? ? ? User user1 = new User("zhangsan", "123456"); ? ? ? ? User user2 = new User("lisi", "000"); ? ? ? ? List<User> users = new ArrayList<User>(); ? ? ? ? users.add(user1); ? ? ? ? users.add(user2); ? ? ? ? //調(diào)用toJSONString() ? ? ? ? String usersjson = JSON.toJSONString(users); ? ? ? ? System.out.println("集合轉(zhuǎn)json串:" + usersjson); ? ? ? ? //復(fù)雜java類轉(zhuǎn)換對(duì)象 ? ? ? ? UserGroup userGroup = new UserGroup("userGroup", users); ? ? ? ? //調(diào)用toJSONString() ? ? ? ? String userGroupJson = JSON.toJSONString(userGroup); ? ? ? ? System.out.println("復(fù)雜java類轉(zhuǎn)換json串:" + userGroupJson); ? ? }
java類轉(zhuǎn)換為json串:{"password":"123456","username":"root"}
集合轉(zhuǎn)json串:[{"password":"123456","username":"zhangsan"},{"password":"000","username":"lisi"}]
復(fù)雜java類轉(zhuǎn)換json串:{"name":"userGroup","users":[{"password":"123456","username":"zhangsan"},{"password":"000","username":"lisi"}]}
2. json字符串轉(zhuǎn)為java類:
/** ? ? ?* json字符串轉(zhuǎn)為java類 ? ? ?* 注:字符串中使用雙引號(hào)需要轉(zhuǎn)義 (" --> \"),這里使用的是單引號(hào),易讀性會(huì)好很多。 ? ? ?* json串以“{}”包裹,轉(zhuǎn)換為java類時(shí),使用:parseObject(); ? ? ?* json串以“[]”包裹,轉(zhuǎn)換為java類時(shí),使用:parseArray(); ? ? ?*/ ? ? @Test ? ? public void jsonToObj(){ ? ? ? ? /* json字符串轉(zhuǎn)簡(jiǎn)單java對(duì)象 ? ? ? ? ?* 字符串:{"password":"123456","username":"dmego"} ? ? ? ? ?*/ ? ? ? ? String jsonStr1 = "{'password':'123456','username':'ggf'}"; ? ? ? ? // 調(diào)用parseObject() ? ? ? ? User user = JSON.parseObject(jsonStr1, User.class); ? ? ? ? System.out.println("json字符串轉(zhuǎn)簡(jiǎn)單java對(duì)象:"+user.toString()); ? ? ? ? /* ? ? ? ? ?* json字符串轉(zhuǎn)List<Object>對(duì)象 ? ? ? ? ?* 字符串:[{"password":"123123","username":"zhangsan"}, ? ? ? ? ?* ? ? ? ?{"password":"321321","username":"lisi"}] ? ? ? ? ?*/ ? ? ? ? String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]"; ? ? ? ? // 調(diào)用parseArray()將字符串轉(zhuǎn)為集合 ? ? ? ? List<User> users = JSON.parseArray(jsonStr2, User.class); ? ? ? ? System.out.println("json字符串轉(zhuǎn)List<Object>對(duì)象:"+users.toString()); ? ? ? ? /*json字符串轉(zhuǎn)復(fù)雜java對(duì)象 ? ? ? ? ?* 字符串:{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]} ? ? ? ? ?* */ ? ? ? ? String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}"; ? ? ? ? UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class); ? ? ? ? System.out.println("json字符串轉(zhuǎn)復(fù)雜java對(duì)象:"+userGroup); ? ? }
json字符串轉(zhuǎn)簡(jiǎn)單java對(duì)象:User{username='ggf', password='123456'}
json字符串轉(zhuǎn)List<Object>對(duì)象:[User{username='zhangsan', password='123123'}, User{username='lisi', password='321321'}]
json字符串轉(zhuǎn)復(fù)雜java對(duì)象:UserGroup{name='userGroup', users=[User{username='zhangsan', password='123123'}, User{username='lisi', password='321321'}]}
五、實(shí)際應(yīng)用
1. 對(duì)復(fù)雜的json串轉(zhuǎn)為java類:
首先有這么一個(gè)json字符串,這是一個(gè)羊肉湯的菜譜,數(shù)據(jù)來(lái)源于《聚合數(shù)據(jù)》
{ "resultcode":"200", "reason":"Success", "result":{ "data":[ { "id":"6269", "title":"羊肉湯", "tags":"增強(qiáng)抵抗力;煮;家常菜;湯;魯菜", "imtro":"鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝“伏羊湯”,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;“二哥,晚上咱們喝羊湯去”。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩湯濃”是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字“香”!", "ingredients":"山羊肉,500g;羊骨,1000g", "burden":"生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量", "albums":[ "http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/t\/7\/6269_379835.jpg" ], "steps":[ { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_95d65e77b58a1b6b.jpg", "step":"1.羊脊骨洗凈用刀斬成段。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a8136c10401a1643.jpg", "step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7b1c9fc85ddc6de.jpg", "step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_2b284dc30b4f0875.jpg", "step":"4.小火煮40分鐘,煮至湯色發(fā)白。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7ade6439eb2db5a.jpg", "step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_579748e3b0f15963.jpg", "step":"6.撈出煮好的羊肉,晾涼后切薄片。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_1550e6f127aa1077.jpg", "step":"7.碗里放入蔥花,調(diào)入精鹽。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a2c965d77b96da70.jpg", "step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。" }, { "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_eea9b807d1dc5995.jpg", "step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。" } ] } ], "totalNum":"9", "pn":0, "rn":"1" }, "error_code":0 }
要想解析這種復(fù)雜的字符串,把它轉(zhuǎn)換成java類的話,首先得先定義好與之相符的java POJO 對(duì)象,從上面的json字符串組成來(lái)看,我們可以拆分出來(lái)四個(gè)bean:
最外層的響應(yīng):ResponseData
返回結(jié)果:ResultBean
數(shù)據(jù):DataBean
做菜步驟:StepsBean
將拿到的json字符串?dāng)?shù)據(jù),用GsonFormat工具來(lái)生成java類。
GsonFormat工具的使用可參考該文章:http://www.dbjr.com.cn/article/283835.htm
public class ResponseData { ? ? /** ? ? ?* resultcode : 200 ? ? ?* reason : Success ? ? ?* result : {"data":[{"id":"6269","title":"羊肉湯","tags":"增強(qiáng)抵抗力;煮;家常菜;湯;魯菜","imtro":"鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝\u201c伏羊湯\u201d,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;\u201c二哥,晚上咱們喝羊湯去\u201d。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,\u201c肉嫩湯濃\u201d是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字\u201c香\u201d!","ingredients":"山羊肉,500g;羊骨,1000g","burden":"生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量","albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],"steps":[{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg","step":"1.羊脊骨洗凈用刀斬成段。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg","step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg","step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg","step":"4.小火煮40分鐘,煮至湯色發(fā)白。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg","step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg","step":"6.撈出煮好的羊肉,晾涼后切薄片。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg","step":"7.碗里放入蔥花,調(diào)入精鹽。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg","step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg","step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。"}]}],"totalNum":"9","pn":0,"rn":"1"} ? ? ?* error_code : 0 ? ? ?*/ ? ? private String resultcode; ? ? private String reason; ? ? private ResultBean result; ? ? private int error_code; ? ? public String getResultcode() { ? ? ? ? return resultcode; ? ? } ? ? public void setResultcode(String resultcode) { ? ? ? ? this.resultcode = resultcode; ? ? } ? ? public String getReason() { ? ? ? ? return reason; ? ? } ? ? public void setReason(String reason) { ? ? ? ? this.reason = reason; ? ? } ? ? public ResultBean getResult() { ? ? ? ? return result; ? ? } ? ? public void setResult(ResultBean result) { ? ? ? ? this.result = result; ? ? } ? ? public int getError_code() { ? ? ? ? return error_code; ? ? } ? ? public void setError_code(int error_code) { ? ? ? ? this.error_code = error_code; ? ? } ? ? public static class ResultBean { ? ? ? ? /** ? ? ? ? ?* data : [{"id":"6269","title":"羊肉湯","tags":"增強(qiáng)抵抗力;煮;家常菜;湯;魯菜","imtro":"鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝\u201c伏羊湯\u201d,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;\u201c二哥,晚上咱們喝羊湯去\u201d。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,\u201c肉嫩湯濃\u201d是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字\u201c香\u201d!","ingredients":"山羊肉,500g;羊骨,1000g","burden":"生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量","albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],"steps":[{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg","step":"1.羊脊骨洗凈用刀斬成段。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg","step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg","step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg","step":"4.小火煮40分鐘,煮至湯色發(fā)白。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg","step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg","step":"6.撈出煮好的羊肉,晾涼后切薄片。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg","step":"7.碗里放入蔥花,調(diào)入精鹽。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg","step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg","step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。"}]}] ? ? ? ? ?* totalNum : 9 ? ? ? ? ?* pn : 0 ? ? ? ? ?* rn : 1 ? ? ? ? ?*/ ? ? ? ? private String totalNum; ? ? ? ? private int pn; ? ? ? ? private String rn; ? ? ? ? private List<DataBean> data; ? ? ? ? public String getTotalNum() { ? ? ? ? ? ? return totalNum; ? ? ? ? } ? ? ? ? public void setTotalNum(String totalNum) { ? ? ? ? ? ? this.totalNum = totalNum; ? ? ? ? } ? ? ? ? public int getPn() { ? ? ? ? ? ? return pn; ? ? ? ? } ? ? ? ? public void setPn(int pn) { ? ? ? ? ? ? this.pn = pn; ? ? ? ? } ? ? ? ? public String getRn() { ? ? ? ? ? ? return rn; ? ? ? ? } ? ? ? ? public void setRn(String rn) { ? ? ? ? ? ? this.rn = rn; ? ? ? ? } ? ? ? ? public List<DataBean> getData() { ? ? ? ? ? ? return data; ? ? ? ? } ? ? ? ? public void setData(List<DataBean> data) { ? ? ? ? ? ? this.data = data; ? ? ? ? } ? ? ? ? public static class DataBean { ? ? ? ? ? ? /** ? ? ? ? ? ? ?* id : 6269 ? ? ? ? ? ? ?* title : 羊肉湯 ? ? ? ? ? ? ?* tags : 增強(qiáng)抵抗力;煮;家常菜;湯;魯菜 ? ? ? ? ? ? ?* imtro : 鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝“伏羊湯”,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;“二哥,晚上咱們喝羊湯去”。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩湯濃”是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字“香”! ? ? ? ? ? ? ?* ingredients : 山羊肉,500g;羊骨,1000g ? ? ? ? ? ? ?* burden : 生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量 ? ? ? ? ? ? ?* albums : ["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"] ? ? ? ? ? ? ?* steps : [{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg","step":"1.羊脊骨洗凈用刀斬成段。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg","step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg","step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg","step":"4.小火煮40分鐘,煮至湯色發(fā)白。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg","step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg","step":"6.撈出煮好的羊肉,晾涼后切薄片。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg","step":"7.碗里放入蔥花,調(diào)入精鹽。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg","step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg","step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。"}] ? ? ? ? ? ? ?*/ ? ? ? ? ? ? private String id; ? ? ? ? ? ? private String title; ? ? ? ? ? ? private String tags; ? ? ? ? ? ? private String imtro; ? ? ? ? ? ? private String ingredients; ? ? ? ? ? ? private String burden; ? ? ? ? ? ? private List<String> albums; ? ? ? ? ? ? private List<StepsBean> steps; ? ? ? ? ? ? public String getId() { ? ? ? ? ? ? ? ? return id; ? ? ? ? ? ? } ? ? ? ? ? ? public void setId(String id) { ? ? ? ? ? ? ? ? this.id = id; ? ? ? ? ? ? } ? ? ? ? ? ? public String getTitle() { ? ? ? ? ? ? ? ? return title; ? ? ? ? ? ? } ? ? ? ? ? ? public void setTitle(String title) { ? ? ? ? ? ? ? ? this.title = title; ? ? ? ? ? ? } ? ? ? ? ? ? public String getTags() { ? ? ? ? ? ? ? ? return tags; ? ? ? ? ? ? } ? ? ? ? ? ? public void setTags(String tags) { ? ? ? ? ? ? ? ? this.tags = tags; ? ? ? ? ? ? } ? ? ? ? ? ? public String getImtro() { ? ? ? ? ? ? ? ? return imtro; ? ? ? ? ? ? } ? ? ? ? ? ? public void setImtro(String imtro) { ? ? ? ? ? ? ? ? this.imtro = imtro; ? ? ? ? ? ? } ? ? ? ? ? ? public String getIngredients() { ? ? ? ? ? ? ? ? return ingredients; ? ? ? ? ? ? } ? ? ? ? ? ? public void setIngredients(String ingredients) { ? ? ? ? ? ? ? ? this.ingredients = ingredients; ? ? ? ? ? ? } ? ? ? ? ? ? public String getBurden() { ? ? ? ? ? ? ? ? return burden; ? ? ? ? ? ? } ? ? ? ? ? ? public void setBurden(String burden) { ? ? ? ? ? ? ? ? this.burden = burden; ? ? ? ? ? ? } ? ? ? ? ? ? public List<String> getAlbums() { ? ? ? ? ? ? ? ? return albums; ? ? ? ? ? ? } ? ? ? ? ? ? public void setAlbums(List<String> albums) { ? ? ? ? ? ? ? ? this.albums = albums; ? ? ? ? ? ? } ? ? ? ? ? ? public List<StepsBean> getSteps() { ? ? ? ? ? ? ? ? return steps; ? ? ? ? ? ? } ? ? ? ? ? ? public void setSteps(List<StepsBean> steps) { ? ? ? ? ? ? ? ? this.steps = steps; ? ? ? ? ? ? } ? ? ? ? ? ? public static class StepsBean { ? ? ? ? ? ? ? ? /** ? ? ? ? ? ? ? ? ?* img : http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg ? ? ? ? ? ? ? ? ?* step : 1.羊脊骨洗凈用刀斬成段。 ? ? ? ? ? ? ? ? ?*/ ? ? ? ? ? ? ? ? private String img; ? ? ? ? ? ? ? ? private String step; ? ? ? ? ? ? ? ? public String getImg() { ? ? ? ? ? ? ? ? ? ? return img; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? public void setImg(String img) { ? ? ? ? ? ? ? ? ? ? this.img = img; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? public String getStep() { ? ? ? ? ? ? ? ? ? ? return step; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? public void setStep(String step) { ? ? ? ? ? ? ? ? ? ? this.step = step; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } } 對(duì)應(yīng)的實(shí)體類創(chuàng)建后,接下來(lái)就可以使用fastjson中的方法將json串轉(zhuǎn)換成對(duì)象使用了 ?? ?/** ? ? ?* 將復(fù)雜的json串轉(zhuǎn)換為java類 ? ? ?*/ ? ? @Test ? ? public void jsonToComplexObj() { ? ? ? ? // 讀取類路徑下的caipu.json文件,這里使用了第三方工具h(yuǎn)utool進(jìn)行讀取json文件 ? ? ? ? // 工具類參見(jiàn):https://hutool.cn/docs/#/ ? ? ? ? String jsonStr = FileUtil.readUtf8String(new File("caipu.json")); ? ? ? ? System.out.println(jsonStr); ? ? ? ? // 轉(zhuǎn)換為java類 ? ? ? ? ResponseData resp = JSON.parseObject(jsonStr, ResponseData.class); ? ? ? ? System.out.println(resp); ? ? ? ? // 通過(guò)對(duì)象操作數(shù)據(jù) ? ? ? ? // 獲取響應(yīng)碼resultcode ? ? ? ? System.out.println(resp.getResultcode()); ? ? ? ? // 獲取響應(yīng)數(shù)據(jù) ? ? ? ? ResponseData.ResultBean result = resp.getResult(); ? ? ? ? System.out.println("result響應(yīng)數(shù)據(jù):" + result); ? ? }
輸出結(jié)果:
{
"resultcode":"200",
"reason":"Success",
"result":{
"data":[
{
"id":"6269",
"title":"羊肉湯",
"tags":"增強(qiáng)抵抗力;煮;家常菜;湯;魯菜",
"imtro":"鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝“伏羊湯”,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;“二哥,晚上咱們喝羊湯去”。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩湯濃”是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字“香”!",
"ingredients":"山羊肉,500g;羊骨,1000g",
"burden":"生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量",
"albums":[
"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/t\/7\/6269_379835.jpg"
],
"steps":[
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_95d65e77b58a1b6b.jpg",
"step":"1.羊脊骨洗凈用刀斬成段。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a8136c10401a1643.jpg",
"step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7b1c9fc85ddc6de.jpg",
"step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_2b284dc30b4f0875.jpg",
"step":"4.小火煮40分鐘,煮至湯色發(fā)白。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7ade6439eb2db5a.jpg",
"step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_579748e3b0f15963.jpg",
"step":"6.撈出煮好的羊肉,晾涼后切薄片。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_1550e6f127aa1077.jpg",
"step":"7.碗里放入蔥花,調(diào)入精鹽。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a2c965d77b96da70.jpg",
"step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。"
},
{
"img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_eea9b807d1dc5995.jpg",
"step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。"
}
]
}
],
"totalNum":"9",
"pn":0,
"rn":"1"
},
"error_code":0
}fastjson.ResponseData@445b84c0
200
result響應(yīng)數(shù)據(jù):fastjson.ResponseData$ResultBean@61a52fbd
2. 對(duì)json串的操作:
在實(shí)際開發(fā)中,我們經(jīng)常要對(duì)接口返回的json數(shù)據(jù),進(jìn)行操作,獲取里面的某些數(shù)據(jù)。還是以上面的json字符串為例,使用fastjson,對(duì)json字符串進(jìn)行操作
/** ? ? ?* 對(duì)json串的操作 ? ? ?*/ ? ? @Test ? ? public void operateJson() { ? ? ? ? // 讀取本地json文本 ? ? ? ? String jsonStr = FileUtil.readUtf8String(new File("caipu.json")); ? ? ? ? // 創(chuàng)建json對(duì)象 ? ? ? ? JSONObject jsonObj = JSONObject.parseObject(jsonStr); ? ? ? ? // 操作json內(nèi)容 ? ? ? ? // 獲取響應(yīng)碼resultcode ? ? ? ? System.out.println(jsonObj.get("resultcode")); ? ? ? ? // 獲取響應(yīng)信息reason ? ? ? ? System.out.println(jsonObj.getString("reason")); ? ? ? ? // 獲取data ? ? ? ? JSONObject resJsonObj = (JSONObject)jsonObj.get("result"); ? ? ? ? System.out.println(resJsonObj.getString("data")); ? ? }
輸出結(jié)果:
200
Success
[{"albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],"imtro":"鄒城人有喝羊湯的習(xí)慣,春夏秋冬羊湯館總斷不了食客,春秋天氣候干燥要喝,夏天入伏要喝“伏羊湯”,陰冷的冬季尤其要喝碗羊湯才夠溫暖。以至于邀友喝羊湯成為了禮儀;“二哥,晚上咱們喝羊湯去”。鄒城的羊湯鋪遍地開花,以至于單縣羊湯、滕州羊湯在鄒城都沒(méi)有了用武之地。我們這里的羊湯做法是最純的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩湯濃”是其特色。 煮羊湯要先煮羊骨,把羊骨斬成大段焯水后放一點(diǎn)羊板油用細(xì)火煮,煮到湯白味濃時(shí)放入羊肉。羊肉煮到用筷子能輕松插穿時(shí)就要撈出,久煮的話羊肉過(guò)爛就失去了軟嫩的口感。 碗里放入蔥花或蒜粒,調(diào)入精鹽,放入切的薄薄的羊肉片。把燒的滾開的羊湯盛到碗里,灑上香菜,再挖上一匙子香辣的用羊油潑成的辣椒油,一個(gè)字“香”!","ingredients":"山羊肉,500g;羊骨,1000g","id":"6269","title":"羊肉湯","steps":[{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg","step":"1.羊脊骨洗凈用刀斬成段。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg","step":"2.煮鍋里倒入清水,放入羊脊骨,羊肉煮開后撈出。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg","step":"3.煮鍋里倒入開水,放入羊脊骨生姜塊大火煮開后改小火。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg","step":"4.小火煮40分鐘,煮至湯色發(fā)白。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg","step":"5.放入羊肉,加入適量的羊板油小火煮30分鐘。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg","step":"6.撈出煮好的羊肉,晾涼后切薄片。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg","step":"7.碗里放入蔥花,調(diào)入精鹽。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg","step":"8.放入羊肉片,把滾開的羊湯倒入碗里灑上香菜末。"},{"img":"http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg","step":"9.可以根據(jù)喜好調(diào)入陳醋放入蒜粒,最后調(diào)入辣椒油即可。"}],"tags":"增強(qiáng)抵抗力;煮;家常菜;湯;魯菜","burden":"生姜,適量;精鹽,適量;香菜,適量;大蔥,適量;辣椒油,適量;羊板油,適量"}]
六、fastjson樓棟問(wèn)題
可參考文章:http://www.dbjr.com.cn/article/283826.htm
真實(shí)項(xiàng)目中使用建設(shè)使用版本大于:1.2.45
注意
序列化的類必須有一個(gè)無(wú)參構(gòu)造方法
被序列化的類需要有一個(gè)無(wú)參的構(gòu)造方法。否則會(huì)報(bào)錯(cuò)
Exception in thread "main" com.alibaba.fastjson.JSONException: default constructor not found. class User
如果你沒(méi)有重寫構(gòu)造方法,那么每個(gè)類都自帶一個(gè)無(wú)參的構(gòu)造方法,但是如果你重寫了一個(gè)有參的構(gòu)造方法,那么默認(rèn)的無(wú)參構(gòu)造方法會(huì)被覆蓋,這時(shí)候就需要你手動(dòng)寫一個(gè)無(wú)參的構(gòu)造方法進(jìn)去。所以我建議保險(xiǎn)起見(jiàn),需要被json序列化的類最好都手動(dòng)寫一個(gè)無(wú)參的構(gòu)造方法進(jìn)去。
在低版本中轉(zhuǎn)換的時(shí)候會(huì)直接拋以上異常信息(測(cè)試版本:fastjson-1.1.12)。但是高版本(fastjson-1.2.58)就不會(huì)報(bào)錯(cuò)。
建議在定義javabean時(shí)都把無(wú)參和有參定義。
到此這篇關(guān)于一文弄懂fastjson的文章就介紹到這了,更多相關(guān)fastjson內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis的dtd約束文件及配置文件xml自動(dòng)提示操作
這篇文章主要介紹了mybatis的dtd約束文件及配置文件xml自動(dòng)提示操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12java String.split 無(wú)法使用小數(shù)點(diǎn)分割的問(wèn)題
這篇文章主要介紹了java String.split 無(wú)法使用小數(shù)點(diǎn)分割的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù)
這篇文章主要介紹了Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù),幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下2021-03-03使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例
這篇文章主要介紹了使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05SpringBoot實(shí)現(xiàn)設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解,SpringBoot是一個(gè)快速開發(fā)的Java框架,而動(dòng)態(tài)定時(shí)任務(wù)是指可以在運(yùn)行時(shí)動(dòng)態(tài)添加、修改和刪除定時(shí)任務(wù)的功能,需要的朋友可以參考下2023-10-10Java IO流之節(jié)點(diǎn)流與字符流的相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java節(jié)點(diǎn)流與字符流展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java Predicate及Consumer接口函數(shù)代碼實(shí)現(xiàn)解析
這篇文章主要介紹了Java Predicate及Consumer接口函數(shù)代碼實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06