在开发的过程中使用json格式的地方非常多,现在前后端分离的项目中,前后端数据交换的格式一般为json,这种格式的优缺点这里不再赘述,感兴趣的可以百度。把java中的实体类序列化为json的方式也有很多方式,今天来看看常用到的fastjson。 都知道fastjson是阿里开源的一个序列化反序列化的jar包,在日常的开发过程中经常会碰到,也是使用频率较高的一款工具。 这里要了解一个概念,那就是序列化反序列化,序列化是把一个java对象转化为其他的形式,如json、XML、对象字节;反序列化则是把json、XML、对象字节转化为java对象。一、初识Fastjson1、环境搭建 要想使用fastjson,首先需要引入fastjson的包,我这里使用的是maven工具,所以这里只要在pom文件中添加相应的依赖即可,!fastjsondependencygroupIdcom。alibabagroupIdfastjsonartifactIdversion1。2。78versiondependency2、一个小例子 有一个实体类,packagecom。atssg。test;importlombok。Data;DatapublicclassStudent{privateIntegerid;privateStringname;privateStringaddress;privateStringphoneNumber;} 下面看测试方法packagecom。atssg。test;importcom。alibaba。fastjson。JSON;importlombok。extern。slf4j。Slf4j;Slf4jpublicclassTestFastJson{publicstaticvoidmain(String〔〕args){StudentstudentnewStudent();student。setId(1);student。setName(tom);student。setAddress(beijing);student。setPhoneNumber(0106668899);把对象转化为json串StringjsonStringJSON。toJSONString(student);log。info(student序列化为:{},jsonString);}} 下面看测试结果22:22:41。657〔main〕INFOcom。atssg。test。TestFastJsonstudent序列化为:{address:beijing,id:1,name:tom,phoneNumber:0106668899}Processfinishedwithexitcode0 从上面可以看到打印除了序列化为json的字符串,这里是一个序列化的过程,当然也可以把一个字符串反序列化为java对象。二、JSONField注解 在上面的例子中,student被序列化为一个json字符串,字符串是键值对的形式,键是Student的属性名。 现在有这样的一个需求,要返回给前端Student的json字符串,但不想给前端phoneNumber字段,你要怎么做那?一个比较容易想到的方式是从字符串中把这个属性去掉,或者重新生成一个不包含phoneNumber的实体对象。难道没有更好的方式么 在fastjson提供了JSONField这样一个注解。1、JSONField(serializefalse) JSONField注解中有seaialize这样一个属性,看名称应该和序列化有关,尝试下看看效果,packagecom。atssg。test;importcom。alibaba。fastjson。annotation。JSONField;importlombok。Data;DatapublicclassStudent{privateIntegerid;privateStringname;privateStringaddress;JSONField(serializefalse)privateStringphoneNumber;} 再看上面的测试类的执行结果,22:30:26。678〔main〕INFOcom。atssg。test。TestFastJsonstudent序列化为:{address:beijing,id:1,name:tom}Processfinishedwithexitcode0 可以看到轻轻松松phoneNumber不见了,也就是说JSONField(serializefalse)起作用了,该属性不会参与序列化,反之,不加该注解或serialize的值设为true,则会参与序列化。2、JSONField(nameXXX) 在和前端的交互过程中,可能存在这样的情况,java类中定义的字段的形式为驼峰,但前端需要的是以连接的形式,要怎么做那,在JSONField中有name属性,packagecom。atssg。test;importcom。alibaba。fastjson。annotation。JSONField;importlombok。Data;DatapublicclassStudent{privateIntegerid;privateStringname;privateStringaddress;JSONField(namephonenumber)privateStringphoneNumber;} 在phoneNuber上注解JSONField且name为phonenumber,看测试结果,21:47:48。766〔main〕INFOcom。atssg。test。TestFastJsonstudent序列化为:{address:beijing,id:1,name:tom,phonenumber:0106668899} 可以看到在序列化的json字符串中出现了phonenumber,说明JSONField起了作用,在序列化的时候指定序列化字段的名称,如果指定了使用指定的(JSONField中name的值),如果不指定使用java类中属性的名字。3、JSONField注解 在上面,我们看了JSONField的两种用法,还有很多用法,这里不一一列举,看下JSONField这个注解的定义,Sourcecoderecreatedfroma。classfilebyIntelliJIDEA(poweredbyFernFlowerdecompiler)packagecom。alibaba。fastjson。annotation;importcom。alibaba。fastjson。parser。Feature;importcom。alibaba。fastjson。serializer。SerializerFeature;importjava。lang。annotation。ElementType;importjava。lang。annotation。Retention;importjava。lang。annotation。RetentionPolicy;importjava。lang。annotation。Target;Retention(RetentionPolicy。RUNTIME)Target({ElementType。METHOD,ElementType。FIELD,ElementType。PARAMETER})publicinterfaceJSONField{intordinal()default0;Stringname()default;Stringformat()default;booleanserialize()defaulttrue;booleandeserialize()defaulttrue;SerializerFeature〔〕serialzeFeatures()default{};Feature〔〕parseFeatures()default{};Stringlabel()default;booleanjsonDirect()defaultfalse;Classlt;?serializeUsing()defaultVoid。class;Classlt;?deserializeUsing()defaultVoid。class;String〔〕alternateNames()default{};booleanunwrapped()defaultfalse;StringdefaultValue()default;} 在这个注解上使用了Target注解标注,Target中的值为{ElementType。METHOD,ElementType。FIELD,ElementType。PARAMETER},也就是说JSONField可以标注在方法上、字段、参数上。在上面的例子中,我们把JSONField用在了字段上,下面看使用在方法上的例子,在一个类中有getXXXsetXXX方法,看JSONField用在getXXXsetXXX的用法。packagecom。atssg。test;importcom。alibaba。fastjson。annotation。JSONField;importlombok。Data;DatapublicclassStudent{privateIntegerid;privateStringname;privateStringaddress;privateStringphoneNumber;getXXX方法用在序列化过程中JSONField(serializefalse)publicStringgetPhoneNumber(){returnphoneNumber;}setXXX方法用在反序列化过程中JSONField(deserializefalse)publicvoidsetPhoneNumber(StringphoneNumber){this。phoneNumberphoneNumber;}} 看测试结果21:59:28。334〔main〕INFOcom。atssg。test。TestFastJsonstudent序列化为:{address:beijing,id:1,name:tom} 再来看反序列化的测试结果,测试类,packagecom。atssg。test;importcom。alibaba。fastjson。JSON;importlombok。extern。slf4j。Slf4j;Slf4jpublicclassTestFastJson{publicstaticvoidmain(String〔〕args){StudentstudentnewStudent();student。setId(1);student。setName(tom);student。setAddress(beijing);student。setPhoneNumber(0106668899);把对象转化为json串StringjsonStringJSON。toJSONString(student);log。info(student序列化为:{},jsonString);反序列化Stringstr{address:beijing,id:1,name:tom,phoneNumber:0106668899};StudentstuJSON。parseObject(str,Student。class);log。info(反序列化的结果:{},stu);}} 使用了含有phoneNumber的字符串,看反序列化的结果,22:04:04。746〔main〕INFOcom。atssg。test。TestFastJsonstudent序列化为:{address:beijing,id:1,name:tom}22:04:04。776〔main〕INFOcom。atssg。test。TestFastJson反序列化的结果:Student(id1,nametom,addressbeijing,phoneNumbernull) 可以看到phoneNumber的值为null,证明该属性未取得反序列化的值,证明了JSONField用在setXXX方法上起到了反序列化的控制作用。三、总结 本文分享了fastjson中JSONField的用法,主要是在序列化反序列化的过程中,主要体现在以下几个方面,JSONField用在字段上影响序列化反序列化两个过程;JSONField用在setXXX、getXXX方法上,分别影响反序列化、序列化过程;