記錄一下轉換過程和遇到的問題,及解決辦法。要轉換成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數據