前言

作为一名后端开发而言肯定会接触数据,把数据提供给前端或者把数据存储起来,目前比较火热的传输格式是json,给前端传json是再常见不过啦,甚至是往db里面直接存入json。

在java层面来说json只不过就是一个字符串而已,json对我们的意义是把一个对象或者map序列化成json字符串。这样json就可以在进行网络io了,同样你把一个对象序列化成了一个json串存入到db,当你从db中读取出来的时候,你读出来的也是一个json的字符串,你还需要进行反序列化让它重新变成对象。

FastJSON就是一个帮助你序列号和反序列化java对象的工具,这里不会讲很高阶的用法,只讲大家工作中每天都会使用到的常见用法。这里多说一句,大家可能会看到网上天天说FastJSON这不好那不好....我也知道它有漏洞,可是它很快而且很方便,大部分小公司都依然还会选择使用FastJSON来作为序列化工具。

开始之前先导包

/*这里查找最新的包
https://mvnrepository.com/artifact/com.alibaba/fastjson
*/
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>

序列化

  1. 如果你不清楚JSON格式的话,在序列化这里我会简单介绍一下JSON的格式,因为你把java对象变成json后你可以对比看,json是如何把你的对象变成字符串存储的。

  2. 简单介绍FastJSON(下成FJ)

    首先FJ有一个JSON的静态工具类,里面都是我们接下来会用到的方法。然后FJ也提供一些其他的别名类,例如JSONObjectJSONArray,看到名字都应该能秒懂,一个操作对象一个操作集合的,但是这里面提供的方法JSON这个静态工具类都有。所以大家用哪个都可以,下面我统一使用JSON类

  3. 如何使用,序列化就是把一个对象变成方便传输方便存储的格式。

    JSON.toJSONString(你要放入的对象)就可以把一个对象变成json格式

    // 把map变成json
    public class MultiTest {
    public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap);
    // 输出结果是 {"gender":"男","name":"小明"}
    System.out.println(stuJson);
    }
    }
    // 把对象编程json
    public class MultiTest { @Data
    @Builder
    private static class Student {
    private String name;
    private String gender;
    } public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap);
    // 输出结果是 {"gender":"男","name":"小明"}
    System.out.println(stuJson);
    } }
  4. 上面这个例子,可以看到map和实体类的序列化结果是一致的,为什么呢,因为实体类和map本质上差不多,都是一个key,一个value。name是key,小红是value,gender是key,男是value。

    然后我们看序列化后的结果,{"gender":"男","name":"小明"}。我们可以格式化一下就变成(网上有很多工具可以美化json,例如www.json.cn)

    {
    "gender": "男",
    "name": "小明"
    }

    美化以后,我们看起来就简单多了,首先json的标志一个花括号包裹{},其次里面存储的也是键值对,键值对里面使用:来分割,左边是key,右边是value。键值对之间使用逗号分割。这个你肯定看的名单,但是键值对的value还有疯狂套娃,里面可能还是json或者是一个数组,甚至是一个json数组。你可以自己尝试使用JSON.toJSONString序列号一些你经常使用到的对象,看看他的结果是什么样子的。

反序列化

