复杂嵌套 JSON转 markdown 列表

package com.lyr.easymybatis.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @Author lyr
 * @create 2020/12/16 23:13
 */
public class MarkdownUtil {
    
    
    private static void json2MarkdownList(StringBuilder output,Object obj,int stack,String key) {
    
    
        if (obj instanceof Collection) {
    
    
            //数组类型
            output.append(pre(stack));
            //嵌套json类型
            output.append(formatName(key,"list",stack));
            output.append(endl());
            // for(Object nested: (Collection)obj) {
    
    
                if (((Collection) obj).size()>0) {
    
    
                    json2MarkdownList(output, ((List)obj).get(0),stack+1,"[+]");
                }
            // }
        }else if (obj instanceof Map) {
    
    
            output.append(pre(stack));
            //嵌套json类型
            output.append(formatName(key,"Object",stack));
            output.append(endl());
            ((Map) obj).forEach((k,v) -> {
    
    
                json2MarkdownList(output, v, stack+1,k.toString());
            });
        }else{
    
    
            //单值类型
            output.append(pre(stack));
            String type = "number";
            if (obj instanceof String) type = "String";
            output.append(formatName(key,type,stack));

            output.append(endl());
        }

    }

    private static String formatName(String key,String type,int stack) {
    
    
        return key+"   【 type= "+type+" ,required = true , value = "+key +" 】";
    }
    private static String endl() {
    
    
        return "\r\n";
    }
    private static String pre(int stack) {
    
    
        if (stack<=0) return "- ";
        int len = (stack)*4;
        StringBuilder s = new StringBuilder();
        for (int i=0;i<len;++i) s.append(" ");
        s.append("- ");
        return s.toString();
    }

    public static String json2MarkdownList(String json) {
    
    
        JSONObject jsn = JSON.parseObject(json);
        StringBuilder sb = new StringBuilder();
        json2MarkdownList(sb,jsn,-1,"");
        return sb.toString();
    }
}



