一、fastjson介绍

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

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

特点如下:

(1)能够支持将java bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java bean。

(2)顾名思义,fastjson操作 JSON的速度是非常快的。

(3)无其他包的依赖。

(4)使用比较方便。

二、fastjson使用

在Maven项目中使用fastjson库,需要提前在Maven的配置文件中添加此fastjson包的依赖,如pom.xml文件。

添加下面的依赖:

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

单独练习使用的话,下载对应的jar导入项目即可.

jar下载地址:fastjson-1.2.58.jar

三、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。

四、fastjson使用演示

测试类准备

User类

  1. public class User {
  2. private String username;
  3. private String password;
  4. public User(){}
  5. public User(String username,String password){
  6. this.username = username;
  7. this.password = password;
  8. }
  9. public String getUsername() {
  10. return username;
  11. }
  12. public void setUsername(String username) {
  13. this.username = username;
  14. }
  15. public String getPassword() {
  16. return password;
  17. }
  18. public void setPassword(String password) {
  19. this.password = password;
  20. }
  21. @Override
  22. public String toString() {
  23. return "User [username=" + username + ", password=" + password + "]";
  24. }
  25. }

UserGroup类:这里类里面包含User类的集合。

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class UserGroup {
  4. private String name;
  5. private List<User> users = new ArrayList<User>();
  6. public UserGroup(){}
  7. public UserGroup(String name,List<User> users){
  8. this.name = name;
  9. this.users = users;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public List<User> getUsers() {
  18. return users;
  19. }
  20. public void setUsers(List<User> users) {
  21. this.users = users;
  22. }
  23. @Override
  24. public String toString() {
  25. return "UserGroup [name=" + name + ", users=" + users + "]";
  26. }
  27. }

1.java类转换为json字符串

  1. package javabasic.json;
  2. import com.alibaba.fastjson.JSON;
  3. import org.junit.Test;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * @Description: fastjson API使用练习
  8. * @Author: ggf
  9. * @Date: 2020/01/11
  10. */
  11. public class FastJsonTest {
  12. /**
  13. * java对象转换为json字符串
  14. */
  15. @Test
  16. public void objToJson() {
  17. // 简单对象转换
  18. User user = new User("ggf","123456");
  19. // 调用toJSONString()
  20. String userJson = JSON.toJSONString(user);
  21. System.out.println("java类转换为json串:" + userJson);
  22. // 集合(List<E>)转json串
  23. User user1 = new User("zhangsan", "123456");
  24. User user2 = new User("lisi", "654321");
  25. //创建集合存储对象
  26. List<User> users = new ArrayList<User>();
  27. users.add(user1);
  28. users.add(user2);
  29. // 调用toJSONString()转换对象
  30. String usersjson = JSON.toJSONString(users);
  31. System.out.println("集合(List<E>)转json串:" + usersjson);
  32. // 复杂java类(类中包含集合对象)转换json串
  33. UserGroup userGroup = new UserGroup("userGroup", users);
  34. // 调用toJSONString()转换对象
  35. String userGroupJson = JSON.toJSONString(userGroup);
  36. System.out.println("复杂java类(类中包含集合对象)转换json串:" + userGroupJson);
  37. }
  38. }

输出结果:

  1. java类转换为json串:{"password":"123456","username":"ggf"}
  2. 集合(List<E>)转json串:[{"password":"123456","username":"zhangsan"},{"password":"654321","username":"lisi"}]
  3. 复杂java类(类中包含集合对象)转换json串:{"name":"userGroup","users":[{"password":"123456","username":"zhangsan"},{"password":"654321","username":"lisi"}]}

2.json字符串转为java类

  1. package javabasic.json;
  2. import com.alibaba.fastjson.JSON;
  3. import org.junit.Test;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * @Description: fastjson API使用练习
  8. * @Author: ggf
  9. * @Date: 2020/01/11
  10. */
  11. public class FastJsonTest {
  12. /**
  13. * json字符串转为java类
  14. * 注:字符串中使用双引号需要转义 (" --> \"),这里使用的是单引号,易读性会好很多。
  15. * json串以“{}”包裹,转换为java类时,使用:parseObject();
  16. * json串以“[]”包裹,转换为java类时,使用:parseArray();
  17. */
  18. @Test
  19. public void jsonToObj() {
  20. /* json字符串转简单java对象
  21. * 字符串:{"password":"123456","username":"dmego"}
  22. */
  23. String jsonStr1 = "{'password':'123456','username':'ggf'}";
  24. // 调用parseObject()
  25. User user = JSON.parseObject(jsonStr1, User.class);
  26. System.out.println("json字符串转简单java对象:"+user.toString());
  27. /*
  28. * json字符串转List<Object>对象
  29. * 字符串:[{"password":"123123","username":"zhangsan"},
  30. * {"password":"321321","username":"lisi"}]
  31. */
  32. String jsonStr2 = "[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]";
  33. // 调用parseArray()将字符串转为集合
  34. List<User> users = JSON.parseArray(jsonStr2, User.class);
  35. System.out.println("json字符串转List<Object>对象:"+users.toString());
  36. /*json字符串转复杂java对象
  37. * 字符串:{"name":"userGroup","users":[{"password":"123123","username":"zhangsan"},{"password":"321321","username":"lisi"}]}
  38. * */
  39. String jsonStr3 = "{'name':'userGroup','users':[{'password':'123123','username':'zhangsan'},{'password':'321321','username':'lisi'}]}";
  40. UserGroup userGroup = JSON.parseObject(jsonStr3, UserGroup.class);
  41. System.out.println("json字符串转复杂java对象:"+userGroup);
  42. }
  43. }

输出结果:

  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]]]

