list轉換成爲樹結構

  • 一個實體類,其中有parentid,通過parentid來展現出無限層級的關係
@Data
@TableName(value = "t_sb_menu")
public class TSbMenu implements Serializable
{
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value="")
    private Integer id;

    @TableField(value = "menuName")
    @ApiModelProperty(value="")
    private String menuname;

    /**
     * 0:頂級菜單
            其它:菜單主鍵

            目前僅兩級菜單
     */
    @TableField(value = "parentId")
    @ApiModelProperty(value="0:頂級菜單,            其它:菜單主鍵,            ,            目前僅兩級菜單")
    private Integer parentid;

    @TableField(value = "requestUrl")
    @ApiModelProperty(value = "")
    private String requesturl;

    @TableField(value = "imageUrl")
    @ApiModelProperty(value="")
    private String imageurl;

    @TableField(value = "sort")
    @ApiModelProperty(value = "")
    private Integer sort;

    @TableField(value = "status")
    @ApiModelProperty(value="")
    private Byte status;

    private static final long serialVersionUID = 1L;

    public static final String COL_ID = "id";

    public static final String COL_MENUNAME = "menuName";

    public static final String COL_PARENTID = "parentId";

    /**
     * 小寫的父節點
     */
    public static final String COL_PARENTID_LOWE = "parentid";

    public static final String COL_REQUESTURL = "requestUrl";

    public static final String COL_IMAGEURL = "imageUrl";

    public static final String COL_SORT = "sort";

    public static final String COL_STATUS = "status";
}
  • 從數據庫中查詢到的ArrayList對象集合

  • 準備工具類
    /**
     * 將指定的list轉換成爲樹結構的數據
     *
     * @param list     集合對象,每個對象都有用來表示上下級關係的屬性結構
     * @param id       集合中用來表示id列
     * @param parentid 集合對象中用來表示parentId的列
     * @param childs   父子級關係表現出來時,將會在父級節點內添加本屬性數組集合,並將自己點放置到本數組集合內
     * @param parentId 最頂級的id
     * @return 樹結構的 JSONArray 對象
     */
    public static JSONArray parseTree(List<?> list, String id, String parentid, String childs, Object parentId)
    {
        JSONArray obj = new JSONArray();
        for (Object object : list)
        {
            JSONObject tmepOjb = JSONObject.parseObject(JSON.toJSONString(object));
            Object menuId = tmepOjb.get(id);
            Object pid = tmepOjb.get(parentid);
            if (parentId.toString().equals(pid.toString()))
            {
                JSONArray c_node = parseTree(list, id, parentid, childs, menuId);
                tmepOjb.put(childs, c_node);
                obj.add(tmepOjb);
            }
        }
        return obj;
    }
  •  使用
// 菜單轉換成爲樹形結構
JSONArray array = CommonUtil.parseTree(menus, TSbMenu.COL_ID, TSbMenu.COL_PARENTID_LOWE, TSbMenuVo.COL_CHILDS, Constants.ZERO);

  • 上面已經成功的拿到了一個JSONArray的樹形結構對象了,但我們還可以將這個屬性結構對象轉換成爲java實體類,實體類裏面有個childs,泛型爲自己,如下
@Data
public class TSbMenuVo implements Serializable
{
    private Integer id;

    @ApiModelProperty(value = "菜單名")
    private String menuname;

    /**
     * 0:頂級菜單
     * 其它:菜單主鍵
     * <p>
     * 目前僅兩級菜單
     */
    @ApiModelProperty(value = "0:頂級菜單,            其它:菜單主鍵,            ,            目前僅兩級菜單")
    private Integer parentid;

    @ApiModelProperty(value = "菜單的請求地址")
    private String requesturl;

    @ApiModelProperty(value = "菜單image路徑")
    private String imageurl;

    @TableField(value = "sort")
    @ApiModelProperty(value = "排序")
    private Integer sort;

    /**
     * 菜單的子菜單
     */
    private List<TSbMenuVo> childs;

    @ApiModelProperty(value = "權限集合")
    private List<TSbPurview> purviews;

    public static final String COL_CHILDS = "childs";
  • JSONArray轉換成爲java無限層級代碼,使用fastjson
List<TSbMenuVo> menuVos = JSONArray.parseArray(array.toJSONString(), TSbMenuVo.class);

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