当前位置:   article > 正文

FastJson快速上手【Json解析工具】_json序列化工具

json序列化工具

目录

一、spring boot工程中引入FastJson依赖

二、调用JSON类的静态方法直接进行json序列化和反序列化

2.1 序列化

2.2 反序列化

三、快速演示:

四、思考

五、web案例demo演示


针对JSON序列化和反序列化,为了方便快捷,我们一般使用json序列化工具进行操作

常见的json序列化工具有Gson和FastJson

FastJson是阿里巴巴开源的项目,号称是速度最快的json解析工具。

以FastJson为例,演示基本使用方法:


一、spring boot工程中引入FastJson依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.79</version>
  5. </dependency>

二、调用JSON类的静态方法直接进行json序列化和反序列化

一般主要用的方法就下面四个~

2.1 序列化

Javabean对象      序列化         成为json字符串
List集合                序列化         成为json字符串
Map集合               序列化         成为json字符串

public static String toJSONString(Object object)

2.2 反序列化

json字符串   反序列化   成为Javabean对象或任意类:

public static <T> T parseObject(String text, Class<T> clazz)

json字符串   反序列化 成为List集合:

public static <T> List<T> parseArray(String text, Class<T> clazz)

json字符串   反序列化 成为Map集合:

public static <T> T parseObject(String text, TypeReference<T> type, Feature... features)

注意:new TypeReference<T>(){}是匿名对象,其泛型应设置为转换后的Map类型。

三、快速演示:

  1. package com.hssy.newcustomer;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.TypeReference;
  4. import com.hssy.newcustomer.dto.fastjson.JsonDetailModule;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. @SpringBootTest
  12. class NewcustomerApplicationTests {
  13. //测试Java对象进行json序列化成json字符串
  14. @Test
  15. void contextLoads() {
  16. JsonDetailModule module = new JsonDetailModule();
  17. module.setId(2);
  18. module.setName("张菲");
  19. List<String> hobbys = new ArrayList<>();
  20. hobbys.add("唱歌");
  21. hobbys.add("书法");
  22. hobbys.add("三国演绎");
  23. module.setHobby(hobbys);
  24. String jsonString = JSON.toJSONString(module);
  25. System.out.println(jsonString);
  26. // {"hobby":["唱歌","书法","三国演绎"],"id":2,"name":"张菲"}
  27. }
  28. //测试将List集合进行json序列化成json字符串
  29. @Test
  30. void testListToJson(){
  31. List<JsonDetailModule> list = new ArrayList<>();
  32. for (int i = 0; i < 2; i++) {
  33. JsonDetailModule module = new JsonDetailModule();
  34. module.setId(i);
  35. module.setName("用户:"+ i);
  36. List<String> hobbys = new ArrayList<>();
  37. hobbys.add("随机爱好:"+(char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0x4e00 + 1))));
  38. hobbys.add("随机爱好:"+(char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0x4e00 + 1))));
  39. module.setHobby(hobbys);
  40. list.add(module);
  41. }
  42. String jsonString = JSON.toJSONString(list);
  43. System.out.println(jsonString);
  44. // [{"hobby":["随机爱好:武","随机爱好:畧"],"id":0,"name":"用户:0"},{"hobby":["随机爱好:穊","随机爱好:丠"],"id":1,"name":"用户:1"}]
  45. }
  46. @Test
  47. void testMapToJson(){
  48. HashMap<String, List<String>> map = new HashMap<>();
  49. List<String> hobbys = new ArrayList<>();
  50. hobbys.add("唱");
  51. hobbys.add("跳");
  52. hobbys.add("rap");
  53. hobbys.add("篮球");
  54. List<String> genders = new ArrayList<>();
  55. genders.add("男");
  56. genders.add("女");
  57. map.put("爱好",hobbys);
  58. map.put("性别",genders);
  59. String jsonString = JSON.toJSONString(map);
  60. System.out.println(jsonString);
  61. // {"爱好":["唱","跳","rap","篮球"],"性别":["男","女"]}
  62. }
  63. //测试json字符串反序列化成Java对象
  64. @Test
  65. void testJsonToJava(){
  66. String jsonString = "{\"hobby\":[\"唱歌\",\"书法\",\"三国演绎\"],\"id\":2,\"name\":\"张菲\"}";
  67. JsonDetailModule jsonDetialModule = JSON.parseObject(jsonString, JsonDetailModule.class);
  68. System.out.println(jsonDetialModule); //JsonDetailModule(id=2, name=张菲, hobby=[唱歌, 书法, 三国演绎])
  69. }
  70. @Test
  71. void testJsonToList(){
  72. String jsonString = " [{\"hobby\":[\"随机爱好:武\",\"随机爱好:畧\"],\"id\":0,\"name\":\"用户:0\"},{\"hobby\":[\"随机爱好:穊\",\"随机爱好:丠\"],\"id\":1,\"name\":\"用户:1\"}]";
  73. List<JsonDetailModule> jsonDetailModules = JSON.parseArray(jsonString, JsonDetailModule.class);
  74. System.out.println(jsonDetailModules);
  75. // [JsonDetailModule(id=0, name=用户:0, hobby=[随机爱好:武, 随机爱好:畧]), JsonDetailModule(id=1, name=用户:1, hobby=[随机爱好:穊, 随机爱好:丠])]
  76. for (JsonDetailModule item : jsonDetailModules) {
  77. System.out.println(item);
  78. }
  79. // JsonDetailModule(id=0, name=用户:0, hobby=[随机爱好:武, 随机爱好:畧])
  80. // JsonDetailModule(id=1, name=用户:1, hobby=[随机爱好:穊, 随机爱好:丠])
  81. }
  82. @Test
  83. void testJsonToMap(){
  84. String jsonString ="{\"爱好\":[\"唱\",\"跳\",\"rap\",\"篮球\"],\"性别\":[\"男\",\"女\"]}";
  85. // JSONObject jsonObject = JSON.parseObject(jsonString);
  86. //使用JSON.parseObject(jsonString)直接进行反序列化是没有泛型的,没有泛型是不安全的集合
  87. //我们要求转后的集合必须有泛型
  88. //因此,调用parseObject方法,还必须多穿一个TypeReference类型的参数,TypeReference类的泛型中,传递转换后的Map集合
  89. Map<String, List<String>> map = JSON.parseObject(jsonString, new TypeReference<Map<String, List<String>>>(){});
  90. for (String key: map.keySet()) {
  91. System.out.println(key +":--:"+map.get(key));
  92. }
  93. // 爱好:--:[唱, 跳, rap, 篮球]
  94. // 性别:--:[男, 女]
  95. }
  96. }


