欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一篇文章教你轻松使用fastjson

程序员文章站 2022-06-11 16:50:44
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : "https://github.com/ZhongFuCheng3y/3y" 相信大家对他也不陌生了,前后端交互中常常就以 来进行 数据交换 。而有的时候,我们也会将 直接保存在数据库中。 可能就有人不太理解,为什么要 ......

前言

只有光头才能变强。

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

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

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

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

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

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

一篇文章教你轻松使用fastjson

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

一、fastjson入门

以下内容来源:https://github.com/alibaba/fastjson/wiki/quick-start-cn

它可以解析json格式的字符串,支持将java bean序列化为json字符串,也可以从json字符串反序列化到javabean

一篇文章教你轻松使用fastjson

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

一篇文章教你轻松使用fastjson

jsonarray和jsonobject继承json:

一篇文章教你轻松使用fastjson

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接口:

一篇文章教你轻松使用fastjson

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

  • getstring(string key)
  • remove(object key)

一篇文章教你轻松使用fastjson

2.3 jsonarray

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

一篇文章教你轻松使用fastjson

最常用的方法:

  • 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);


    }

反序列化结果:

一篇文章教你轻松使用fastjson

我们要改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);
}

序列化结果:

一篇文章教你轻松使用fastjson

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

最后

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

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

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

一篇文章教你轻松使用fastjson

非常感谢人才们能看到这里,如果这个文章写得还不错,觉得「三歪」我有点东西的话 求点赞 求关注️ 求分享