一篇文章教你轻松使用fastjson

前言

只有光头才能变强。

文本已收录至我的GitHub精选文章,欢迎Starhttps://github.com/ZhongFuCheng3y/3y

JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的时候,我们也会将JSON直接保存在数据库中。

可能就有人不太理解,为什么要将JSON保存在关系型数据库中?

我在最开始的时候也有类似的疑惑,问了几个同事,得出的结论都差不多:方便扩展,如果那些字段不需要用到索引,改动比较频繁,你又不想改动表的结构,那就可以在数据库中存入JSON

虽说存JSON会方便扩展,但如果你的MySQL版本还是相对较低的话,想要用SQL查JSON里某个属性,还是比较麻烦的。

并且从数据库里边取出来也仅仅是一个String,而想要操作JSON里边的属性,自己写不太方便,所以就有fastjson给我们去用。

这篇文章简单讲讲fastjson的使用,希望对大家有帮助。如果有帮助,给我点个赞呀!

一、fastjson入门

以下内容来源:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean

fastjson优点:速度快、使用广泛、使用简单、功能完备、测试完备(之前爆了很多漏洞,现在我司走发布流程都强制我们升级fastjson版本了),现在使用fastjson至少升级到1.2.60版本

速度快的原因:

1、自行编写类似StringBuilder的工具类SerializeWriter。

2、使用ThreadLocal来缓存buf。

3、使用asm避免反射

4、集成jdk实现的一些优化算法

二、使用fastjson

首先我们在pom文件中引入fastjson的依赖就好了:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>x.x.x</version>
</dependency>

fastjson的使用主要是三个对象:

  • JSON
  • JSONObject
  • JSONArray

JSONArray和JSONObject继承JSON:

2.1 JSON对象

JSON这个类主要用于转换

  • 将Java对象序列化为JSON字符串
  • 将JSON字符串反序列化为Java对象

所以,有三个方法我们用得特别多:

  • parseObject(String text, Class<T> clazz)
  • parseArray(String text, Class<T> clazz)
  • toJSONString(Object object)

2.2 JSONObject

JSON对象(JSONObject)中的数据都是以key-value形式出现,所以它实现了Map接口:

使用起来也很简单,跟使用Map就没多大的区别(因为它底层实际上就是操作Map),常用的方法:

  • getString(String key)
  • remove(Object key)

2.3 JSONArray

JSONArray则是JSON数组,JSON数组对象中存储的是一个个JSON对象,所以类中的方法主要用于直接操作JSON对象

最常用的方法:

  • getJSONObject(int index)

## 三、实战

从上面的简单介绍我们已经可以知道了:

  • JSON用于将字符串反序列化为JavaBean和JavaBean序列化为JSON
  • JSONObject代表的是JSON对象,底层通过Map来操作,常用getString等方法来获取对应的值
  • JSONArray代表的是JSON对象数组,底层实际上是List,它用作于操作JSON对象

一般来说,我们从数据库拿到JSON数据以后,然后要对JSON进行修改。比如JSON串如下:

{
    "formId": "{$formId}",
    "link": "www.java3y.com",
    "text": [{
        "name": "java3y",
        "label": "3y",
        "value": {
            "value": "{$tureName}",
            "color": "",
            "emphasis": ""
        }
    }, {
        "name": "java4y",
        "label": "3y",
        "value": {
            "value": "{$title}",
            "color": "",
            "emphasis": ""
        }
    }, {
        "name": "java5y",
        "label": "5y",
        "value": {
            "value": "关注我的公众号,更多干货",
            "color": "#ff0040",
            "emphasis": ""
        }
    }],
    "yyyImg": "",
    "yyyAge": "",
    "pagepath": ""
}

我们是不会直接操作JSON的,我们会将JSON转成我们自己的JavaBean,再操作JavaBean,最后序列化为JSONString

从上面的JSON结构上来看还是相对复杂的,思路:

  • 我们可以根据JSON的结构构建对应的JavaBean
  • 使用JSON类将JSON字符串反序列化为JavaBean
  • 修改JavaBean的值
  • 最后将JavaBean序列化为JSON字符串

从上面的JSON结构,首先我们针对text这层抽象为一个JavaBean。(实际上最里层的结构是value,但我这边不需要处理value,所以就不抽象了)

/**
 * "name": "java3y",
 *  "label": "3y",
 *  "value": {
 *      "value": "{$tureName}",
 *      "color": "",
 *      "emphasis": ""
 *    }
 *
 *  对Text进行抽象
 */
public class TextInfo {

    private String name;
    private String label;

    // 因为value我这边不需要操作,所以就不抽象了,如果每层都要处理,那就得抽象
    private Object value;

    // set get ... 省略 欢迎关注我的公众号:Javay

}

然后对外层进行抽象:

public class ContentValue {
    private String formId;
    private String link;
    // 这里是一个数组,我们就抽象为List,属性名为text
    private List<TextInfo> text;

    private String yyyImg;
    private String yyyAge;
    private String pagepath;

    // set get ... 省略 欢迎关注我的公众号:Javay

}

我们反序列化看一下:

public static void main(String[] args) {

    // JSON 字符串
    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"关注我的公众号,更多干货\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";

    // 使用JSON对象 将JSON字符串反序列化为JavaBean
    ContentValue contentValue = JSON.parse(s, ContentValue.class);
    System.out.println(contentValue);

    }

反序列化结果:

我们要改text里边的值,只需要操作JavaBean就好了:

