枚舉轉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()
    我們看源碼
    在這裏插入圖片描述
    如果你直接 new JSONObject(),默認是無參構造方法,中間ordered=false,則走的下面的邏輯,底層是用HashMap存儲數據的,HashMap是沒有順序的。
    比如



JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 1);
jsonObject.put("name", "張三");

其實沒有按照你put的順序去放的,結果見下文。

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

爲了解決該問題,所以我指定了底層數據結構要用LinkedHashMap存儲該json數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章