java代码实现将markdown层级标题转换成json树结构

这篇具有很好参考价值的文章主要介绍了java代码实现将markdown层级标题转换成json树结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

NodeVO.java:


import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.List;

@Getter
@Setter
public class NodeVO implements Serializable {

    private String key;
    private String parentKey;
    private NodeVO parent;

    private NodeVO prev;

    private String jing;
    private String name;
    private List<NodeVO> children;
}
MarkdownUtils.java:
import java.util.*;

public class MarkdownUtils {

    public static void print(NodeVO nodeVo,String padding) {
        if( nodeVo == null ){
            return;
        }
        System.out.println( padding + nodeVo.getName() );
        List<NodeVO> children = nodeVo.getChildren();
        if( children == null || children.size() == 0 ){
            return;
        }
        for( NodeVO child:children ){
            print( child,padding + "\t" );
        }
    }

    /**
     *
     * @param title
     * @return 数组中0角标处的元素是 jing号,数组中1角标处的元素是name
     */
    public static String[] extractJingAndNameFromTitle( String title ){
        String name = title.replaceFirst("[#]+", "");
        String jing = title.replaceFirst(name, "");
        String[] result = new String[2];
        result[ 0 ] = jing;
        result[ 1 ] = name;
        return result;
    }

    public static List<NodeVO> markdownTitles2JsonTree(List<String> titles ){
        if( titles == null || titles.size()==0 ){
            return new ArrayList<>( 0 );
        }
        int size = titles.size();

        // init  map_key_nodeVO
        Map<String, NodeVO> map_key_nodeVO = new HashMap<>();
        NodeVO node_curr = null;
        NodeVO node_prev = null;
        for( int i=0;i<size;i++ ){
            node_prev = node_curr;

            String title = titles.get(i);
            String[] result = MarkdownUtils.extractJingAndNameFromTitle(title);
            String jing = result[0];
            String name = result[1];

            node_curr = new NodeVO();
            node_curr.setPrev( node_prev );
            node_curr.setJing( jing );
            node_curr.setName( name );
            String key = i + jing + name;
            node_curr.setKey( key );
            map_key_nodeVO.put( key,node_curr );
        }

        String key_curr = null;
        String key_prev = null;
        // # xxx
        // ## xxx_1
        // ### xxx_1_1
        // # yyy

        for( int i=0;i<size;i++ ){
            key_prev = key_curr;

            String title = titles.get(i);
            String[] result = MarkdownUtils.extractJingAndNameFromTitle(title);
            String jing = result[0];
            String name = result[1];
            key_curr = i + jing + name;

            handle( key_curr,key_prev,map_key_nodeVO );
        }

        List<NodeVO> nodeVOs_top = new ArrayList<>();
        Set<String> keys = map_key_nodeVO.keySet();
        for( String key:keys ){
            NodeVO nodeVO = map_key_nodeVO.get(key);
            if( nodeVO.getParent() == null ){
                nodeVOs_top.add( nodeVO );
            }
        }
        return nodeVOs_top;
    }

    private static void handle(String key_curr, String key_prev, Map<String, NodeVO> map_key_nodeVO) {
        if( key_prev == null ){
            return;
        }
        // 比较当前两个节点的  #个数
        NodeVO node_curr = map_key_nodeVO.get(key_curr);
        NodeVO node_prev = map_key_nodeVO.get(key_prev);

        String jing_curr = node_curr.getJing();
        String jing_prev = node_prev.getJing();

        if(jing_curr.length() == jing_prev.length() ){
            //  当前标题 和 前一个标题 是 兄弟标题,有同样的父标题,或者都没有父标题
            NodeVO parent = node_prev.getParent();
            if( parent == null ){
                // 都没有父标题
            }else {
                // 有同样的父标题
                node_curr.setParent( parent );
                parent.getChildren().add( node_curr );
            }
        }else if( jing_curr.length() < jing_prev.length() ){
            // 将当前标题 和 前一个标题 的 前一个标题 继续做比较( 递归 )
            NodeVO node_prev_prev = node_prev.getPrev();
            if( node_prev_prev == null ){
                handle( key_curr,null,map_key_nodeVO );
            }else {
                handle( key_curr,node_prev_prev.getKey(),map_key_nodeVO );
            }
        }else if( jing_curr.length() > jing_prev.length() ){
            // 当前标题 是 前一个标题 的子标题
            node_curr.setParent( node_prev );
            List<NodeVO> children = node_prev.getChildren();
            if( children == null ){
                children = new ArrayList<>();
                node_prev.setChildren( children );
            }
            children.add( node_curr );
        }
    }
}

 测试代码:



