fastjson-对象转json 字符串时使⽤@JSONType 注解指定对象字段的顺序⼀、简单例⼦
依赖:
源码:
输出结果:
{“age”:“12”,“atext”:“程序员”,“userName”:“01junjie”}
从结果上看,我们的程序正常输出,但是字段却出现了乱序,某些时候,我们需要指定顺序,我们可以将上述注释的注解@JSONType放开。 <dependency > <groupId >com.alibaba </groupId > <artifactId >fastjson </artifactId > <version >1.2.72</version > </dependency >1
2
3
4
5package ;import JSONObject ;import JSONType ;import AllArgsConstructor ;import Builder ;import
Data ;import NoArgsConstructor ;public class Test { public static void main (String [] args ) { User user = User .builder ().userName ("01junjie").age ("12").atext ("程序员").build ();// JSONObject jsonObject = new JSONObject(true);// jsonObject.put("User",user);// String s = JSONString(); String s = JSONObject .toJSONString (user ); System .out .println (s ); } @Data @AllArgsConstructor @NoArgsConstructor @Builder // @JSONType(orders = {"userName","age","atext"},ignores = {"age"}) static class User { String userName ; String age ; String atext ; }}
1
2
3
4
5
6
7
json转换对象8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
输出结果:
{“userName”:“01junjie”,“atext”:“程序员”}
这⾏代码的作⽤是,指定了字段的固定顺序,以及要排除的字段。
⼆、@JSONType 简单介绍 package ;import JSONObject ;import JSONType ;import AllArgsConstructor ;import Builder ;import Data ;import NoArgsConstructor ;public class Test { public static void main (String [] args ) { User user = User .builder ().userName ("01junjie").age ("12").atext ("程序员").build ();// JSONObject jsonObject = new JSONObject(true);// jsonObj
ect.put("User",user);// String s = JSONString(); String s = JSONObject .toJSONString (user ); System .out .println (s ); } @Data @AllArgsConstructor @NoArgsConstructor @Builder @JSONType(orders = {"userName","age","atext"},ignores = {"age"}) static class User { String userName ; String age ; String atext ; }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 @JSONType(orders = {"userName","age","atext"},ignores = {"age"})
1
这是该注解的部分源码,这⼏个属性已经基本够⽤了,简单介绍⼀下作⽤:
orders:⽣成json时,指定字段按顺序排序
includes:⽣成json时,指定包含的字段
ignores:⽣成json时,指定忽略的字段
三、@JSONType 源码解析
若上述已经解决你的问题了,赶时间的,就可以不⽤往下看了,下⾯进⼊正题。
3.1 看源码的原因
由于业务需求,需要对java对象转json后,指定字段的固定顺序。
提前说明⼀下,本⼈在今天之前,是不曾知道fastjson这个依赖有这个注解的,更不知道该注解的存在及作⽤,所以起初⼀直百度都没有到有@JSONType相关的解决⽅案(显然,就是我的描述问题,没描述到点⼦上),这也就映射出⼀个问题,许多⼯具也许帮你实现了很多功能,但你不知道也不懂使⽤,以⾄于百度也由于你的问题描述偏差,导致总与答案失之交臂。
这个时候该这么办,答案就是看源码。
3.2 分析源码的流程
3.2.1 本⼈的代码
3.2.2 toJSONString 就是我们的⼊⼝
我们追溯到底后可以看到,最终都会调⽤下⾯这个接⼝的⽅法:@Retention(RetentionPolicy .RUNTIME )@Target({ ElementType .TYPE })public @interface JSONType { boolean asm () default true ; String [] orders () default {}; /** * @since 1.2.6 */ String [] includes () default {}; String [] ignores () default {}; 、、、、 、、、、}
1
2
3
4
5
6
7
89
10
11
12
13
14
15
16
17
18 public static void main (String [] args ) { User user = User .builder ().userName ("01junjie").age ("12").atext ("程序员").build ();// JSONObject jsonObject = new JSONObject();// jsonObject.put("User",user);// String s = JSONString(); String s = JSONObject .toJSONString (user ); System .out .println (s ); }
1
2
3
4
5
6
7
8
9
⽽这个接⼝有许多实现类,因此我们⽆法知道我们的程序运⾏了哪个实现类的实现⽅法,于是我们回退上⼀步调⽤该⽅法的的⼊⼝:public interface ObjectSerializer { void write (JSONSerializer serializer , // Object object , // Object fieldName , // Type fieldType , // int features ) throws IOException ;}
1
2
3
4
5
6
7
8 public final void write (Object object ) { if (object == null ) { out .writeNull (); r
eturn ; } Class <?> clazz = object .getClass (); ObjectSerializer writer = getObjectWriter (clazz ); try { writer .write (this , object , null , null , 0); } catch (IOException e ) { throw new JSONException (e .getMessage (), e ); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ObjectSerializer writer = getObjectWriter(clazz);这⾏代码,便是获取⼀个Serializer,我们可以打上断点,看⼀下获取到的是哪个实现类,如下:
此种分析源码的⽅式很常⽤,从这⾥可以看到,该⾏代码可以根据我们的java对象创建出⼀个专属的Serializer。(如何创建的,不需要追究,不重要)
到了这⾥,我们已经能确定了,将我们的user对象转换为json字符串的主要实现类是JavaBeanSerializer
3.2.3 进⼊JavaBeanSerializer
在分析JavaBeanSerializer之前,我们先要明确⾃⼰的需求和⽬标:
1、为啥user的字段会出现乱序?
我们要到⽅法中将这些字段转被换成字符串的代码位置,再⼀层层往上。
先看该类实现的write:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论