当前位置: 移动技术网 > IT编程>开发语言>Java > 一篇文章教你轻松使用fastjson

一篇文章教你轻松使用fastjson

2019年12月14日  | 移动技术网IT编程  | 我要评论

前言

只有光头才能变强。

文本已收录至我的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

说白了就是json和java对象互相转换

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:

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就没多大的区别(因为它底层实际上就是操作map),常用的方法:

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

jsonobject有常用的map方法

2.3 jsonarray

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

实现list接口

最常用的方法:

  • 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多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

转发到朋友圈是对我最大的支持!

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网