Fork me on GitHub

实体对象转成字段排列有序的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)。

 

posted @   龙凌云端  阅读(3781)  评论(2编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-06-30 TcpDiscoveryZookeeperIpFinder maven pom 引用
2020-06-30 Grafana & Prometheus 配置
2020-06-30 Grafana 安装部署
2020-06-30 Prometheus 安装部署
2019-06-30 docker run 和 docker exec 的差异
2019-06-30 Git 分支管理
2019-06-30 Kubernetes 中文文档
点击右上角即可分享
微信分享提示