当前位置:   article > 正文

fastjson详解

fastjson

一、fastjson介绍

在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上可以说是标准的数据交换格式。fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。

FastJson是啊里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。

特点如下:

能够支持将java bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java bean。
顾名思义,fastjson操作 JSON的速度是非常快的。
无其他包的依赖。
使用比较方便。

二、fastjson使用

maven依赖:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <!--(起码1.2.48以上)因为这个版本一下存在漏洞-->
  5. <version>版本根据自己需要</version>
  6. </dependency>

三、fastjson常用API

fastjson API 入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

  1. public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
  2. public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
  3. public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
  4. public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
  5. public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
  6. public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
  7. public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
  8. public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。

四、示例

  1. public class User {
  2. private String username;
  3. private String password;
  4. public User() {
  5. }
  6. public User(String username, String password) {
  7. this.username = username;
  8. this.password = password;
  9. }
  10. public String getUsername() {
  11. return username;
  12. }
  13. public void setUsername(String username) {
  14. this.username = username;
  15. }
  16. public String getPassword() {
  17. return password;
  18. }
  19. public void setPassword(String password) {
  20. this.password = password;
  21. }
  22. @Override
  23. public String toString() {
  24. return "User{" +
  25. "username='" + username + '\'' +
  26. ", password='" + password + '\'' +
  27. '}';
  28. }
  29. }
  1. public class UserGroup {
  2. private String name;
  3. private List<User> users = new ArrayList<User>();
  4. public UserGroup() {
  5. }
  6. public UserGroup(String name, List<User> users) {
  7. this.name = name;
  8. this.users = users;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public List<User> getUsers() {
  17. return users;
  18. }
  19. public void setUsers(List<User> users) {
  20. this.users = users;
  21. }
  22. @Override
  23. public String toString() {
  24. return "UserGroup{" +
  25. "name='" + name + '\'' +
  26. ", users=" + users +
  27. '}';
  28. }
  29. }
  1. java类转换为json字符串:
  1. /**
  2. * java对象转换为json字符串
  3. */
  4. @Test
  5. public void objToJson() {
  6. //简单对象转换
  7. User user = new User("root", "123456");
  8. //调用toJSONString()
  9. String userJson = JSON.toJSONString(user);
  10. System.ou`````````````````t.println("java类转换为json串:" + userJson);
  11. //集合转json串
  12. User user1 = new User("zhangsan", "123456");
  13. User user2 = new User("lisi", "000");
  14. List<User> users = new ArrayList<User>();
  15. users.add(user1);
  16. users.add(user2);
  17. //调用toJSONString()
  18. String usersjson = JSON.toJSONString(users);
  19. System.out.println("集合转json串:" + usersjson);
  20. //复杂java类转换对象
  21. UserGroup userGroup = new UserGroup("userGroup", users);
  22. //调用toJSONString()
  23. String userGroupJson = JSON.toJSONString(userGroup);
  24. System.out.println("复杂java类转换json串:" + userGroupJson);
  25. }
  1. java类转换为json串:{"password":"123456","username":"root"}
  2. 集合转json串:[{"password":"123456","username":"zhangsan"},{"password":"000","username":"lisi"}]
  3. 复杂java类转换json串:{"name":"userGroup","users":[{"password":"123456","username":"zhangsan"},{"password":"000","username":"lisi"}]}
  1. json字符串转为java类:
  1. /**
  2. * json字符串转为java类
  3. * 注:字符串中使用双引号需要转义 (" --> \"),这里使用的是单引号,易读性会好很多。
  4. * json串以“{}”包裹,转换为java类时,使用:parseObject();
  5. * json串以“[]”包裹,转换为java类时,使用:parseArray();
  6. */
  7. @Test
  8. public void jsonToObj(){
  9. /* json字符串转简单java对象
  10. * 字符串:{"password":"123456","username":"dmego"}
  11. */
  12. String jsonStr1 = "{'password':'123456','username':'ggf'}";
  13. // 调用parseObject()
  14. User user = JSON.parseObject(jsonStr1, User.class);
  15. System.out.println("json字符串转简单java对象:"+user.toString());
  16. /*
  17. * json字符串转List<Object>对象
  18. * 字符串:[{"password":"123123","username":"zhangsan"},
  19. * {"password":"321321","username":"lisi"}]
  20. */
  21. String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
  22. // 调用parseArray()将字符串转为集合
  23. List<User> users = JSON.parseArray(jsonStr2, User.class);
  24. System.out.println("json字符串转List<Object>对象:"+users.toString());
  25. /*json字符串转复杂java对象
  26. * 字符串:{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]}
  27. * */
  28. String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
  29. UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class);
  30. System.out.println("json字符串转复杂java对象:"+userGroup);
  31. }
  1. json字符串转简单java对象:User{username='ggf', password='123456'}
  2. json字符串转List<Object>对象:[User{username='zhangsan', password='123123'}, User{username='lisi', password='321321'}]
  3. json字符串转复杂java对象:UserGroup{name='userGroup', users=[User{username='zhangsan', password='123123'}, User{username='lisi', password='321321'}]}

五、实际应用

  1. 对复杂的json串转为java类:
    首先有这么一个json字符串,这是一个羊肉汤的菜谱,数据来源于《聚合数据》
  1. {
  2. "resultcode":"200",
  3. "reason":"Success",
  4. "result":{
  5. "data":[
  6. {
  7. "id":"6269",
  8. "title":"羊肉汤",
  9. "tags":"增强抵抗力;煮;家常菜;汤;鲁菜",
  10. "imtro":"邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝“伏羊汤”,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;“二哥,晚上咱们喝羊汤去”。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩汤浓”是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字“香”!",
  11. "ingredients":"山羊肉,500g;羊骨,1000g",
  12. "burden":"生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量",
  13. "albums":[
  14. "http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/t\/7\/6269_379835.jpg"
  15. ],
  16. "steps":[
  17. {
  18. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_95d65e77b58a1b6b.jpg",
  19. "step":"1.羊脊骨洗净用刀斩成段。"
  20. },
  21. {
  22. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a8136c10401a1643.jpg",
  23. "step":"2.煮锅里倒入清水,放入羊脊骨,羊肉煮开后捞出。"
  24. },
  25. {
  26. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7b1c9fc85ddc6de.jpg",
  27. "step":"3.煮锅里倒入开水,放入羊脊骨生姜块大火煮开后改小火。"
  28. },
  29. {
  30. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_2b284dc30b4f0875.jpg",
  31. "step":"4.小火煮40分钟,煮至汤色发白。"
  32. },
  33. {
  34. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7ade6439eb2db5a.jpg",
  35. "step":"5.放入羊肉,加入适量的羊板油小火煮30分钟。"
  36. },
  37. {
  38. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_579748e3b0f15963.jpg",
  39. "step":"6.捞出煮好的羊肉,晾凉后切薄片。"
  40. },
  41. {
  42. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_1550e6f127aa1077.jpg",
  43. "step":"7.碗里放入葱花,调入精盐。"
  44. },
  45. {
  46. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a2c965d77b96da70.jpg",
  47. "step":"8.放入羊肉片,把滚开的羊汤倒入碗里洒上香菜末。"
  48. },
  49. {
  50. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_eea9b807d1dc5995.jpg",
  51. "step":"9.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"
  52. }
  53. ]
  54. }
  55. ],
  56. "totalNum":"9",
  57. "pn":0,
  58. "rn":"1"
  59. },
  60. "error_code":0
  61. }

要想解析这种复杂的字符串,把它转换成java类的话,首先得先定义好与之相符的java POJO 对象,从上面的json字符串组成来看,我们可以拆分出来四个bean:

最外层的响应:ResponseData

返回结果:ResultBean

数据:DataBean

做菜步骤:StepsBean

将拿到的json字符串数据,用GsonFormat工具来生成java类。

  1. public class ResponseData {
  2. /**
  3. * resultcode : 200
  4. * reason : Success
  5. * result : {"data":[{"id":"6269","title":"羊肉汤","tags":"增强抵抗力;煮;家常菜;汤;鲁菜","imtro":"邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝\u201c伏羊汤\u201d,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;\u201c二哥,晚上咱们喝羊汤去\u201d。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,\u201c肉嫩汤浓\u201d是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字\u201c香\u201d!","ingredients":"山羊肉,500g;羊骨,1000g","burden":"生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量","albums":[mg":"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分钟,煮至汤色发白。"},{"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.碗里放入葱花,调入精盐。"},{"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.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"}]}],"totalNum":"9","pn":0,"rn":"1"}
  6. * error_code : 0
  7. */
  1. private String resultcode;
  2. private String reason;
  3. private ResultBean result;
  4. private int error_code;
  5. public String getResultcode() {
  6. return resultcode;
  7. }
  8. public void setResultcode(String resultcode) {
  9. this.resultcode = resultcode;
  10. }
  11. public String getReason() {
  12. return reason;
  13. }
  14. public void setReason(String reason) {
  15. this.reason = reason;
  16. }
  17. public ResultBean getResult() {
  18. return result;
  19. }
  20. public void setResult(ResultBean result) {
  21. this.result = result;
  22. }
  23. public int getError_code() {
  24. return error_code;
  25. }
  26. public void setError_code(int error_code) {
  27. this.error_code = error_code;
  28. }
  29. public static class ResultBean {
  30. /**
  31. * data : [{"id":"6269","title":"羊肉汤","tags":"增强抵抗力;煮;家常菜;汤;鲁菜","imtro":"邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝\u201c伏羊汤\u201d,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;\u201c二哥,晚上咱们喝羊汤去\u201d。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,\u201c肉嫩汤浓\u201d是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字\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分钟,煮至汤色发白。"},{"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.碗里放入葱花,调入精盐。"},{"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.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"}]}]
  32. * totalNum : 9
  33. * pn : 0
  34. * rn : 1
  35. q*/
  36. private String totalNum;
  37. private int pn;
  38. private String rn;
  39. private List<DataBean> data;
  40. public String getTotalNum() {
  41. return totalNum;
  42. }
  43. public void setTotalNum(String totalNum) {
  44. this.totalNum = totalNum;
  45. }
  46. public int getPn() {
  47. return pn;
  48. }
  49. public void setPn(int pn) {
  50. this.pn = pn;
  51. }
  52. public String getRn() {
  53. return rn;
  54. }
  55. public void setRn(String rn) {
  56. this.rn = rn;
  57. }
  58. public List<DataBean> getData() {
  59. return data;
  60. }
  61. public void setData(List<DataBean> data) {
  62. this.data = data;
  63. }
  1. public static class DataBean {
  2. /**
  3. * id : 6269
  4. * title : 羊肉汤
  5. * tags : 增强抵抗力;煮;家常菜;汤;鲁菜
  6. * imtro : 邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝“伏羊汤”,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;“二哥,晚上咱们喝羊汤去”。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩汤浓”是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字“香”!
  7. * ingredients : 山羊肉,500g;羊骨,1000g
  8. * burden : 生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量
  9. * albums : ["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"]
  10. * 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分钟,煮至汤色发白。"},{"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.碗里放入葱花,调入精盐。"},{"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.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"}]
  11. */
  12. private String id;
  13. private String title;
  14. private String tags;
  15. private String imtro;
  16. private String ingredients;
  17. private String burden;
  18. private List<String> albums;
  19. private List<StepsBean> steps;
  20. public String getId() {
  21. return id;
  22. }
  23. public void setId(String id) {
  24. this.id = id;
  25. }
  26. public String getTitle() {
  27. return title;
  28. }
  29. public void setTitle(String title) {
  30. this.title = title;
  31. }
  32. public String getTags() {
  33. return tags;
  34. }
  35. public void setTags(String tags) {
  36. this.tags = tags;
  37. }
  38. public String getImtro() {
  39. return imtro;
  40. }
  41. public void setImtro(String imtro) {
  42. this.imtro = imtro;
  43. }
  44. public String getIngredients() {
  45. return ingredients;
  46. }
  47. public void setIngredients(String ingredients) {
  48. this.ingredients = ingredients;
  49. }
  50. public String getBurden() {
  51. return burden;
  52. }
  53. public void setBurden(String burden) {
  54. this.burden = burden;
  55. }
  56. public List<String> getAlbums() {
  57. return albums;
  58. }
  59. public void setAlbums(List<String> albums) {
  60. this.albums = albums;
  61. }
  62. public List<StepsBean> getSteps() {
  63. return steps;
  64. }
  65. public void setSteps(List<StepsBean> steps) {
  66. this.steps = steps;
  67. }
  68. public static class StepsBean {
  69. /**
  70. * img : http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg
  71. * step : 1.羊脊骨洗净用刀斩成段。
  72. */
  73. private String img;
  74. private String step;
  75. public String getImg() {
  76. return img;
  77. }
  78. public void setImg(String img) {
  79. this.img = img;
  80. }
  81. public String getStep() {
  82. return step;
  83. }
  84. public void setStep(String step) {
  85. this.step = step;
  86. }
  87. }
  88. }
  89. }
  90. }

对应的实体类创建后,接下来就可以使用fastjson中的方法将json串转换成对象使用了

  1. /**
  2. * 将复杂的json串转换为java类
  3. */
  4. @Test
  5. public void jsonToComplexObj() {
  6. // 读取类路径下的caipu.json文件,这里使用了第三方工具hutool进行读取json文件
  7. // 工具类参见:https://hutool.cn/docs/#/
  8. String jsonStr = FileUtil.readUtf8String(new File("caipu.json"));
  9. System.out.println(jsonStr);
  10. // 转换为java类
  11. ResponseData resp = JSON.parseObject(jsonStr, ResponseData.class);
  12. System.out.println(resp);
  13. // 通过对象操作数据
  14. // 获取响应码resultcode
  15. System.out.println(resp.getResultcode());
  16. // 获取响应数据
  17. ResponseData.ResultBean result = resp.getResult();
  18. System.out.println("result响应数据:" + result);
  19. }

输出结果:

  1. {
  2. "resultcode":"200",
  3. "reason":"Success",
  4. "result":{
  5. "data":[
  6. {
  7. "id":"6269",
  8. "title":"羊肉汤",
  9. "tags":"增强抵抗力;煮;家常菜;汤;鲁菜",
  10. "imtro":"邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝“伏羊汤”,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;“二哥,晚上咱们喝羊汤去”。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩汤浓”是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字“香”!",
  11. "ingredients":"山羊肉,500g;羊骨,1000g",
  12. "burden":"生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量",
  13. "albums":[
  14. "http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/t\/7\/6269_379835.jpg"
  15. ],
  16. "steps":[
  17. {
  18. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_95d65e77b58a1b6b.jpg",
  19. "step":"1.羊脊骨洗净用刀斩成段。"
  20. },
  21. {
  22. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a8136c10401a1643.jpg",
  23. "step":"2.煮锅里倒入清水,放入羊脊骨,羊肉煮开后捞出。"
  24. },
  25. {
  26. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7b1c9fc85ddc6de.jpg",
  27. "step":"3.煮锅里倒入开水,放入羊脊骨生姜块大火煮开后改小火。"
  28. },
  29. {
  30. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_2b284dc30b4f0875.jpg",
  31. "step":"4.小火煮40分钟,煮至汤色发白。"
  32. },
  33. {
  34. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_c7ade6439eb2db5a.jpg",
  35. "step":"5.放入羊肉,加入适量的羊板油小火煮30分钟。"
  36. },
  37. {
  38. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_579748e3b0f15963.jpg",
  39. "step":"6.捞出煮好的羊肉,晾凉后切薄片。"
  40. },
  41. {
  42. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_1550e6f127aa1077.jpg",
  43. "step":"7.碗里放入葱花,调入精盐。"
  44. },
  45. {
  46. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_a2c965d77b96da70.jpg",
  47. "step":"8.放入羊肉片,把滚开的羊汤倒入碗里洒上香菜末。"
  48. },
  49. {
  50. "img":"http:\/\/juheimg.oss-cn-hangzhou.aliyuncs.com\/cookbook\/s\/63\/6269_eea9b807d1dc5995.jpg",
  51. "step":"9.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"
  52. }
  53. ]
  54. }
  55. ],
  56. "totalNum":"9",
  57. "pn":0,
  58. "rn":"1"
  59. },
  60. "error_code":0
  61. }
  62. fastjson.ResponseData@445b84c0
  63. 200
  64. result响应数据:fastjson.ResponseData$ResultBean@61a52fbd
  1. 对json串的操作:
    在实际开发中,我们经常要对接口返回的json数据,进行操作,获取里面的某些数据。还是以上面的json字符串为例,使用fastjson,对json字符串进行操作
  1. /**
  2. * 对json串的操作
  3. */
  4. @Test
  5. public void operateJson() {
  6. // 读取本地json文本
  7. String jsonStr = FileUtil.readUtf8String(new File("caipu.json"));
  8. // 创建json对象
  9. JSONObject jsonObj = JSONObject.parseObject(jsonStr);
  10. // 操作json内容
  11. // 获取响应码resultcode
  12. System.out.println(jsonObj.get("resultcode"));
  13. // 获取响应信息reason
  14. System.out.println(jsonObj.getString("reason"));
  15. // 获取data
  16. JSONObject resJsonObj = (JSONObject)jsonObj.get("result");
  17. System.out.println(resJsonObj.getString("data"));
  18. }

输出结果:

  1. 200
  2. Success
  3. [{"albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],"imtro":"邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝“伏羊汤”,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;“二哥,晚上咱们喝羊汤去”。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩汤浓”是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字“香”!","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分钟,煮至汤色发白。"},{"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.碗里放入葱花,调入精盐。"},{"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.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。"}],"tags":"增强抵抗力;煮;家常菜;汤;鲁菜","burden":"生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量"}]

六、fastjson楼栋问题

真实项目中使用建设使用版本大于:1.2.45

注意
序列化的类必须有一个无参构造方法

被序列化的类需要有一个无参的构造方法。否则会报错

  1. Exception in thread "main" com.alibaba.fastjson.JSONException: default constructor not found. class User

如果你没有重写构造方法,那么每个类都自带一个无参的构造方法,但是如果你重写了一个有参的构造方法,那么默认的无参构造方法会被覆盖,这时候就需要你手动写一个无参的构造方法进去。所以我建议保险起见,需要被json序列化的类最好都手动写一个无参的构造方法进去。

在低版本中转换的时候会直接抛以上异常信息(测试版本:fastjson-1.1.12)。但是高版本(fastjson-1.2.58)就不会报错。
建议在定义javabean时都把无参和有参定义。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/882745
推荐阅读
相关标签
  

闽ICP备14008679号