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小时内删除。