snakeyaml数字字符串显示单引号的问题

2023-05-16

    如题所示,一般yaml结构中,字符串直接显示没有单引号的字符串,如果字符串由数字组成,为了区别真正的数字,这个字符串会使用单引号包围起来。

    数据结构如下:

Map<String,Object> map = new LinkedHashMap<>(){
    {
       put("name","buejee");
       put("age",18);
       put("number","200");
    }
};

    默认,生成的yaml如下所示:

name: buejee
age: 18
number: '200'

    这个结果是我们使用snakeyaml默认生成的,我们也许会想着设置yaml显示属性,比如设置:

options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED);

    最终,我们的yaml结果生成是这样的:

"name": "buejee"
"age": !!int "18"
"number": "200"

    这回,不管是不是字符串,统统都加了双引号。

    我们其实想要的结果是这样的:

name: buejee
age: 18
number: "200"

    其实是有解决办法的,我们需要自定义一个String类型,比如QuotedString,然后我们自定义一个RepresenterQuotedString实现Represent接口。

    完整实现如下所示:

    pom.xml依赖

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

    自定义QuotedString.java

package com.yaml;
public class QuotedString {
    public String value;
    public QuotedString(String value) {
        this.value = value;
    }
}

    自定义生成器MyRepresenter.java

package com.yaml;
import org.yaml.snakeyaml.DumperOptions;
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 MyRepresenter extends Representer {
    public MyRepresenter(){
        this.representers.put(QuotedString.class,new RepresenterQuotedString());
    }
    public class RepresenterQuotedString implements Represent {
        @Override
        public Node representData(Object o) {
            if (o instanceof QuotedString) {
                QuotedString str = (QuotedString) o;
                return representScalar(Tag.STR, str.value, DumperOptions.ScalarStyle.DOUBLE_QUOTED);
            }
            return null;
        }
    }
}

    测试类YamlTest.java

package com.yaml;

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

import java.io.IOException;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.Map;

public class YamlTest {
    public static void main(String[] args) throws IOException {
        Map<String, Object> map = new LinkedHashMap<>() {
            {
                put("name", "buejee");
                put("age", 18);
                put("number", new QuotedString("200"));
            }
        };
        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        options.setIndentWithIndicator(true);
        options.setIndicatorIndent(2);
        Yaml yaml = new Yaml(new MyRepresenter(), options);
        StringWriter writer = new StringWriter();
        yaml.dump(map, writer);
        System.out.println(writer);
    }
}

    运行结果:

    这里自定义生成器与其他自定义生成器不矛盾,如果我们定义了空值生成器,可以替换snakeyaml默认的空值生成器,只需要在自定义生成器中这样设置即可:

public MyRepresenter(){
    this.nullRepresenter = new NullRepresenter();
    this.representers.put(QuotedString.class,new RepresenterQuotedString());
}

    这里可以看出,空值生成器与其他自定义生成器设置不一样。 

    当然,我们也要自定义NullRepresenter。

    最后,我们在实例化Yaml()的时候,传入MyRepresenter,如下所示:

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

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

snakeyaml数字字符串显示单引号的问题 的相关文章

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

    snakeyaml开源库 xff0c 可以很方便的加载和生成yaml文件 xff0c 普通的加载 xff0c 其实springboot项目都可以实现 xff0c 在生成yaml文件的时候 xff0c 有几个问题需要注意 xff0c 第一个是
  • java反射调用System.out.println实现控制台打印

    在java编程中 xff0c 我们最常用的控制台打印就是System out println 我们如果想用反射的方式来实现打印 xff0c 该如何操作呢 xff1f 我们可能会想着直接这样使用 Class forName 34 java l
  • vscode官方下载太慢解决办法

    不说话 xff0c 直接上动态图 xff1a 详细步骤 xff1a 1 打开官网 xff1a Visual Studio Code 点击下载 2 在下载器这里复制下载链接 xff0c 粘贴到浏览器地址栏 3 改变官网地址主地址为 vscod
  • node通过node-java库调用java

    node有一个库 node java xff0c 可以通过js的方式调用java语言 xff0c 听起来好像很好玩 xff0c 但是这个玩意要求很复杂 1 本机安装msbuild环境 这个东西简单的安装方式就是npm install g w
  • node-gyp编译c++编写的node扩展

    node有一个模块addon xff0c 翻译过来 xff0c 是插件 xff0c 但是有的地方也叫扩展 xff0c 这部分是用c 43 43 来编写的 xff0c 最后可以通过node gyp来针对各个平台编译适合自己平台的扩展 xff0
  • log4j日志漏洞问题

    去年 xff0c log4j被爆出了一个漏洞 xff0c 说可以通过利用日志格式化中的远程注入控制主机 当时 xff0c 这个漏洞被形容为史诗级漏洞 xff0c 因为这个远程操作可以执行一些操作 xff0c 如果这个操作有恶意 xff0c