import java.util.ArrayList;
import java.util.List;

public class Test {


    public static void main(String[] args) {
        List<String> titles = new ArrayList<>();
        titles.add( "#大洲" );
        titles.add( "##南美洲" );
        titles.add( "###巴西" );
        titles.add( "####圣保罗" );
        titles.add( "####巴西利亚" );
        titles.add( "####里约热内卢" );
        titles.add( "###智利" );
        titles.add( "####圣地亚哥" );
        titles.add( "###阿根廷" );
        titles.add( "###布宜诺斯艾利斯" );
        titles.add( "###哥伦比亚" );
        titles.add( "####圣菲波哥大" );
        titles.add( "###委内瑞拉" );
        titles.add( "####加拉加斯" );
        titles.add( "###秘鲁" );
        titles.add( "##北美洲" );
        titles.add( "###美国" );
        titles.add( "####华盛顿" );
        titles.add( "####纽约" );
        titles.add( "####旧金山" );
        titles.add( "####芝加哥" );
        titles.add( "####阿拉斯加" );
        titles.add( "###加拿大" );
        titles.add( "####渥太华" );
        titles.add( "####魁北克" );
        titles.add( "##亚洲" );
        titles.add( "###中国" );
        titles.add( "####北京" );
        titles.add( "####上海" );
        titles.add( "####广州" );
        titles.add( "####深圳" );
        titles.add( "###朝鲜" );
        titles.add( "###日本" );
        titles.add( "###韩国" );
        titles.add( "###泰国" );
        titles.add( "##欧洲" );
        titles.add( "###英国" );
        titles.add( "####伦敦" );
        titles.add( "####利物浦" );
        titles.add( "####约克" );
        titles.add( "####牛津" );
        titles.add( "####罗切斯特" );
        titles.add( "###德国" );
        titles.add( "####柏林" );
        titles.add( "####慕尼黑" );
        titles.add( "####汉堡" );
        titles.add( "####巴伐利亚" );
        titles.add( "####勃兰登堡" );
        titles.add( "####布莱梅" );
        titles.add( "###法国" );
        titles.add( "####巴黎" );
        titles.add( "####马赛" );
        titles.add( "####里昂" );
        titles.add( "####尼斯" );
        titles.add( "###俄罗斯" );
        titles.add( "####莫斯科" );
        titles.add( "####斯大林格勒" );
        titles.add( "####圣彼得堡" );
        titles.add( "####叶卡捷琳堡" );
        titles.add( "###西班牙" );
        titles.add( "###丹麦" );
        titles.add( "####哥本哈根" );
        titles.add( "###挪威" );
        titles.add( "####奥斯陆" );
        titles.add( "##大洋洲" );
        titles.add( "###澳大利亚" );
        titles.add( "###新西兰" );
        titles.add( "###斐济" );
        titles.add( "##非洲" );
        titles.add( "###南非" );
        titles.add( "###刚果" );
        titles.add( "###阿尔及利亚" );
        titles.add( "##南极洲" );

        List<NodeVO> nodeVos = MarkdownUtils.markdownTitles2JsonTree( titles );
        for( NodeVO nodeVo:nodeVos ){
            MarkdownUtils.print( nodeVo,"" );
        }
    }
}

转换成json树结构之后的输出:文章来源地址https://www.toymoban.com/news/detail-702655.html


大洲
	南美洲
		巴西
			圣保罗
			巴西利亚
			里约热内卢
		智利
			圣地亚哥
		阿根廷
		布宜诺斯艾利斯
		哥伦比亚
			圣菲波哥大
		委内瑞拉
			加拉加斯
		秘鲁
	北美洲
		美国
			华盛顿
			纽约
			旧金山
			芝加哥
			阿拉斯加
		加拿大
			渥太华
			魁北克
	亚洲
		中国
			北京
			上海
			广州
			深圳
		朝鲜
		日本
		韩国
		泰国
	欧洲
		英国
			伦敦
			利物浦
			约克
			牛津
			罗切斯特
		德国
			柏林
			慕尼黑
			汉堡
			巴伐利亚
			勃兰登堡
			布莱梅
		法国
			巴黎
			马赛
			里昂
			尼斯
		俄罗斯
			莫斯科
			斯大林格勒
			圣彼得堡
			叶卡捷琳堡
		西班牙
		丹麦
			哥本哈根
		挪威
			奥斯陆
	大洋洲
		澳大利亚
		新西兰
		斐济
	非洲
		南非
		刚果
		阿尔及利亚
	南极洲