既然你把我的java对象变成了json字符串,那肯定有办法要变回来并且这个操作很常见。

  • 把json解析成JSONObject对象-JSON.parseObject(放入json串)

    这里解释一下JSONObject是什么,JSONObject你可以你把它理解成map,他是FJ对map的实现,如果你没有指定把json解析成什么他会默认转成JSONObject对象。这个对象就当map使用,用法一样,下面是例子

        public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap); // 把它转成JSONObject
    JSONObject jsonObj = JSON.parseObject(stuJson);
    // %s为类c占位符, 显示后面变量内容
    System.out.printf("这位同学的名字是%s,性别是%s%n",
    jsonObj.get("name"),
    jsonObj.get("gender")); // 输出结果为 这位同学的名字是小明,性别是男
    }
  • JSONObject有一些比map好的地方,emmm也不能说比map好,所不相同的地方吧。因为你把一个对象变成了json,其实你已经丢掉了它的类型,或者说我原来有泛型来约束,但是不见了,或者就是说我原来Map<String, Object>,你每次从map里面取出元素以后是需要强转一下的。JSONObject它没有泛型,但是它每次get都方法帮你去安全的cast转化一下。所以在JSONObject你可以很方便的get出你想要的类型啦

    JSONObject可以get出的类型

    所以刚刚的例子里面的sout里面语句可以写成

            // %s为类c占位符, 显示后面变量内容
    System.out.printf("这位同学的名字是%s,性别是%s%n",
    jsonObj.getString("name"),
    jsonObj.getString("gender"));
  • 把json解析成Map对象-JSON.parseObject(放入json串, Map.class)

    其实很简单,只要在parseObject的括号里面加入Map.class,指定你要转成map就好了

        public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap); // 把它转成JSONObject
    Map jsonMap = JSON.parseObject(stuJson ,Map.class);
    // %s为类c占位符, 显示后面变量内容
    System.out.printf("这位同学的名字是%s,性别是%s%n",
    jsonMap.get("name"),
    jsonMap.get("gender"));
    // 输出结果为 这位同学的名字是小明,性别是男
    }

    这里有一个要注意的,这样你转出来是没有泛型约束的,是不安全的,或者说...是看起来很丑的(毕竟你会在意不安全吗)...我们可以改传一个typeReference。大家不用在意是什么道理,这也不是很重要,看不懂也没关系。

        public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap); // 把它转成JSONObject
    Map<String, Object> jsonMap = JSON.parseObject(stuJson,
    // 把Map和泛型放入这个reference里面,注意这里是一个匿名内部类
    new TypeReference<Map<String, Object>>() {});
    // %s为类c占位符, 显示后面变量内容
    System.out.printf("这位同学的名字是%s,性别是%s%n",
    jsonMap.get("name"),
    jsonMap.get("gender"));
    // 输出结果为 这位同学的名字是小明,性别是男
    }
  • 把json解析成Map对象-JSON.parseObject(放入json串,对象.class)

    public class MultiTest {
    
        @Data
    @Builder
    private static class Student {
    private String name;
    private String gender;
    } public static void main(String[] args) {
    // 这里快速生成一个map
    Map<String, String> stuMap = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    // 使用JSON对这个map对象序列化
    String stuJson = JSON.toJSONString(stuMap); // 把它转成JSONObject
    Student stuObj = JSON.parseObject(stuJson, Student.class);
    // %s为类c占位符, 显示后面变量内容
    System.out.printf("这位同学的名字是%s,性别是%s%n",
    stuObj.getName(),
    stuObj.getGender());
    // 输出结果为 这位同学的名字是小明,性别是男
    } }
  • 把json解析成JSONArray--JSON.parseArray(放入json串)

    这里的JSONArray就类似于Java的list,因为它是FJ对List的实现,它也是没有泛型的,get的时候可以指定需要取出来的类型,这里就不多说啦。注意啦,他这个get()的入参是索引下标,这可是list。

    public class MultiTest {
    
        @Data
    @Builder
    private static class Student {
    private String name;
    private String gender;
    } public static void main(String[] args) {
    // 这里快速生成几个Map
    Map<String, String> stuMap1 = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    Map<String, String> stuMap2 = MapUtil.builder("name", "小刚").
    put("gender", "男").build();
    Map<String, String> stuMap3 = MapUtil.builder("name", "小红").
    put("gender", "女").build();
    // 把map放到list中
    List<Map<String, String>> stuList = Arrays.asList(stuMap1, stuMap2, stuMap3);
    // 把list序列化成json
    String stuListJson = JSON.toJSONString(stuList); // 把json反序列化成list
    JSONArray stuJsonArray = JSON.parseArray(stuListJson);
    // 0号元素取出来变成JSONObject
    JSONObject stu1 = stuJsonArray.getJSONObject(0);
    // 1号元素取出来变成map,这里也可以使用TypeReference设置泛型
    Map stu2 = stuJsonArray.getObject(1, Map.class);
    // 甚至可以直接转成实体类, 毕竟里面的元素也是json啊
    Student stu3 = stuJsonArray.getObject(2, Student.class); } }
  • 把json解析成List-JSON.parseArray(放入json串,list元素类型.class)

    这个一般用的比较多,因为可以直接指定里面的泛型,返回来就帮你转好了

    public class MultiTest {
    
        @Data
    @Builder
    private static class Student {
    private String name;
    private String gender;
    } public static void main(String[] args) {
    // 这里快速生成几个Map
    Map<String, String> stuMap1 = MapUtil.builder("name", "小明").
    put("gender", "男").build();
    Map<String, String> stuMap2 = MapUtil.builder("name", "小刚").
    put("gender", "男").build();
    Map<String, String> stuMap3 = MapUtil.builder("name", "小红").
    put("gender", "女").build();
    // 把map放到list中
    List<Map<String, String>> stuList = Arrays.asList(stuMap1, stuMap2, stuMap3);
    // 把list序列化成json
    String stuListJson = JSON.toJSONString(stuList); // 把json反序列化成list,里面每个元素都是student
    List<Student> studentList = JSON.parseArray(stuListJson, Student.class); } }

