实体对象转成字段排列有序的JSON字符串


实体对象转成字段排列有序的JSON字符串


 

一、背景说明

有一些场景,需要将实体对象中的字段有序地转成JSON字符串。

使用fastjson转换后,默认是按照字段首字母升序排序的,并不会按照实体中字段定义的顺序进行排序。

效果如下:

 

1、创建英雄类

package com.miracle.luna.sorted; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** * @author Miracle Luna * @date 2021/6/30 */ @Data @NoArgsConstructor @AllArgsConstructor @ToString public class Hero { private String name;     // 姓名
    private String gender;   // 性别
    private String career;   // 职业
}

其中,类上添加了 lombok 的注解,可以减少在类中写getter、setter、无参构造、全参构造 和 toString 等方法。

可以使代码看着简洁很多。

 

2、实体转换成JSON字符串

package com.miracle.luna.sorted; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.List; /** * @author Miracle Luna * @date 2021/6/30 */
public class EntityToJSONString { public static void main(String[] args) { List<Hero> heroList = new ArrayList<>(); heroList.add(new Hero("李白", "男", "刺客")); heroList.add(new Hero("典韦", "男", "战士")); heroList.add(new Hero("甄姬", "女", "法师")); heroList.add(new Hero("伽罗", "女", "射手")); heroList.add(new Hero("白起", "男", "坦克")); heroList.add(new Hero("庄周", "男", "辅助")); heroList.forEach(hero -> System.out.println(JSONObject.toJSONString(hero))); } }

 

执行结果如下:

{"career":"刺客","gender":"男","name":"李白"} {"career":"战士","gender":"男","name":"典韦"} {"career":"法师","gender":"女","name":"甄姬"} {"career":"射手","gender":"女","name":"伽罗"} {"career":"坦克","gender":"男","name":"白起"} {"career":"辅助","gender":"男","name":"庄周"}

可以直观地看到,转换后的JSON字符串是按照字段的首字母进行了排序(career --> gender --> name),

并没有按照实体中字段的定义顺序进行排序(name--> gender --> career)。

 

二、实现方案

在定义实体的每个字段上,添加fastjson的 注解 @JSONField(ordinal = X)

其中,X 表示个人希望该字段在转为JSON字段串时所在的位置。

package com.miracle.luna.sorted; import com.alibaba.fastjson.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** * @author Miracle Luna * @date 2021/6/30 */ @Data @NoArgsConstructor @AllArgsConstructor @ToString public class Hero { @JSONField(ordinal = 1) private String name;     // 姓名
 @JSONField(ordinal = 2) private String gender;   // 性别
 @JSONField(ordinal = 3) private String career;   // 职业
}

 

再次执行测试类,运行结果如下:

{"name":"李白","gender":"男","career":"刺客"} {"name":"典韦","gender":"男","career":"战士"} {"name":"甄姬","gender":"女","career":"法师"} {"name":"伽罗","gender":"女","career":"射手"} {"name":"白起","gender":"男","career":"坦克"} {"name":"庄周","gender":"男","career":"辅助"}

可以看到和我们预期的效果一致,是按照实体中字段的设置顺序进行排序的(name--> gender --> career)。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM