目录

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

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

2.1 序列化

2.2 反序列化

三、快速演示:

四、思考

五、web案例demo演示


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

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

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

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

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

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version>
</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类型。

三、快速演示:

package com.hssy.newcustomer;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.hssy.newcustomer.dto.fastjson.JsonDetailModule;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@SpringBootTest
class NewcustomerApplicationTests {//测试Java对象进行json序列化成json字符串@Testvoid contextLoads() {JsonDetailModule module = new JsonDetailModule();module.setId(2);module.setName("张菲");List<String> hobbys = new ArrayList<>();hobbys.add("唱歌");hobbys.add("书法");hobbys.add("三国演绎");module.setHobby(hobbys);String jsonString = JSON.toJSONString(module);System.out.println(jsonString);
//        {"hobby":["唱歌","书法","三国演绎"],"id":2,"name":"张菲"}}//测试将List集合进行json序列化成json字符串@Testvoid testListToJson(){List<JsonDetailModule> list = new ArrayList<>();for (int i = 0; i < 2; i++) {JsonDetailModule module = new JsonDetailModule();module.setId(i);module.setName("用户:"+ i);List<String> hobbys = new ArrayList<>();hobbys.add("随机爱好:"+(char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0x4e00 + 1))));hobbys.add("随机爱好:"+(char) (0x4e00 + (int) (Math.random() * (0x9fa5 - 0x4e00 + 1))));module.setHobby(hobbys);list.add(module);}String jsonString = JSON.toJSONString(list);System.out.println(jsonString);//        [{"hobby":["随机爱好:武","随机爱好:畧"],"id":0,"name":"用户:0"},{"hobby":["随机爱好:穊","随机爱好:丠"],"id":1,"name":"用户:1"}]}@Testvoid testMapToJson(){HashMap<String, List<String>> map = new HashMap<>();List<String> hobbys = new ArrayList<>();hobbys.add("唱");hobbys.add("跳");hobbys.add("rap");hobbys.add("篮球");List<String> genders = new ArrayList<>();genders.add("男");genders.add("女");map.put("爱好",hobbys);map.put("性别",genders);String jsonString = JSON.toJSONString(map);System.out.println(jsonString);
//        {"爱好":["唱","跳","rap","篮球"],"性别":["男","女"]}}//测试json字符串反序列化成Java对象@Testvoid testJsonToJava(){String jsonString = "{\"hobby\":[\"唱歌\",\"书法\",\"三国演绎\"],\"id\":2,\"name\":\"张菲\"}";JsonDetailModule jsonDetialModule = JSON.parseObject(jsonString, JsonDetailModule.class);System.out.println(jsonDetialModule);  //JsonDetailModule(id=2, name=张菲, hobby=[唱歌, 书法, 三国演绎])}@Testvoid testJsonToList(){String jsonString = " [{\"hobby\":[\"随机爱好:武\",\"随机爱好:畧\"],\"id\":0,\"name\":\"用户:0\"},{\"hobby\":[\"随机爱好:穊\",\"随机爱好:丠\"],\"id\":1,\"name\":\"用户:1\"}]";List<JsonDetailModule> jsonDetailModules = JSON.parseArray(jsonString, JsonDetailModule.class);System.out.println(jsonDetailModules);
//        [JsonDetailModule(id=0, name=用户:0, hobby=[随机爱好:武, 随机爱好:畧]), JsonDetailModule(id=1, name=用户:1, hobby=[随机爱好:穊, 随机爱好:丠])]for (JsonDetailModule item : jsonDetailModules) {System.out.println(item);}
//            JsonDetailModule(id=0, name=用户:0, hobby=[随机爱好:武, 随机爱好:畧])
//            JsonDetailModule(id=1, name=用户:1, hobby=[随机爱好:穊, 随机爱好:丠])}@Testvoid testJsonToMap(){String jsonString ="{\"爱好\":[\"唱\",\"跳\",\"rap\",\"篮球\"],\"性别\":[\"男\",\"女\"]}";
//        JSONObject jsonObject = JSON.parseObject(jsonString);//使用JSON.parseObject(jsonString)直接进行反序列化是没有泛型的,没有泛型是不安全的集合//我们要求转后的集合必须有泛型//因此,调用parseObject方法,还必须多穿一个TypeReference类型的参数,TypeReference类的泛型中,传递转换后的Map集合Map<String, List<String>> map = JSON.parseObject(jsonString, new TypeReference<Map<String, List<String>>>(){});for (String key: map.keySet()) {System.out.println(key +":--:"+map.get(key));}
//        爱好:--:[唱, 跳, rap, 篮球]
//        性别:--:[男, 女]}}

四、思考

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

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演示

序列化

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

反序列化

