snakeyaml生成yaml文件空值显示问题

2023-05-16

    snakeyaml开源库,可以很方便的加载和生成yaml文件,普通的加载,其实springboot项目都可以实现,在生成yaml文件的时候,有几个问题需要注意,第一个是格式问题,另外一个就是空值问题。

    使用snakeyaml库需要加入如下依赖:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.30</version>
</dependency>

    如下所示,默认yaml格式,集合显示带有中括号。

package com.yaml;

import org.yaml.snakeyaml.Yaml;

import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class YamlTest {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>(){
            {
                put("name","buejee");
                put("age",18);
                put("email",null);
                put("company","");
                put("language", Arrays.asList("java","python","cplusplus"));
            }
        };
        Yaml yaml = new Yaml();
        StringWriter writer = new StringWriter();
        yaml.dump(map,writer);
        System.out.println(writer.toString());
    }
}

    打印结果:

     这个结果有一个很明显的问题,就是集合没有按照预期的格式展示,我们希望展示如下所示:

name: buejee
company: ''
language: 
  - java
  - python
  - cplusplus
age: 18
email: null

    我们需要通过DumperOptions来设置yaml文件流格式,这里设置块级显示。

DumperOptions options  = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yaml = new Yaml(options);

    这样之后,显示稍微好一点:

    但是缩进不是很理想,这里我们设置缩进:

options.setIndentWithIndicator(true);
options.setIndicatorIndent(2);

   这样,显示好多了:

    这里面,还是有两个问题,空字符"",显示为'',null值显示为了null,其实我们希望null显示空。经过摸索,发现可以通过自定义Representer来达到显示为空的效果。

package com.yaml;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Represent;
import org.yaml.snakeyaml.representer.Representer;
public class RepresenterNull extends Representer {
    public RepresenterNull(){
        super();
        this.nullRepresenter = new NullRepresenter();
    }
    private class NullRepresenter implements Represent{

        @Override
        public Node representData(Object o) {
            return representScalar(Tag.NULL,"");
        }
    }
}

    在实例化Yaml的时候,传入RepresenterNull实例。

Yaml yaml = new Yaml(new RepresenterNull(),options);

    展示效果:

    不过,对于字符串=""的情况,并没有转为空,但是我们可以在赋值的时候判断,如果equals(""),那么就赋值null也可以。

    这里改变输出到文件:

FileWriter writer = new FileWriter(new File("test.yaml"));
yaml.dump(map,writer);

    最后生成的yaml文件如下所示:

    完整代码:

package com.yaml;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class YamlTest {
    public static void main(String[] args) throws IOException {
        Map<String,Object> map = new HashMap<>(){
            {
                put("name","buejee");
                put("age",18);
                put("email",null);
                put("company",null);
                put("language", Arrays.asList("java","python","cplusplus"));
            }
        };
        DumperOptions options  = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        options.setIndentWithIndicator(true);
        options.setIndicatorIndent(2);
        Yaml yaml = new Yaml(new RepresenterNull(),options);
        //StringWriter writer = new StringWriter();
        //yaml.dump(map,writer);
        //System.out.println(writer.toString());
        FileWriter writer = new FileWriter(new File("test.yaml"));
        yaml.dump(map,writer);
    }
}

       snakeyaml生成yaml文件,设置块级格式,自定义空值显示就介绍完了。让我最高兴的就是空值显示问题的解决,因为在工作中正好用到了,特此记录一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

snakeyaml生成yaml文件空值显示问题 的相关文章