五、fastjson实际开发应用

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类。

GsonFormat工具的使用可参考该文章:https://www.cnblogs.com/1024zy/p/6370305.html

  1. package javabasic.json;
  2. import java.util.List;
  3. /**
  4. * @Description: 菜谱数据响应体
  5. * 使用GsonFormat功能生成
  6. * @Author: ggf
  7. * @Date: 2020/01/11
  8. */
  9. public class ResponseData {
  10. private String resultcode;
  11. private String reason;
  12. private ResultBean result;
  13. private int error_code;
  14. public String getResultcode() {
  15. return resultcode;
  16. }
  17. public void setResultcode(String resultcode) {
  18. this.resultcode = resultcode;
  19. }
  20. public String getReason() {
  21. return reason;
  22. }
  23. public void setReason(String reason) {
  24. this.reason = reason;
  25. }
  26. public ResultBean getResult() {
  27. return result;
  28. }
  29. public void setResult(ResultBean result) {
  30. this.result = result;
  31. }
  32. public int getError_code() {
  33. return error_code;
  34. }
  35. public void setError_code(int error_code) {
  36. this.error_code = error_code;
  37. }
  38. @Override
  39. public String toString() {
  40. return "ResponseData{" +
  41. "resultcode='" + resultcode + '\'' +
  42. ", reason='" + reason + '\'' +
  43. ", result=" + result +
  44. ", error_code=" + error_code +
  45. '}';
  46. }
  47. public static class ResultBean {
  48. private String totalNum;
  49. private int pn;
  50. private String rn;
  51. private List<DataBean> data;
  52. public String getTotalNum() {
  53. return totalNum;
  54. }
  55. public void setTotalNum(String totalNum) {
  56. this.totalNum = totalNum;
  57. }
  58. public int getPn() {
  59. return pn;
  60. }
  61. public void setPn(int pn) {
  62. this.pn = pn;
  63. }
  64. public String getRn() {
  65. return rn;
  66. }
  67. public void setRn(String rn) {
  68. this.rn = rn;
  69. }
  70. public List<DataBean> getData() {
  71. return data;
  72. }
  73. public void setData(List<DataBean> data) {
  74. this.data = data;
  75. }
  76. @Override
  77. public String toString() {
  78. return "ResultBean{" +
  79. "totalNum='" + totalNum + '\'' +
  80. ", pn=" + pn +
  81. ", rn='" + rn + '\'' +
  82. ", data=" + data +
  83. '}';
  84. }
  85. public static class DataBean {
  86. private String id;
  87. private String title;
  88. private String tags;
  89. private String imtro;
  90. private String ingredients;
  91. private String burden;
  92. private List<String> albums;
  93. private List<StepsBean> steps;
  94. public String getId() {
  95. return id;
  96. }
  97. public void setId(String id) {
  98. this.id = id;
  99. }
  100. public String getTitle() {
  101. return title;
  102. }
  103. public void setTitle(String title) {
  104. this.title = title;
  105. }
  106. public String getTags() {
  107. return tags;
  108. }
  109. public void setTags(String tags) {
  110. this.tags = tags;
  111. }
  112. public String getImtro() {
  113. return imtro;
  114. }
  115. public void setImtro(String imtro) {
  116. this.imtro = imtro;
  117. }
  118. public String getIngredients() {
  119. return ingredients;
  120. }
  121. public void setIngredients(String ingredients) {
  122. this.ingredients = ingredients;
  123. }
  124. public String getBurden() {
  125. return burden;
  126. }
  127. public void setBurden(String burden) {
  128. this.burden = burden;
  129. }
  130. public List<String> getAlbums() {
  131. return albums;
  132. }
  133. public void setAlbums(List<String> albums) {
  134. this.albums = albums;
  135. }
  136. public List<StepsBean> getSteps() {
  137. return steps;
  138. }
  139. public void setSteps(List<StepsBean> steps) {
  140. this.steps = steps;
  141. }
  142. @Override
  143. public String toString() {
  144. return "DataBean{" +
  145. "id='" + id + '\'' +
  146. ", title='" + title + '\'' +
  147. ", tags='" + tags + '\'' +
  148. ", imtro='" + imtro + '\'' +
  149. ", ingredients='" + ingredients + '\'' +
  150. ", burden='" + burden + '\'' +
  151. ", albums=" + albums +
  152. ", steps=" + steps +
  153. '}';
  154. }
  155. public static class StepsBean {
  156. private String img;
  157. private String step;
  158. public String getImg() {
  159. return img;
  160. }
  161. public void setImg(String img) {
  162. this.img = img;
  163. }
  164. public String getStep() {
  165. return step;
  166. }
  167. public void setStep(String step) {
  168. this.step = step;
  169. }
  170. @Override
  171. public String toString() {
  172. return "StepsBean{" +
  173. "img='" + img + '\'' +
  174. ", step='" + step + '\'' +
  175. '}';
  176. }
  177. }
  178. }
  179. }
  180. }

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

  1. package javabasic.json;
  2. import cn.hutool.core.io.FileUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.util.IOUtils;
  6. import org.junit.Test;
  7. import java.io.InputStream;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * @Description: fastjson API使用练习
  12. * @Author: ggf
  13. * @Date: 2020/01/11
  14. */
  15. public class FastJsonTest {
  16. /**
  17. *将复杂的json串转换为java类
  18. */
  19. @Test
  20. public void jsonToComplexObj() {
  21. // 读取类路径下的caipu.json文件,这里使用了第三方工具hutool进行读取json文件
  22. // 工具类参见:https://hutool.cn/docs/#/
  23. String jsonStr = FileUtil.readUtf8String("./javabasic/json/caipu.json");
  24. System.out.println(jsonStr);
  25. // 转换为java类
  26. ResponseData resp = JSON.parseObject(jsonStr, ResponseData.class);
  27. System.out.println(resp);
  28. // 通过对象操作数据
  29. // 获取响应码resultcode
  30. System.out.println(resp.getResultcode());
  31. // 获取响应数据
  32. ResponseData.ResultBean result = resp.getResult();
  33. System.out.println("result响应数据:" + result);
  34. }
  35. }