后言

以上就是比较常见的对象和json互转的方法,其实非常家的简单其实没几个,这样我再来复盘一下

对象变json JSON.toJSONString(obj)

json变回对象 JSON.parseObject(json, 你要变成的对象类型.class)

json变lsit JSON.parseArray(json, list中元素的类型.class)

是不是十分简单,其实规则就是他们互转,FJ给我们提供了非常健壮方便的互转方式,可以自己去看看源码,我怕说太多不太常用大家看的不耐烦....祝大家用的愉快~

更多有意思的文章欢迎大家来我的个人blog挖掘,点击这里

快速上手FastJSON的更多相关文章

  1. 阿里语音识别(语音转文字)java调用全程手把手详解-适合中小学生快速上手

    阿里语音识别服务java调用全程手把手详解-适合中小学生快速上手 阿里语音识别与百度语音识别的调用对比: 用例:1分30秒的录音文件    百度用时:3秒    阿里用时:30秒    识别准确率来看 ...

  2. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  3. 快速上手Unity原生Json库

    现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...

  4. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手

    原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...

  5. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

  6. 快速上手seajs——简单易用Seajs

    快速上手seajs——简单易用Seajs   原文  http://www.cnblogs.com/xjchenhao/p/4021775.html 主题 SeaJS 简易手册 http://yslo ...

  7. Git版本控制Windows版快速上手

    说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行.写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手. 说白了Git就是一个控制版本的工具,其实没想象中的那么复杂,咱在 ...

  8. Objective-C快速上手

    最近在开发iOS程序,这篇博文的内容是刚学习Objective-C时做的笔记,力图达到用最短的时间了解OC并使用OC.Objective-C是OS X 和 iOS平台上面的主要编程语言,它是C语言的超 ...

  9. Netron开发快速上手(二):Netron序列化

    Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...

随机推荐

  1. Node.js实现前后端交互——用户注册

    我之前写过一篇关于使用Node.js作为后端实现用户登陆的功能,现在再写一下node.js做后端实现简单的用户注册实例吧.另外需要说的是,上次有大佬提醒需要加密数据传输,不应该使用明文传输用户信息.在 ...

  2. Django(76)isort工具对import导入进行排序

    前言 我们在开发项目时经常会进行导包有import *格式的,还有from * import *格式的,最后就会显示的很乱,那么有没有什么工具能对导包进行一键排序呢?答案是有的,使用isort工具 i ...

  3. 【R】如何将重复行转化为多列(一对一转化一对多)?

    目录 需求 方法一 方法二 需求 一个数据框一列或多列中有重复行,如何将它的重复行转化为多列?即本来两列一对一的关系,如何转化为一对多的关系?普通的spread函数实现较为麻烦. 示例数据如下: It ...

  4. 【GS文献】植物全基因组选择育种技术原理与研究进展

    目录 1. 优势杂交育种预测 2. GS育种原理与模型算法 岭回归和LASSO回归 贝叶斯方法 GBLUP和RRBLUP 偏最小二乘法 支持向量机/支持向量回归 其他方法 3. 模型预测能力验证 4. ...

  5. MYSQL5.8----M3

    333333333333333333333333333 mysql> DESC user; +----------+---------------------+------+-----+---- ...

  6. MariaDB——显示所有数据库列表

    显示所有数据库列表:其中,information_schema.performance_schema.test.mysql,这4个库表是数据库系统自带的表,一般不放数据. 进入某个库 切换库,并显示库 ...

  7. goto 的用法

    #include <stdio.h> int main() { printf("go to cpy \n"); goto FLASH_CPY; printf(" ...

  8. pyyaml模块

    pyyaml模块是一种文件数据处理格式的方法,常用与生成.解析或修改.yaml配置文件 1.常见.yaml文件格式内容如下 languages: - Ruby - Perl - Python webs ...

  9. 学习java的第十五天

    一.今日收获 1.完成了手册第二章没有验证完成的例题 2.预习了第三章的算法以及for语句与if语句的用法 二.今日难题 1.验证上出现问题,没有那么仔细. 2.第二章还有没有完全理解的问题 三.明日 ...

  10. 到底什么是自动化优先思维?与RPA有什么关系?

    基于RPA的自动化优先,正在成为广大组织的主流管理思维 到底什么是自动化优先思维?与RPA有什么关系? 如何用RPA简单快速的打造一个自动化优先的组织? 文/王吉伟 在IT运维项目中,组织经常会遇到先 ...