转载

一篇文章教你轻松使用fastjson

只有光头才能变强。

文本已收录至我的GitHub精选文章,欢迎Star: github.com/ZhongFuChen…

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

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

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

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

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

一篇文章教你轻松使用fastjson

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

一、fastjson入门

以下内容来源: github.com/alibaba/fas…

它可以解析 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)

三、实战

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

getString

一般来说,我们从数据库拿到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
JSON
JavaBean

从上面的 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精选文章,欢迎Star: github.com/ZhongFuChen…

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

一篇文章教你轻松使用fastjson

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

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

原文  https://juejin.im/post/5df2ecdaf265da33c7550328
正文到此结束
Loading...