随机推荐

  • postgresql数据备份与恢复

    postgresql数据备份与恢复在实际工作中可能会用到 xff0c 这里记录一下自己整理的备份与恢复的过程 xff0c 备份一般使用pg dump来做 xff0c 但是它备份的结果有两种格式 xff0c 默认不加 Fc参数 xff0c 产
  • bat批处理脚本大全

    目录 1 echo 2 注释 3 常见cmd命令 4 参数与变量 5 for循环 6 函数 7 数组 在windows上编程或者制作一些小工具 xff0c 少不了使用批处理脚本 xff0c 而且在各种开发环境搭建中我们经常会看到批处理脚本
  • node日志log4js库使用示例

    在node开发或者electron项目开发中 xff0c 我们可能需要记录日志的功能 xff0c 便于我们出错排查问题 今天介绍node中的日志库log4js log日志记录 xff0c 一般需要配置日志记录的级别 xff0c 日志输出类型
  • Maven项目引用本地jar涉及scope配置

    在项目开发过程中 xff0c 难免遇到需要引用私有jar的情况 xff0c 这时候最好是将该jar推送到私服仓库 xff0c 但是由于种种 现实问题 xff0c 比如权限不够 时间不够等等 于是就可以尝试将jar放入项目中进行集成 xff0
  • postgresql使用pg_basebackup备份与恢复

    postgresql可以使用pg dump pg restore等命令来进行备份与恢复 xff0c 那种情况不用停止pgsql服务 xff0c 只需要执行备份恢复命令即可 今天介绍的这种备份方式 xff0c 类似于文件系统的备份与恢复 xf
  • java中list与数组相互转换

    java中 xff0c list转数组 xff0c 很方便 xff0c list本身自带一个方法toArray xff0c 但是这个方法默认返回的数组类型是Object xff0c 我们可以给toArray 方法传递一个类型参数 xff0c
  • cython混淆加密

    python代码是一种解释型的语言 xff0c 有了代码和环境就可以执行 xff0c 它无需编译 如果需要对代码进行混淆 xff0c 可以借助cython这个库 它的安装很简单 xff0c 直接运行pip install cython就可以
  • python文件夹拷贝思路

    最近在做项目中 xff0c 要使用python xff0c 对文件拷贝有了一些了解 xff0c 这里将自己理解的文件拷贝整理出来 如下所示 xff0c 文件拷贝思路 xff1a 文件拷贝 xff0c 从io上来说就是读文件 xff0c 写文
  • node检测端口是否被占用isPortOccupied.js

    如题所示 xff0c node开发中 xff0c 可能会遇到开启tcp http服务端口被占用的问题 xff0c 解决起来也很简单 xff0c 直接换一个端口就可以了 但是每次启动 xff0c 发现失败 xff0c 然后更改监听端口来测试
  • commons-math3求解线性方程组

    python语言numpy scipy库可以实现矩阵求解线性方程组 xff0c 在java语言中 xff0c commons math3提供了强大的矩阵计算功能 xff0c 同样也可以用来解决线性方程组问题 如下所示 xff0c 线性方程组
  • 2022记忆

    今年开年来就重新找工作 xff0c 因为就在去年大概这个时候 xff0c 公司裁员了 找工作 xff0c 对于我们这种大龄程序员来说是一种挑战 xff0c 很多公司表面说可以聊聊 xff0c 最后谈了之后 xff0c 发现技术也可以 xff
  • java调用js示例

    jdk1 8引入了js引擎功能 xff0c 可以在命令行下运行js交互程序 xff1a 在jdk11之后 xff0c 这个功能又去掉了 如下代码 xff0c 是一个通过js调起计算器的示例 javascript代码 function mai
  • 查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

    如题所示 xff0c 这个问题是我在postgresql中使用pg dump备份多个schema的表时遇到的问题 bin pg dump dbname 61 postgresql dbuser 123456 64 localhost 543
  • 最小二乘法公式推导以及在线性回归中的应用

    机器学习算法中 xff0c 有一个基础的算法 xff0c 线性回归 xff0c 它的目的是求出一条直线 xff0c 满足所有点到这条直线的距离最短 xff0c 也就是这些数据点能够看起来都在这条直线附近 xff0c 最后 xff0c 可以根
  • Java根据经纬度获取地址信息

    使用高德API根据经纬度获取一定范围内的地址信息 PS xff1a 1 高德地图接口Key申请步骤 xff1a https zhuanlan zhihu com p 555130433 2 经纬度在线查询网址 xff1a https map
  • c++改变控制台显示颜色

    这个问题是别人问我怎么把控制台默认黑底白字修改掉的 xff0c 我说我以前做过java语言控制台颜色控制 xff0c c的没试过 后来还是留意了一下 xff0c 发现可以改变控制台显示颜色 如下实例 xff1a include 34 pch
  • springboot使用MultipartFile上传文件以及File与MultipartFile互转

    如下所示的代码 xff0c 是一个在springboot项目中使用MultipartFile进行文件上传的示例 xff1a package com springboot web import org springframework http
  • python之np.sum()用法详解

    python库numpy提供的求和方法np sum xff0c 可以对数组和矩阵进行求和 sum方法可以接收多个参数 xff0c 主要是数组a 坐标轴axis 数据类型dtype 初始值initial 其中 xff0c axis对于我们来说
  • java中list集合对象按照某一个属性分组

    这里的需求是分组 xff0c 就是集合按照相同的属性来分组 一般默认的做法就是定义一个对象 xff0c 然后利用java8流对象的分组方法来分组 xff0c 在分组函数中 xff0c 传入一个属性get方法 如下所示 xff1a packa
  • snakeyaml数字字符串显示单引号的问题

    如题所示 xff0c 一般yaml结构中 xff0c 字符串直接显示没有单引号的字符串 xff0c 如果字符串由数字组成 xff0c 为了区别真正的数字 xff0c 这个字符串会使用单引号包围起来 数据结构如下 xff1a Map lt S