@Test
    void outPUTMarkdown() {
    
    
        String json =  "{\n" +
                "    \"data\": {\n" +
                "        \"total\": 15,\n" +
                "        \"pages\": 3,\n" +
                "        \"recommend\": [\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 29,\n" +
                "                    \"title\": \"二叉树最大路径和\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"题目描述\\r\\n给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。\\r\\n这个路径的开始节点和结束节点可以是二叉树中的任意节点\\r\\n例如:\\r\\n给出以下的二叉树,\\r\\n \\r\\n返回的结果为6\\r\\n示例1\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 28,\n" +
                "                    \"title\": \"分割链表\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前\\r\\n\\r\\n给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 27,\n" +
                "                    \"title\": \"dp之 找零\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"题目描述\\r\\nZ国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N (0 < N \\\\le 1024)N(0<N≤1024)的商品,请问最少他会收到多少硬币?\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 26,\n" +
                "                    \"title\": \"之字形层序遍历\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)\\r\\n例如:\\r\\n给定的二叉树是{3,9,20,#,#,15,7},\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 25,\n" +
                "                    \"title\": \"合并K个已排序的链表\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"题目描述\\r\\n合并\\\\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 24,\n" +
                "                    \"title\": \"返回一颗二叉搜索树的第k小节点\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4。\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 23,\n" +
                "                    \"title\": \"#栈#括号匹配问题\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"判断括号序列是否合法\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"blog\": {\n" +
                "                    \"commentCount\": null,\n" +
                "                    \"id\": 22,\n" +
                "                    \"title\": \"ps将图片设计稿调节为 横向750px\",\n" +
                "                    \"firstPicture\": null,\n" +
                "                    \"flag\": null,\n" +
                "                    \"views\": null,\n" +
                "                    \"appreciation\": null,\n" +
                "                    \"shareStatement\": null,\n" +
                "                    \"commentabled\": null,\n" +
                "                    \"published\": null,\n" +
                "                    \"recommend\": null,\n" +
                "                    \"createTime\": null,\n" +
                "                    \"updateTime\": null,\n" +
                "                    \"typeId\": null,\n" +
                "                    \"userId\": null,\n" +
                "                    \"tagIds\": null,\n" +
                "                    \"content\": null,\n" +
                "                    \"description\": \"ps 调节 设计稿 横向 750px\"\n" +
                "                },\n" +
                "                \"type\": null,\n" +
                "                \"tags\": [],\n" +
                "                \"user\": null,\n" +
                "                \"commentCount\": null,\n" +
                "                \"tagIds\": \"\"\n" +
                "            }\n" +
                "        ],\n" +
                "        \"contentList\": [\n" +
                "            {\n" +
                "                \"commentCount\": 0,\n" +
                "                \"id\": 29,\n" +
                "                \"title\": \"二叉树最大路径和\",\n" +
                "                \"firstPicture\": \"http://img.itshare.club/20200915222524.png\",\n" +
                "                \"flag\": \"原创\",\n" +
                "                \"views\": 4,\n" +
                "                \"appreciation\": 1,\n" +
                "                \"shareStatement\": 1,\n" +
                "                \"commentabled\": 1,\n" +
                "                \"published\": 1,\n" +
                "                \"recommend\": 1,\n" +
                "                \"createTime\": \"2020-09-15T14:25:49.000+00:00\",\n" +
                "                \"updateTime\": \"2020-09-15T14:25:49.000+00:00\",\n" +
                "                \"typeId\": 13,\n" +
                "                \"userId\": null,\n" +
                "                \"tagIds\": \"12\",\n" +
                "                \"content\": null,\n" +
                "                \"description\": \"题目描述\\r\\n给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。\\r\\n这个路径的开始节点和结束节点可以是二叉树中的任意节点\\r\\n例如:\\r\\n给出以下的二叉树,\\r\\n \\r\\n返回的结果为6\\r\\n示例1\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"commentCount\": 0,\n" +
                "                \"id\": 22,\n" +
                "                \"title\": \"ps将图片设计稿调节为 横向750px\",\n" +
                "                \"firstPicture\": \"http://img.itshare.club/20200902000615.webp\",\n" +
                "                \"flag\": \"原创\",\n" +
                "                \"views\": 1,\n" +
                "                \"appreciation\": 1,\n" +
                "                \"shareStatement\": 1,\n" +
                "                \"commentabled\": 1,\n" +
                "                \"published\": 1,\n" +
                "                \"recommend\": 1,\n" +
                "                \"createTime\": \"2020-09-01T16:07:01.000+00:00\",\n" +
                "                \"updateTime\": \"2020-09-08T06:06:16.000+00:00\",\n" +
                "                \"typeId\": 15,\n" +
                "                \"userId\": null,\n" +
                "                \"tagIds\": \"13\",\n" +
                "                \"content\": null,\n" +
                "                \"description\": \"ps 调节 设计稿 横向 750px\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"commentCount\": 0,\n" +
                "                \"id\": 25,\n" +
                "                \"title\": \"合并K个已排序的链表\",\n" +
                "                \"firstPicture\": \"http://img.itshare.club/20200903190846.png\",\n" +
                "                \"flag\": \"原创\",\n" +
                "                \"views\": 1,\n" +
                "                \"appreciation\": 1,\n" +
                "                \"shareStatement\": 1,\n" +
                "                \"commentabled\": 1,\n" +
                "                \"published\": 1,\n" +
                "                \"recommend\": 1,\n" +
                "                \"createTime\": \"2020-09-03T11:09:44.000+00:00\",\n" +
                "                \"updateTime\": \"2020-09-08T06:06:03.000+00:00\",\n" +
                "                \"typeId\": 14,\n" +
                "                \"userId\": null,\n" +
                "                \"tagIds\": \"12\",\n" +
                "                \"content\": null,\n" +
                "                \"description\": \"题目描述\\r\\n合并\\\\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"commentCount\": 0,\n" +
                "                \"id\": 23,\n" +
                "                \"title\": \"#栈#括号匹配问题\",\n" +
                "                \"firstPicture\": \"http://img.itshare.club/20200903011814.png\",\n" +
                "                \"flag\": \"原创\",\n" +
                "                \"views\": 4,\n" +
                "                \"appreciation\": 1,\n" +
                "                \"shareStatement\": 1,\n" +
                "                \"commentabled\": 1,\n" +
                "                \"published\": 1,\n" +
                "                \"recommend\": 1,\n" +
                "                \"createTime\": \"2020-09-02T17:18:55.000+00:00\",\n" +
                "                \"updateTime\": \"2020-09-08T06:05:54.000+00:00\",\n" +
                "                \"typeId\": 14,\n" +
                "                \"userId\": null,\n" +
                "                \"tagIds\": \"12\",\n" +
                "                \"content\": null,\n" +
                "                \"description\": \"判断括号序列是否合法\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"commentCount\": 0,\n" +
                "                \"id\": 19,\n" +
                "                \"title\": \"给定链表,返回环的入口节点\",\n" +
                "                \"firstPicture\": \"http://img.itshare.club/20200829013310.webp\",\n" +
                "                \"flag\": \"原创\",\n" +
                "                \"views\": 0,\n" +
                "                \"appreciation\": 1,\n" +
                "                \"shareStatement\": 1,\n" +
                "                \"commentabled\": 1,\n" +
                "                \"published\": 1,\n" +
                "                \"recommend\": 1,\n" +
                "                \"createTime\": \"2020-08-28T17:33:26.000+00:00\",\n" +
                "                \"updateTime\": \"2020-09-08T06:05:42.000+00:00\",\n" +
                "                \"typeId\": 14,\n" +
                "                \"userId\": null,\n" +
                "                \"tagIds\": \"12\",\n" +
                "                \"content\": null,\n" +
                "                \"description\": \"对于一个给定的链表,返回环的入口节点,如果没有环,返回null\"\n" +
                "            }\n" +
                "        ]\n" +
                "    },\n" +
                "    \"code\": 200,\n" +
                "    \"message\": \"ok\"\n" +
                "}  ";
        System.out.println(MarkdownUtil.json2MarkdownList(json));
    }

效果预览:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43923045/article/details/111306222