到了这里,关于java代码实现将markdown层级标题转换成json树结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang学习-golang结构体和Json相互转换

    1、结构体转为json对象     v, _ := json.Marshal(student)     jsonStr := string(v) // 结构体转为json对象 2、json字符串转为结构体     var s1 Student     err := json.Unmarshal([]byte(str), s1) //json 字符串转为结构体    3、结构体标签 表示的是转换为json对象时,ID字段变为id,Name字段变为name. type

    2024年01月23日
    浏览(54)
  • 数据结构——前缀、中缀、后缀表达式实现和转换(Java)

    1.7.1 概念 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于 运算符相对与操作数的位置 不同 前缀 表达式的运算符位于与其相关的 操作数之前 ;中缀和后缀同理。 平时我们 日常使用 并最为熟悉的就是中缀表达式。如: 1 + 2 *

    2024年02月05日
    浏览(55)
  • vscode markdown preview enhanced插件显示图片alt标题注释

    vscode markdown preview enhanced plugin show image alt title description edit parser.js file‘s onWillParseMarkdown OR onDidParseMarkdown function: windows:%userprofile%/.crossnote/parser.js linux/mac:~/.crossnote/parser.js for old version: windows:%userprofile%/.mume/parser.js linux/mac:~/.mume/parser.js

    2024年02月09日
    浏览(45)
  • JAVA 对象转换为JSON

    转载:如何把java对象转换为json java对象怎么转成json_clghxq的技术博客_51CTO博客 1、Java对象列表转换为JSON对象数组,并转为字符串 JSONArray jsonArray = JSONArray.fromObject(list); String jsonArrayStr = jsonArray.toString(); 2、把Java对象转换成JSON对象,并转化为字符串 JSONObject jsonObject = JSONObject.

    2024年02月10日
    浏览(38)
  • java将json字符串转换成json数组

    有些时候我们需要将json字符串转换成数组,并且只取一些属性值进行下一个方法的赋值,这样就涉及到了json字符串的转换了, json字符串有两种形式,一种是以{A,B,C},一种是[{A},{B},{C}]。但是很多时候是这两种的结合。 首先导入jar包 如果是第一种只需要加入以下代码,注意

    2024年02月11日
    浏览(54)
  • Java入门-java对象与json之间的转换

    使用jackson实现java对象转为Json字符串 引入依赖 对象转json字符串 测试 使用Jackson对象完成转换工作。 json字符串转换对象 测试

    2024年02月22日
    浏览(48)
  • Java实体和JSON之间的相互转换

    代码如下: 初始化并输出一下: 注意,如果没有使用“@Data”注解,一定要加上get和set方法,不然转化之后的Json是空的! 主要是对SerializerFeature枚举类的使用,详细的可以看这个博客: https://blog.csdn.net/xiang__liu/article/details/81570923 或者看这里: https://www.javadoc.io/static/com.ali

    2024年02月12日
    浏览(49)
  • java中对象和JSON格式的转换

    JSON(javaScript Object Notation) 是 一种轻量级的数据交换格式 ,具有良好的可读性和可拓展性。 它采用键值对的方式表示数据,支持基本数据类型和复合数据类型。可用于描述结构化数据和非结构化数据。 结构 对象结构(无序): 无序的对象结构在不同语言中称法不同 对象(

    2024年02月04日
    浏览(39)
  • 【JAVA】各JSON工具对比及常用转换

    工具名称 使用 场景 Gson 需要先建好对象的类型及成员才能转换 数据量少,javabean-json *FastJson 复杂的Bean转换Json会有问题 数据量少,字符串-》json Jackson 转换的json不是标准json 数据量大,不能对对象集合解析,只能转成一个Map,字符串-》json,javabean-json Json-lib 不能满足互联网需

    2024年02月16日
    浏览(40)
  • JAVA 接收JSON数据,并进行转换处理

    在日常业务中经常需要与外部系统交互处理数据,在此文章中记录一下我在项目中处理json数据流程。 第一种以实体类处理 以文档中的数据结构构建实体类,使字段与需要接收转换的JSON字段变量名尽量保持一致,如果不一致,则会获取不到变量的数值,也可以使用 @JsonPrope

    2024年02月14日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包