public static void main(String[] args) {

    // JSON 字符串
    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"关注我的公众号,更多干货\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";

    // 使用JSON对象 将JSON字符串反序列化为JavaBean
    ContentValue contentValue = JSON.parse(s, ContentValue.class);
    List<TextInfo> text = contentValue.getText();
    for (TextInfo textInfo : text) {
        textInfo.setName("Java3y");
        textInfo.setLabel("关注我的公众号呗");
    }

    // 修改后,反序列化回去
    String content = JSON.toJSONString(contentValue);
}

序列化结果:

轻松将JSON字符串里边的字段改掉。

最后

总的来说,fastjson还是足够方便好用的,它的速度也很快,只是最近漏洞有点多。

本已收录至我的GitHub精选文章,欢迎Starhttps://github.com/ZhongFuCheng3y/3y

乐于输出干货的Java技术公众号:Java3y。公众号内有300多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

非常感谢人才们能看到这里,如果这个文章写得还不错,觉得「三歪」我有点东西的话 求点赞 求关注? 求分享?? 求留言?? 对暖男我来说真的 非常有用!!!

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

原文地址:https://www.cnblogs.com/Java3y/p/12036772.html

时间: 2024-11-08 03:02:43

一篇文章教你轻松使用fastjson的相关文章

一篇文章教你轻松安装hadoop(第2篇)

如果你看了我的上一篇文章,那此时你对hadoop已经有了一个大概的了解,那接下来这篇文章就教大家怎么安装hadoop环境,只要你用心,仔细的跟着文章中讲到的做,肯定能正确安装.     第三章 安装hadoop环境 由于大家在学习hadoop时候,主要以Hadoop 1.0环境为主学习就可以,所以这主要介绍如何搭建Hadoop 1.0分布式环境. 整个分布式环境运行在带有linux操作系统的虚拟机上,至于虚拟机和linux系统的安装这里暂不做过多介绍. 安装Hadoop分布式环境: 1) 下载H

一篇文章教你如何用 Redis 轻松实现秒杀系统的构思

用 Redis 轻松实现秒杀系统的构思 前言: 秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: **1. 写入内存而不是写入硬盘. 异步处理而不是同步处理. 分布式处理**用上这三招,不论秒杀时负载多大,都能轻松应对.更好的是,Redis能够满足上述三点.因此,用Redis就能轻松实现秒杀系统. 用我这个方案,无论是电商平台特价秒杀,12306火车票秒杀,都不是事:) 下面介绍一下为什么上述三种性能优化思路能够解决秒杀系统的性能问题: 写入内存而

一篇文章教你读懂Makefile

makefile很重要      什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefil

一篇文章教你学会基础的HTML

html是学习做网页的基础,漂亮的网页与布局就是由有些html代码组成,大家看完这篇文章就可以简单的了解html了,多写多练 如果你不致力于成为美工的话,那么作为开发人员,可以读懂HTML.必要时能进行简单修改即可.下面跟着我的思路,保证一篇文让你看懂HTML,当然,再看的过程中,最好自己动手试试,这样理解就更深了.Ok,下面开始:(下面的符号均为英文状态下输入) 1.  html基本规则 <html> <head> <title>我的网页</title>

一篇文章教你如何设计一个百万级的消息推送系统

前言 先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互. 最主要的工作就是要有一个系统来支持设备的接入.向设备推送消息:同时还得满足大量设备接入的需求. 所以本次分享的内容不但可以满足物联网领域同时还支持以下场景: 基于 WEB 的聊天系统(点对点.群聊). WEB 应用中需求服务端推送的场景. 基于 SDK 的消息推送平台. 技术选型 要满足大量的连接数.同时支持双全工通信,并且性能也得有保障. 在 Java 技术栈中进行选型首先自然是排除掉了传统 IO

Android:学习AIDL,这一篇文章就够了(上)

前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说--你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓--那样就很尴尬了.不过又转念一想,我辈年轻人自当有一种一往无前的锐气,标题大气一点岂不更好?并且大家都是文明人,总归更多的是理解与补充而不是侮辱与谩骂?所以最终还是厚颜用了这么一个不怎么有耻的标题. 好了,接下来进入正题,谈谈我对AIDL的理解和认识. 正文 1,概述 AIDL是一个缩写,全称是Android Interface D

我要写一篇文章吗?

我们都有这样的经历:刚学了一个很酷的知识点,或在项目开发中填了一个坑,或做完一项目有了一些心得体会,这时你想写篇文章和其他人分享一下,但还未动笔,心中可能就会闪现这样的想法: 我的文章能够吸引别人来看吗?我写的文章对其他人会有实际的帮助吗?我得花多少时间才能把一篇文章写完啊?哎,算了,我的文笔太烂了. 是的,任何阻止你写文章的想法可能是对的,也可能是错的.但是,我写这篇文章就是要告诉你,无任怎样你都应该把这篇文章写下来. 虽然我的写作经验非常有限,只写过一些技术博文,至今我自己在写新的文章之前还

一篇文章学会docker

一篇文章学会docker docker安装 docker在线安装 1.更新yum到最新 yum update 2.卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine 3.安装需要的软件

百度百家号“漏洞”大曝光 一篇文章十几万阅读量 收入上万

越来越发现自媒体的好处,就是现在太多的平台都提供入口,基本是四大门户还有三大巨头互联网公司,百度.腾讯 .阿里都提供!那么接下来我要分享的是中国最大的搜索引擎公司-百度!,相信最近很多人都知道百度百家号,并且是百度大力的推广. 我看到之后毫不犹豫的,就是注册一个账号,这个等审核的过程真是酸甜苦辣一样的煎熬,不过还好.终于审核通过!一开始的话!发布很多文章都没有什么阅读量,都没有什么访问量!经过一番死磕研究之后发现,找文章的素材是最关键的地方,素材找的好,那么阅读量就会上来:再说了,我也不是那么好