百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Fastjson妙用之@JSONField注解(fastjson中jsonpath)

bigegpt 2025-03-24 14:15 11 浏览

在开发的过程中使用json格式的地方非常多,现在前后端分离的项目中,前后端数据交换的格式一般为json,这种格式的优/缺点这里不再赘述,感兴趣的可以百度。把java中的实体类序列化为json的方式也有很多方式,今天来看看常用到的fastjson。

都知道fastjson是阿里开源的一个序列化/反序列化的jar包,在日常的开发过程中经常会碰到,也是使用频率较高的一款工具。

这里要了解一个概念,那就是序列化/反序列化,序列化是把一个java对象转化为其他的形式,如json、XML、对象字节;反序列化则是把json、XML、对象字节转化为java对象。

一、初识Fastjson

1、环境搭建

要想使用fastjson,首先需要引入fastjson的包,我这里使用的是maven工具,所以这里只要在pom文件中添加相应的依赖即可,


    
        com.alibaba
        fastjson
        1.2.78
    

2、一个小例子

有一个实体类,

package com.atssg.test;


import lombok.Data;

@Data
public class Student {
    private Integer id;
    private String name;
    private String address;
    private String phoneNumber;

}

下面看测试方法

package com.atssg.test;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestFastJson {
    public static void main(String[] args) {
        Student student=new Student();
        student.setId(1);
        student.setName("tom");
        student.setAddress("beijing");
        student.setPhoneNumber("010-6668899");

        //把对象转化为json串
        String jsonString=JSON.toJSONString(student);
        log.info("student序列化为:{}",jsonString);
    }
}

下面看测试结果

22:22:41.657 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom","phoneNumber":"010-6668899"}

Process finished with exit code 0

从上面可以看到打印除了序列化为json的字符串,这里是一个序列化的过程,当然也可以把一个字符串反序列化为java对象。

二、@JSONField注解

在上面的例子中,student被序列化为一个json字符串,字符串是键值对的形式,键是Student的属性名。

现在有这样的一个需求,要返回给前端Student的json字符串,但不想给前端phoneNumber字段,你要怎么做那?一个比较容易想到的方式是从字符串中把这个属性去掉,或者重新生成一个不包含phoneNumber的实体对象。难道没有更好的方式么

在fastjson提供了@JSONField这样一个注解。

1、@JSONField(serialize = false)

@JSONField注解中有seaialize这样一个属性,看名称应该和序列化有关,尝试下看看效果,

package com.atssg.test;


import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class Student {
    private Integer id;
    private String name;
    private String address;
    @JSONField(serialize = false)
    private String phoneNumber;

}

再看上面的测试类的执行结果,

22:30:26.678 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"}

Process finished with exit code 0

可以看到轻轻松松phoneNumber不见了,也就是说@JSONField(serialize=false)起作用了,该属性不会参与序列化,反之,不加该注解或serialize的值设为true,则会参与序列化。

2、@JSONField(name= "XXX")

在和前端的交互过程中,可能存在这样的情况,java类中定义的字段的形式为驼峰,但前端需要的是以_连接的形式,要怎么做那,在@JSONField中有name属性,

package com.atssg.test;


import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class Student {
    private Integer id;
    private String name;
    private String address;
    @JSONField(name = "phone_number")
    private String phoneNumber;

}

在phoneNuber上注解@JSONField且name为phone_number,看测试结果,

21:47:48.766 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom","phone_number":"010-6668899"}

可以看到在序列化的json字符串中出现了phone_number,说明@JSONField起了作用,在序列化的时候指定序列化字段的名称,如果指定了使用指定的(@JSONField中name的值),如果不指定使用java类中属性的名字。

3、@JSONField注解

在上面,我们看了@JSONField的两种用法,还有很多用法,这里不一一列举,看下@JSONField这个注解的定义,

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.alibaba.fastjson.annotation;

import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface JSONField {
    int ordinal() default 0;

    String name() default "";

    String format() default "";

    boolean serialize() default true;

    boolean deserialize() default true;

    SerializerFeature[] serialzeFeatures() default {};

    Feature[] parseFeatures() default {};

    String label() default "";

    boolean jsonDirect() default false;

    Class serializeUsing() default Void.class;

    Class deserializeUsing() default Void.class;

    String[] alternateNames() default {};

    boolean unwrapped() default false;

    String defaultValue() default "";
}

在这个注解上使用了@Target注解标注,@Target中的值为{ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER},也就是说@JSONField可以标注在方法上、字段、参数上。在上面的例子中,我们把@JSONField用在了字段上,下面看使用在方法上的例子,在一个类中有getXXX/setXXX方法,看@JSONField用在getXXX/setXXX的用法。

package com.atssg.test;


import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

@Data
public class Student {
    private Integer id;
    private String name;
    private String address;

    private String phoneNumber;

    //getXXX方法用在序列化过程中
    @JSONField(serialize = false)
    public String getPhoneNumber() {
        return phoneNumber;
    }