输出结果


  1. ResponseData{resultcode='200', reason='Success', result=ResultBean{totalNum='9', pn=0, rn='1', data=[DataBean{id='6269', title='羊肉汤', tags='增强抵抗力;煮;家常菜;汤;鲁菜', imtro='邹城人有喝羊汤的习惯,春夏秋冬羊汤馆总断不了食客,春秋天气候干燥要喝,夏天入伏要喝“伏羊汤”,阴冷的冬季尤其要喝碗羊汤才够温暖。以至于邀友喝羊汤成为了礼仪;“二哥,晚上咱们喝羊汤去”。邹城的羊汤铺遍地开花,以至于单县羊汤、滕州羊汤在邹城都没有了用武之地。我们这里的羊汤做法是最纯的,基本不放煮肉的香料,就用羊骨和羊肉煮成,“肉嫩汤浓”是其特色。 煮羊汤要先煮羊骨,把羊骨斩成大段焯水后放一点羊板油用细火煮,煮到汤白味浓时放入羊肉。羊肉煮到用筷子能轻松插穿时就要捞出,久煮的话羊肉过烂就失去了软嫩的口感。 碗里放入葱花或蒜粒,调入精盐,放入切的薄薄的羊肉片。把烧的滚开的羊汤盛到碗里,洒上香菜,再挖上一匙子香辣的用羊油泼成的辣椒油,一个字“香”!', ingredients='山羊肉,500g;羊骨,1000g', burden='生姜,适量;精盐,适量;香菜,适量;大葱,适量;辣椒油,适量;羊板油,适量', albums=[http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg], steps=[StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_95d65e77b58a1b6b.jpg', step='1.羊脊骨洗净用刀斩成段。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a8136c10401a1643.jpg', step='2.煮锅里倒入清水,放入羊脊骨,羊肉煮开后捞出。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7b1c9fc85ddc6de.jpg', step='3.煮锅里倒入开水,放入羊脊骨生姜块大火煮开后改小火。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_2b284dc30b4f0875.jpg', step='4.小火煮40分钟,煮至汤色发白。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_c7ade6439eb2db5a.jpg', step='5.放入羊肉,加入适量的羊板油小火煮30分钟。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_579748e3b0f15963.jpg', step='6.捞出煮好的羊肉,晾凉后切薄片。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_1550e6f127aa1077.jpg', step='7.碗里放入葱花,调入精盐。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_a2c965d77b96da70.jpg', step='8.放入羊肉片,把滚开的羊汤倒入碗里洒上香菜末。'}, StepsBean{img='http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/s/63/6269_eea9b807d1dc5995.jpg', step='9.可以根据喜好调入陈醋放入蒜粒,最后调入辣椒油即可。'}]}]}, error_code=0}

2.对json串的操作

在实际开发中,我们经常要对接口返回的json数据,进行操作,获取里面的某些数据。还是以上面的json字符串为例,使用fastjson,对json字符串进行操作。

  1. package javabasic.json;
  2. import cn.hutool.core.io.FileUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.util.IOUtils;
  6. import org.junit.Test;
  7. import java.io.InputStream;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * @Description: fastjson API使用练习
  12. * @Author: ggf
  13. * @Date: 2020/01/11
  14. */
  15. public class FastJsonTest {
  16. /**
  17. * 对json串的操作
  18. */
  19. @Test
  20. public void operateJson() {
  21. // 读取本地json文本
  22. String jsonStr = FileUtil.readUtf8String("./javabasic/json/caipu.json");
  23. // 创建json对象
  24. JSONObject jsonObj = JSONObject.parseObject(jsonStr);
  25. // 操作json内容
  26. // 获取响应码resultcode
  27. System.out.println(jsonObj.get("resultcode"));
  28. // 获取响应信息reason
  29. System.out.println(jsonObj.getString("reason"));
  30. // 获取data
  31. JSONObject resJsonObj = (JSONObject)jsonObj.get("result");
  32. System.out.println(resJsonObj.getString("data"));
  33. }
  34. }

输出结果

  1. 200
  2. Success
  3. [{"albums":["http://juheimg.oss-cn-hangzhou.aliyuncs.com/cookbook/t/7/6269_379835.jpg"],
  4. .......以下内容省略
  5. "}]

六、fastjson漏洞问题

可参考文章:https://www.cnblogs.com/chaos-li/p/11139992.html

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

七、fastjson踩坑

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

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

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

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

在低版本中转换的时候会直接抛以上异常信息(测试版本:fastjson-1.1.12)。但是高版本(fastjson-1.2.58)就不会报错。

建议在定义javabean时都把无参和有参定义。

【参考文章】

https://www.cnblogs.com/dmego/p/9033080.html

https://blog.csdn.net/zgzczzw/article/details/72330190

https://blog.csdn.net/JLoveforever/article/details/79885485

fastjson使用详解的更多相关文章

  1. fastjson SerializerFeature详解(转)

    原文地址:fastjson SerializerFeature详解

  2. 【Android 应用开发】 FastJson 使用详解

    博客地址 :http://blog.csdn.net/shulianghan/article/details/41011605 fastjson 源码地址 : -- GitHub : https:// ...

  3. FastJSON实现详解

    摘要:“快”作为程序员追逐的终极目标之一,而FastJSON则很好的证明了这一特性.本期<问底>,静行将带大家见证它序列化和反序列化的实现过程,一起领略它的“快”感. 还记得电影<功 ...

  4. fastjson SerializerFeature详解

  5. 最强常用开发库总结 - JSON库详解

    最强常用开发库总结 - JSON库详解 JSON应用非常广泛,对于Java常用的JSON库要完全掌握.@pdai JSON简介 JSON是什么 JSON 指的是 JavaScript 对象表示法(Ja ...

  6. 通讯协议序列化解读(一) Protobuf详解教程

    前言:说到JSON可能大家很熟悉,是目前应用最广泛的一种序列化格式,它使用起来简单方便,而且拥有超高的可读性.但是在越来越多的应用场景里,JSON冗长的缺点导致它并不是一种最优的选择. 一.常用序列化 ...

  7. maven生命周期和插件详解

    生命周期 什么是生命周期? maven的生命周期就是对所有的构建过程进行抽象和统一.maven从大量项目和构建工具中总结了一套高度完善的.易扩展的生命周期.这个生命周期包含项目的清理.初始化.编译.测 ...

  8. Spring Boot 之使用 Json 详解

    Spring Boot 之使用 Json 详解 简介 Spring Boot 支持的 Json 库 Spring Web 中的序列化.反序列化 指定类的 Json 序列化.反序列化 @JsonTest ...

  9. JDK中Unsafe类详解

    Java中Unsafe类详解 在openjdk8下看Unsafe源码 浅析Java中的原子操作 Java并发编程之LockSupport http://hg.openjdk.java.net/jdk7 ...

随机推荐

  1. CodeForces 620E"New Year Tree"(DFS序+线段树+状态压缩)

    传送门 •题意 给你一颗 n 个节点的树,每个节点被染上了颜色: 有 m 次操作,每次操作的类型有两种 1 v c : 将以 v 为根的子树的结点全部涂成 c 2 v : 询问以 v 为根的子树的结点 ...

  2. Mac PHPStorm清除SVN配置缓存

  3. java 标准流

    标准输入流:  System.in   默认表示的是键盘录入    标准输出流:  System.out  默认表示的是屏幕输出 Eg: package june6D; import java.io. ...

  4. P1055 连通块问题

    题目描述 给出一个n行m列的地图,'.'代表陆地,'W'代表水.现在需要你计算地图中有多少个水块.八个方向可以连通 比如:4*6的地图 ...WWW ...WW. WW.... .....W 中有3个 ...

  5. .map() .filter() .reduce() .includes() .some() .every()的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. H3C ping命令的输出

  7. React Mobile 搭建记录

    __dirname 总是指向被执行 js 文件的绝对路径,./ 会返回你执行 node 命令的路径,例如你的工作路径. path.join()方法可以连接任意多个路径字符串.要连接的多个路径可做为参数 ...

  8. Android Simulator Shortcut keys

    按钮 快捷键 Back Ctrl+Backspace Battery Ctrl+Shift+B Cellular Ctrl+Shift+C D-pad Ctrl+Shift+D Enter zoom ...

  9. ZOJ——Knight Moves(bfs)

    Knight Moves Time Limit: 2 Seconds      Memory Limit: 65536 KB A friend of you is doing research on ...

  10. 阿里云“网红&quot;运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...