记录一下转换过程和遇到的问题,及解决办法。要转换成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());
- 为什么要加排序 .sorted(Comparator.comparing(TypeEnum::getType))
我想让输出的结果按照枚举的value值,升序。
如果不加排序的话,出来的数据比较乱,结果有可能变成下面这种,不方便自己和前端查数据。
[{
"id":1,"name":"问题"},{
"id":4,"name":"昵称"},{
"id":3,"name":"评论"},{
"id":2,"name":"回答"}]
- 为什么要在new JSONObject() 时加 new LinkedHashMap()
我们看源码
如果你直接 new JSONObject(),默认是无参构造方法,中间ordered=false,则走的下面的逻辑,底层是用HashMap存储数据的,HashMap是没有顺序的。
比如
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("name", "张三");
其实没有按照你put的顺序去放的,结果见下文。
{
"name":"张三",
"id":1
}
为了解决该问题,所以我指定了底层数据结构要用LinkedHashMap存储该json数据