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

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

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

一、初始Fastjson

1、环境搭建

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

<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>

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的用法,主要是在序列化/反序列化的过程中,主要体现在以下几个方面,

1、@JSONField用在字段上影响序列化/反序列化两个过程;

2、@JSONField用在setXXX、getXXX方法上,分别影响反序列化、序列化过程;

有不正指出,欢迎指正!

Fastjson妙用之@JSONField注解的更多相关文章

  1. fastjson的@JSONField注解的一点问题

    @JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...

  2. fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配

    一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...

  3. @JSONField 注解说明

    转自:https://blog.csdn.net/suyimin2010/article/details/80617538 导入@JSONField 注解: import com.alibaba.fa ...

  4. FastJson踩坑:@JsonField在反序列化时失效

    问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArray对象,用得到的 ...

  5. FastJson中@JSONField注解使用

    最近做项目中,使用了json格式在服务器之间进行数据传输.但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式. 思路: ...

  6. fastjson的@JSONField注解

    @JSONField作用:在字段和方法上1.Field:@JSONField作用在Field时,name可以定义输入key的名字,反序列化的时 值不会赋值到属性上2.作用在setter和getter方 ...

  7. @JSONField注解的使用

    FastJson中的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有下面三个: 修改和json字符串的字段映射[name] 格式化数据[format] 过滤掉不需要序列化的 ...

  8. fastJson注解@JSONField使用的一个实例

    1.实体类 package jsonArrayjsonObject.cn; import java.io.Serializable; import java.util.Date; import com ...

  9. 【源码分析】FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效

    出现的问题 我全局配置的时间格式是:yyyy-MM-dd HH:mm:ss @JSONField注解配置的时间格式是:yyyy-MM-dd 最终的返回结果是:yyyy-MM-dd HH:mm:ss 问 ...

随机推荐

  1. Visual Studio 6.0 在 Windows 10 下崩溃的一种解决方法

    Visual Studio 6.0 下载地址: https://winworldpc.com/product/microsoft-visual-stu/60 安装步骤: https://www.cod ...

  2. Mybatis里@InsertProvider、@UpdateProvider方法里使用if test标签

    例如: ··· insert into TEST1(<if test="base_id!=null and base_id!=''">base_id,</if&g ...

  3. HTML选择器的四种使用方法

    选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...

  4. Go语言之Goroutine与信道、异常处理

    一.Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆. Goroutine 会复用线程,比如 ...

  5. 测试开发【提测平台】分享12-掌握日期组件&列表状态格式化最终实现提测管理多条件搜索展示功能

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本章内容思维导图如下,由于需要各种状态下的菜单操作,所以需要先实现提测信息的列表基础页面,然后再推进其他需求开发 基本知识点学习 Date ...

  6. 自定义view---仪表盘--kotlin

    我们知道一个自定义view一般来说需要继承view或者viewGroup并实现onMeasure, onLayout, onDraw方法. 其中onMeasure用于测量计算该控件的宽高, onLay ...

  7. bash手册

    目录 bash手册 man命令 man man 分页程序(page) Linux手册页惯用的节名 Linux手册页的内容区域 查看命令在Linux手册页中的区域 info页面 help帮助 bash手 ...

  8. SpringBoot-thymeleaf-静态资源引入和接管

    引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...

  9. python json中的 dumps loads函数

    一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行js ...

  10. 微信小程序的发布流程

    一.背景 在中大型的公司里,人员的分工非常仔细,一般会有不同岗位角色的员工同时参与同一个小程序项目.为此,小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团队的协同工作 以往我们在开发 ...