随机推荐

  • 通过vue ui方式构建vue+electron项目

    以前我构建vue 43 electron项目都是使用一些模版比如webpack simulatedgreg electron vue等 xff0c 这些模版在github上 xff0c 有时候可能因为网络原因下载会慢一些 后来看到一些文章介
  • vue+echarts画甘特图

    vue项目中添加echarts xff0c 只需要增加echarts依赖 xff0c 然后在main js中引入echarts就可以使用了 1 npm install echarts save 2 修改main js import as e
  • mac系统下node版本管理工具n的安装与使用

    node版本管理 xff0c 在windows和linux下都叫nvm 在mac下 xff0c 更加简洁 xff0c 直接就是n xff0c 似乎容易让人产生怀疑 xff0c 这太简洁了 xff0c n可以表示很多意思啊 这就是mac系统独
  • python输出不换行与多行注释

    默认情况下 xff0c python输出打印方法print xff0c 每一次调用都会单独输出一行内容 xff0c 有些场景下面 xff0c 我们需要输出是连在一起的 xff0c 不用单行显示 这就需要对打印做设置 xff0c 参数是end
  • vue转electron项目以及使用fs报错:Module not found: Error: Can‘t resolve ‘fs‘ in解决办法

    前面写了一篇博客 xff0c 通过vue ui创建electron 43 vue项目 xff0c 其实关键的一步就是增加vue cli plugin electron builder插件依赖 这一步可以通过界面上添加 xff0c 也可以手动
  • python将图片转矩阵

    在机器学习手写数字识别案例中 xff0c 需要将手写数字图片转矩阵向量 其实转矩阵 xff0c 就需要根据图片上像素点来组成一个矩阵 xff0c 如果把图片看作一个 长 宽 的二维矩阵 xff0c 那么矩阵中的每个点的像素表示的数字组成一个
  • ant-design-vue中this.$confirm 确认框使用

    cancelService obj let self 61 this this confirm title 39 确认提示 39 content 96 是否确认取消服务 xff1f 96 okType 39 danger 39 onOk r
  • javascript数组排序

    javascript原生排序算法sort xff0c 如果不带排序函数 xff0c 那么就是默认按照升序排列 如果是数字类型就按照从小到大的顺序排列 xff0c 如果是字符串 xff0c 就按照字母顺序排列 Sorts an array i
  • electron项目打包之后显示空白页面以及发送http请求地址错误

    electron项目在开发阶段 xff0c 因为使用webpack脚手架 启用了webServer提供的http服务 xff0c 所以有路由功能 xff0c 当我们运行npm run electron serve的时候 xff0c 最后可以
  • mac系统electron项目打包出现:Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT

    mac系统下 xff0c electron项目打包 xff0c 好像需要python可执行程序 xff0c 如果找不到就报这个错误 xff0c 而且python版本需要2 7版本 我的系统不知道怎么回事 xff0c 因为已经安装了pytho
  • 矩阵的乘法与利用矩阵求解线性方程组

    矩阵的乘法定义 xff1a 假定A 61 是一个m s的矩阵 xff0c B 61 是一个s n的矩阵 xff0c 那么规定 xff0c 矩阵A与矩阵B的乘积是一个m n的矩阵C 61 xff0c 其中 xff0c i 61 1 2 m j
  • 正则表达式[^]的作用

    与数字组合然后用中括号扩起来的用法比如 0 9 xff0c 或者与字母组合 a z 我们经常能见到 xff0c 表示匹配除了0 9或者a z之外的其他字符 但是有一种形式 xff0c 就是中括号 里面单独一个 xff1a 这种情况 xff0
  • [Java] synchronized在代码块中修饰.class与this的区别

    synchronized是java中的关键字 xff0c 表示同步 xff0c 可以在多线程环境中起到锁的作用 它是jvm层面的锁 xff0c 不需要人为获取释放锁资源 xff0c 由jvm决定 synchronized可以直接用在方法上
  • java面向对象编程中可能出现的隐藏hide、遮蔽shadow、遮掩obscure

    在java面向对象编程中 xff0c 我们最常遇到的两个场景是覆盖和重载 这两种情形是因为方法名相同的不同展现形式 方法覆盖是表现在父类和子类之间 方法重载发生在一个类的内部 在面向对象编程中 xff0c 我们还可能出现下面几种场景 xff
  • java控制台输出颜色设置

    在java中 xff0c 控制台输出 xff0c System out println 显示默认黑色 xff0c 如果是System err println 显示红色 要想让控制台输出改变颜色 xff0c 需要做一些设置 就像在linux终
  • java删除非空文件夹

    java中删除文件和空文件夹很简单 xff0c 直接调用File api xff0c file delete 就可以删除文件或者空文件夹本身 但是如果是非空文件夹 xff0c 这个方法就会失败 xff0c 就像在linux下我们使用命令rm
  • springboot项目中PropertySource读取yaml配置文件

    springboot项目中 xff0c 当我们使用 64 Value注解读取配置属性 xff0c 默认的配置文件是properties类型文件 xff0c 如果一些配置来自yaml格式配置文件 xff0c 那么就需要做一个配置 Proper
  • Java内存溢出问题排查分析

    目录 前言 一 MAT xff08 Memory Analyzer Tool xff09 二 软件初识 三 捕获dump文件 1 主动方式 2 被动方式 四 分析dump文件 总结 前言 项目运行过程中 xff0c 我们可能会遇到Java内
  • Excel行变列,列变行技巧以及单元格换行

    在excel操作中 xff0c 有可能有这样的需求 xff0c 就是一列数据 xff0c 我们最终需要把他们放在一行上展示 xff0c excel提供了复制粘贴功能 xff0c 在粘贴的时候 xff0c 右键选择 选择性粘贴 xff0c 再
  • snakeyaml生成yaml文件空值显示问题

    snakeyaml开源库 xff0c 可以很方便的加载和生成yaml文件 xff0c 普通的加载 xff0c 其实springboot项目都可以实现 xff0c 在生成yaml文件的时候 xff0c 有几个问题需要注意 xff0c 第一个是