    //setXXX方法用在反序列化过程中
    @JSONField(deserialize = false)
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

看测试结果

21:59:28.334 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"}

再来看反序列化的测试结果,测试类,

package com.atssg.test;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestFastJson {
    public static void main(String[] args) {
        Student student=new Student();
        student.setId(1);
        student.setName("tom");
        student.setAddress("beijing");
        student.setPhoneNumber("010-6668899");

        //把对象转化为json串
        String jsonString=JSON.toJSONString(student);
        log.info("student序列化为:{}",jsonString);
        //反序列化
        String str="{\"address\":\"beijing\",\"id\":1,\"name\":\"tom\",\"phoneNumber\":\"010-6668899\"}";
        Student stu=JSON.parseObject(str,Student.class);
        log.info("反序列化的结果:{}",stu);

    }
}

使用了含有phoneNumber的字符串,看反序列化的结果,

22:04:04.746 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"}
22:04:04.776 [main] INFO com.atssg.test.TestFastJson - 反序列化的结果:Student(id=1, name=tom, address=beijing, phoneNumber=null)

可以看到phoneNumber的值为null,证明该属性未取得反序列化的值,证明了@JSONField用在setXXX方法上起到了反序列化的控制作用。

三、总结

本文分享了fastjson中@JSONField的用法,主要是在序列化/反序列化的过程中,主要体现在以下几个方面,

  • @JSONField用在字段上影响序列化/反序列化两个过程;
  • @JSONField用在setXXX、getXXX方法上,分别影响反序列化、序列化过程;

相关推荐

Linux gron 命令使用详解(linux gminer)

简介gron是一个独特的命令行工具,用于将JSON数据转换为离散的、易于grep处理的赋值语句格式。它的名字来源于"grepableon"或"grepable...

【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linu

学习Linux并掌握Java环境配置及SpringBoot项目部署是一个系统化的过程,以下是从零开始的详细指南,帮助你逐步掌握这些技能。一、Linux基础入门1.安装Linux系统选择发行版:推荐...

Linux常用的shell命令汇总(linux中shell的作用)

本文介绍Linux系统下常用的系统级命令,包括软硬件查看、修改命令,有CPU、内存、硬盘、网络、系统管理等命令。说明命令是在Centos6.464位的虚拟机系统进行测试的。本文介绍的命令都会在此C...

零成本搭建个人加密文件保险柜(适用于 Win11 和 Linux)

不依赖收费软件操作简单,小白也能跟着做支持双系统,跨平台使用实现数据加密、防删除、防泄露内容通俗无技术门槛,秒懂秒用使用工具简介我们将使用两个核心工具:工具名用途系统支持Veracrypt创建加密虚...

如何在 Linux 中使用 Gzip 命令?(linux怎么用gzip命令)

gzip(GNUzip)是Linux系统中一个开源的压缩工具,用于压缩和解压缩文件。它基于DEFLATE算法,广泛应用于文件压缩、备份和数据传输。gzip生成的文件通常带有.gz后缀,压缩效率...

Linux 必备的20个核心知识点(linux内核知识点)

学习和使用Linux所必备的20个核心知识点。这些知识点涵盖了从基础操作到系统管理和网络概念,是构建扎实Linux技能的基础。Linux必备的20个知识点1.Linux文件系统层级标...

谷歌 ChromeOS 已支持 7z、iso、tar 文件格式

IT之家6月21日消息,谷歌ChromeOS在管理文件方面进行了改进,新增了对7z、iso和tar等格式的支持。从5月的ChromeOS101更新开始,ChromeOS...

如何在 Linux 中提取 Tar Bz2 文件?

在深入解压方法之前,我们先来了解.tar.bz2文件的本质。.tar.bz2是一种组合文件格式,包含两个步骤:Tar(TapeArchive):tar是一种归档工具,用于将多个文件或目录打包...

如何在 CentOS 7/8 上安装 Kitematic Docker 管理器

Kitematic是一款流行的Docker图形界面管理平台,适用于Ubuntu、macOS和Windows操作系统。然而,其他发行版(如CentOS、OpenSUSE、Fedora、R...

Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!

之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...

爬虫搞崩网站后,程序员自制“Zip炸弹”反击,6刀服务器成功扛住4.6万请求

在这个爬虫横行的时代,越来越多开发者深受其害:有人怒斥OpenAI的爬虫疯狂“偷”数据,7人团队十年心血的网站一夜崩溃;也有人被爬虫逼到极限,最后只好封掉整个巴西的访问才勉强止血。但本文作者却走...

Ubuntu 操作系统常用命令详解(ubuntu必学的60个命令)

UbuntuLinux是一款流行的开源操作系统,广泛应用于服务器、开发、学习等场景。命令行是Ubuntu的灵魂,也是高效、稳定管理系统的利器。本文按照各大常用领域,详细总结Ubuntu必学...

Linux面板8.0.54 测试版-已上线(linux主机面板)

Linux面板8.0.54测试版【增加】[网站]Java项目新增刷新列表按钮【增加】[网站]PHP项目-Apache-服务新增守护进程功能【增加】[网站]Python项目创建/删除网站时新增同时创建...

开源三剑客——构建私有云世界的基石

公共云原生的浪潮正在席卷这个世界,亚马逊AWS、谷歌GCP和微软的Azure年收入增长超过了30%,越来越多的公司和个人开始将自己的服务部署到云环境中,大型数据中心的规模经济带来了成本的降低,可以在保...

2.2k star,一款业界领先的私有云+在线文档管理系统

简介kodbox可道云(原KodExplorer)是业内领先的企业私有云和在线文档管理系统,为个人网站、企业私有云部署、网络存储、在线文档管理、在线办公等提供安全可控,简便易用、可高度定制的私有云产品...