    @ApiOperation(value = "查")@GetMapping("select")public Result<User> t2(String redisKey){String value = redisTemplate.opsForValue().get(redisKey);System.out.println(value);User user = JSON.parseObject(value, User.class);System.out.println(user);return Result.success();}

集合序列化

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

集合反序列化

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

FastJson快速上手【Json解析工具】相关推荐

  1. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  2. JSON解析工具比较,主要GSON和FastJSON

    转自:http://www.cnblogs.com/kunpengit/p/4001680.html 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的 ...

  3. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  4. 自定义Json解析工具

    此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html fastjson是很好用的json解析工具,只可惜项目中要 ...

  5. json解析工具(json解析工具 python)

    常用的xml,json解析工具有哪些 1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可 ...

  6. Java常用的几种JSON解析工具

    一.Gson:Google开源的JSON解析库 1.添加依赖 <!--gson--> <dependency><groupId>com.google.code.gs ...

  7. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  8. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  9. [Android开发] Json解析工具类,一个类搞定Json的解析

    一.简介 利用递归的方式反射解析到bean里面 二.详细代码 1. Json格式 例如服务器指定规定json格式为: {"code": "--" , // 返回 ...

最新文章

  1. 2020mysql下载教程_Windows10 安装MySQL详细教程2020版 亲测亲写
  2. 中美德工业互联网路径比较
  3. 启动oracle em命令
  4. ios:ScrollView联动效果
  5. sketchup转stl_如何将.obj或.stl文件导入SketchUp的简便方法 - SketchUp自学
  6. ui和android有联系,Android单位换算与UI适配
  7. 爬取某东600多本书籍,用数据帮你分析哪些Python书籍值得选择(上)
  8. 工作109:token要登录之后才有
  9. 一个可以下载Github指定子文件夹的Chrome插件
  10. 拥抱ROS2系列:ROS2概述和实践入门(一)
  11. 各种常用排序算法的时间复杂度和空间复杂度
  12. 【Elasticsearch】es CPU热点线程 HotThreads 源码解析
  13. HTTP协议基本原理简介(二)
  14. Python学习笔记1—Python字符串
  15. 鸿蒙系统手机能用几年,华为鸿蒙系统何时能用到手机上?任正非:短时间做不到 重建生态需要几年时间...
  16. python可视化地图
  17. 考拉情书---一片道歉叶
  18. 别错过,教你如何用电脑玩手机
  19. ssh和telnet客户软件ZOC如何设置UTF-8
  20. 27岁,今年研究生上岸,有什么忠告可以给我的?

热门文章

  1. 【附源码例】快捷指令实现调出iOS隐藏应用程序-原理解析
  2. java Field类
  3. 初等数论 课堂笔记 第二章 -- 费马问题
  4. sublime jsx html插件,Sublime Text3关于react的插件——react语法提示代码格式化
  5. mysql热备教程_实现MySQL双机热备的实际操作步骤
  6. 邮件服务器zimbra的搭建与使用
  7. STM32F4中的CCM内存说明与使用
  8. Android TV 8.0 Browser播放视频闪退
  9. 渗透测试-2022红队必备工具列表总结​
  10. PyTorch 预训练权重保存位置