前言

作为一名后端开发而言肯定会接触数据,把数据提供给前端或者把数据存储起来,目前比较火热的传输格式是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. js 鼠标放到图片上放大某一部分效果

    动图效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. 面向对象的程序设计之JS创建对象的9种模式及其优缺点

    目录 1.new Object () 2.字面式创建对象 3.工厂模式 4.构造函数模式 4.1.将构造函数当作函数 4.2.构造函数的问题 5.原型模式 5.1.理解原型对象 5.2.原型与in操作 ...

  3. 苹果ios通过描述文件获取udid

    苹果ios通过描述文件获取udid 需要准备的东西 1,安装描述文件只支持https的回调地址,所以需要申请https域名 2,描述文件签名,不安装也可,只要能接受红色的字 步骤: 1,准备xml文件 ...

  4. 字符scanf 的输入注意

    1.注意scanf 不能有空格,如果有空格会将空格给输入进去 scanf("d "):---有空格 和scanf("d");--没有空格 有很大的区别

  5. javaSE高级篇1 — 异常与多线程基础

    1.异常的体系结构  注:Throwable是一个类,不是一个接口,这个类里面是描述的一些Error和Exception的共性,如图所示: 异常 / 错误是什么意思? 定义:指的是程序运行过程中,可能 ...

  6. 学习java的第二十五天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  7. A Child's History of England.36

    CHAPTER 11 ENGLAND UNDER MATILDA AND STEPHEN The King was no sooner dead than all the plans and sche ...

  8. ES6必知,变量的结构赋值。

    对象和数组时 Javascript 中最常用的两种数据结构,由于 JSON 数据格式的普及,二者已经成为 Javascript 语言中特别重要的一部分. 在编码过程中,我们经常定义许多对象和数组,然后 ...

  9. MediaPlayer详解

    [1]MediaPlayer 详细使用细则 [2]MediaPlayer使用详解_为新手准备 [3]MediaPlayer 概览

  10. Oracle——创建存储过程

    有个超级详细的关于存储过程的帖子:https://www.cnblogs.com/snowballed/p/6766867.html Oracle-存储过程(procedure.function.pa ...