四、思考

思考:以下二者有什么区别?

redisTemplate.opsForValue().set("user", JSON.toJSONString(user));
redisTemplate.opsForValue().set("user", user.toString());

区别在于存储到 Redis 中的值的类型。

  1. 数据结构:

    JSON.toJSONString() 方法将对象转换为 JSON 格式的字符串,而 user.toString() 只是将 user 对象转换成 String 类型。因此,前者将在 Redis 中存储一个 JSON 对象,后者将在 Redis 中存储一个简单的 String字符串。

  2. Redis 存储结构:

    使用 JSON.toJSONString() 将对象转换为 JSON 字符串,Redis 存储的值类型为 string。存储后取出时需要进行反序列化操作。

    而使用 toString() 将对象转换为 String,Redis 存储的值也是 String 类型。但是其不支持反序列化,即取出来的仍然是 String 类型而不是原对象。

综上所述,如果你要存储一个完整的对象,建议使用 JSON.toJSONString() 将对象转换为 JSON 格式的字符串再存储;如果只需存储一个字符串或字符串拼接的值,那么就两种方式都可以使用。

五、web案例demo演示

序列化

  1. @ApiOperation(value = "存")
  2. @GetMapping("save")
  3. public Result<String> t1(){
  4. User user = new User();
  5. user.setId(1);
  6. user.setName("高启强");
  7. user.setBirthday(LocalDateTime.now());
  8. user.setGender(1);
  9. user.setAddress("京海市人民路86号");
  10. String substring = UUID.randomUUID().toString().substring(0, 5);
  11. redisTemplate.opsForValue().set("user-"+substring, JSON.toJSONString(user));
  12. return Result.success("user-"+substring);
  13. }

反序列化 

  1. @ApiOperation(value = "查")
  2. @GetMapping("select")
  3. public Result<User> t2(String redisKey){
  4. String value = redisTemplate.opsForValue().get(redisKey);
  5. System.out.println(value);
  6. User user = JSON.parseObject(value, User.class);
  7. System.out.println(user);
  8. return Result.success();
  9. }

 

集合序列化

  1. @ApiOperation(value = "存集合")
  2. @GetMapping("saveList")
  3. public Result<String> t3(){
  4. ArrayList<User> list = new ArrayList<>();
  5. for (int i = 0; i < 10; i++) {
  6. User user = new User();
  7. user.setId(1);
  8. user.setName("高启强");
  9. user.setBirthday(LocalDateTime.now());
  10. user.setGender(1);
  11. user.setAddress("京海市人民路86号");
  12. list.add(user);
  13. }
  14. String substring = UUID.randomUUID().toString().substring(0, 5);
  15. redisTemplate.opsForValue().set("user-"+substring, JSON.toJSONString(list));
  16. return Result.success("user-"+substring);
  17. }

  

集合反序列化

  1. @ApiOperation(value = "查集合")
  2. @GetMapping("selectList")
  3. public Result<User> t4(String redisKey){
  4. String value = redisTemplate.opsForValue().get(redisKey);
  5. System.out.println(value);
  6. List<User> users = JSON.parseArray(value, User.class);
  7. System.out.println(users);
  8. return Result.success();
  9. }

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

闽ICP备14008679号