枚举转JSON或map或对象List

记录一下转换过程和遇到的问题,及解决办法。要转换成JSONObject或者map,是因为不想再新建个类,这个是临时方案。如果你要转成的是对象,就把中间的map那一步给改成你需要的类型就可以。

一、原始数据
枚举类

public enum TypeEnum {
     

    QUESTION(1, "问题"),

    ANSWER(2, "回答"),

    COMMENT(3, "评论"),

    NICK(4, "昵称");
    
    private final int value;

    private final String name;

    TypeEnum(int value, String name) {
     
        this.value = value;
        this.name = name;
    }
    
    public int getValue() {
     
        return value;
    }

    public String getName() {
     
        return name;
    }
}

二、目标数据

[
    {
     
        "id":1,
        "name":"问题"
    },
    {
     
        "id":2,
        "name":"回答"
    },
    {
     
        "id":3,
        "name":"评论"
    },
    {
     
        "id":4,
        "name":"昵称"
    }
]

三、实际转换代码

List<JSONObject> list = Stream.of(TypeEnum.values())
                .sorted(Comparator.comparing(TypeEnum::getType))
                .map(item -> new JSONObject(new LinkedHashMap())
                        .fluentPut("id", item.getType())
                        .fluentPut("name", item.getName()))
                .collect(Collectors.toList());
  1. 为什么要加排序 .sorted(Comparator.comparing(TypeEnum::getType))
    我想让输出的结果按照枚举的value值,升序。
    如果不加排序的话,出来的数据比较乱,结果有可能变成下面这种,不方便自己和前端查数据。
[{
     "id":1,"name":"问题"},{
     "id":4,"name":"昵称"},{
     "id":3,"name":"评论"},{
     "id":2,"name":"回答"}]
  1. 为什么要在new JSONObject() 时加 new LinkedHashMap()
    我们看源码
    枚举转JSON或map或对象List_第1张图片
    如果你直接 new JSONObject(),默认是无参构造方法,中间ordered=false,则走的下面的逻辑,底层是用HashMap存储数据的,HashMap是没有顺序的。
    比如
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("name", "张三");

其实没有按照你put的顺序去放的,结果见下文。

{
     
    "name":"张三",
    "id":1
}

为了解决该问题,所以我指定了底层数据结构要用LinkedHashMap存储该json数据

你可能感兴趣的:(java,java,枚举类,json)