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

news2024/12/29 10:52:40

    如题所示,一般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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

COCO物体检测评测方法简介

本文从ap计算到map计算&#xff0c;最后到coco[0.5:0.95:0.05] map的计算&#xff0c;一步一步拆解物体检测指标map的计算方式。 一、ap计算方法 一个数据集有多个类别&#xff0c;对于该数据库有5个gt&#xff0c;算法检测出来10个bbox&#xff0c;对于人这个类别来说检测有…

类和对象实操之【日期类】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The pessimist complains about the wind; the optimist expects it to change; the realist adjusts the sails. 悲观主义者抱怨风;乐观主义者期望它…

两数相加-力扣2-java高效方案

一、题目描述给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数都不…

论文阅读 | Rethinking Coarse-to-Fine Approach in Single Image Deblurring

前言&#xff1a;ICCV2021图像单帧运动去糊论文 论文地址&#xff1a;【here】 代码地址&#xff1a;【here】 Rethinking Coarse-to-Fine Approach in Single Image Deblurring 引言 图像去糊来自与物体或相机的运动。现有的deblur领域的深度学习方法大多都是coarse-to-fin…

RiProV2主题美化增加支付页底部提示语ritheme主题美化

美化背景 默认的RiProV2主题在支付提示页,是没有这一行提示的 希望增加根据用户类别,未登录用户购买时提示:当前为游客模式购买。或者其他提示,提示用户未登录购买不保存购买记录等。 索引关键字:ritheme主题美化之增加支付页底部提示语,RiProV2主题美化增加支付页底部提…

git必会的知识点

注&#xff1a;本文参考https://www.liaoxuefeng.com/wiki/896043488029600 原文非常值得一读&#xff0c;作者学识渊博&#xff0c;补充了很多有意思的知识。我仅仅是拾人牙慧。 git是最先进的分布式版本控制系统。 版本控制系统——自动记录系统中文件的改动情况&#xff0…

多核异构核间通信-mailbox/RPMsg 介绍及实验

1. 多核异构核间通信 由于MP157是一款多核异构的芯片&#xff0c;其中既包含的高性能的A7核及实时性强的M4内核&#xff0c;那么这两种处理器在工作时&#xff0c;怎么互相协调配合呢&#xff1f; 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…

Maven_第四章 使用Maven:IDEA环境

目录第一节 创建父工程第二节 配置Maven信息第三节 创建Java模块工程第四节 创建Web模块工程1、创建模块2、修改打包方式3、Web 设定4、借助IDEA生成web.xml5、设置 Web 资源的根目录6、测试6.1 创建文件6.2 配置tomcat第五节 其他操作1、在IDEA中执行Maven命令①直接执行②手动…

代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

77组合 看完题后的思路 void f&#xff08;数组&#xff0c;startIndex&#xff09;递归终止 if&#xff08;startIndex数组长度||path.sizek&#xff09;{ if(path.sizek){ 加入} }递归 for&#xff08;&#xff1b;startIndex<num.size&#xff1b;startIndex&#xff0…

为什么分库分表

系列文章目录 文章目录系列文章目录前言一、什么是分库分表二、分库分表的原因分库分表三、如何分库分表3.1 垂直拆分1.垂直分库2、垂直分表3.2 水平拆分水平分库水平分表水平分库分表的策略hash取模算法range范围rangehash取模混合地理位置分片预定义算法四、分库分表的问题分…

华为动态二进制翻译工具(ExaGear)

你还在为liunix x86程序移植到ARM环境而烦恼吗&#xff1f;你们现在您的福利来了&#xff0c;ExaGear可以解决您的烦恼&#xff0c;让您试下零代码迁移运行Linux x86程序。ExaGear是华为自研动态二进制翻译工具&#xff0c;通过在运行时&#xff0c;将x86应用指令翻译为ARM64指…

备战金三银四,软件测试面试题(全)

1.B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c;因…

leetcode: Two Sum

leetcode: Two Sum1. 题目1.1 题目描述2. 解答2.1 baseline2.2 基于baseline的思考2.3 优化思路的实施2.3.1 C中的hashmap2.3.2 实施2.3.3 再思考2.3.4 最终实施3. 总结1. 题目 1.1 题目描述 Given an array of integers nums and an integer target, return indices of the …

Fluent Python 笔记 第 4 章 文本和字节序列

Python 3 明确区分了人类可读的文本字符串和原始的字节序列。隐式地把字节序列转换成 Unicode 文本已成过去。本章将要讨论 Unicode 字符串、二进制序列&#xff0c;以及在二者之间转 换时使用的编码。 没啥可看的&#xff0c;就一句话&#xff0c;一定不能依赖默认编码&#x…

DP优化 - 斜率优化

假设当前的 DP 方程为 fimin⁡0≤j<i{−K(i)X(j)Y(j)}F(i)f_i\min\limits_{0\leq j< i}\{-K(i)X(j)Y(j)\} F(i)fi​0≤j<imin​{−K(i)X(j)Y(j)}F(i) 或 fimax⁡0≤j<i{−K(i)X(j)Y(j)}F(i)f_i\max\limits_{0\leq j< i}\{-K(i)X(j)Y(j)\} F(i)fi​0≤j<im…

Node.js笔记-Express(基于Node.js的web开发框架)

目录 Express概述 Express安装 基本使用 创建服务器 编写请求接口 接收请求参数 获取路径参数(/login/2) 静态资源托管-express.static&#xff08;内置中间件&#xff09; 什么是静态资源托管&#xff1f; express.static() 应用举例 托管多个静态资源 挂载路径前缀…

车厢调度(train)(栈)

目录 题目描述 解题思路&#xff1a; 代码部分&#xff1a; 题目描述 有一个火车站&#xff0c;铁路如图所示&#xff0c;每辆火车从A驶入&#xff0c;再从B方向驶出&#xff0c;同时它的车厢可以重新组合。假设从A方向驶来的火车有n节&#xff08;n≤1000&#xff09;&…

Revit中关于屋顶编辑线移动的问题

一、Revit中关于屋顶编辑线移动的问题 在绘制屋顶的时候&#xff0c;如果出现有稍微偏差的时候&#xff0c;个别习惯移动编辑线&#xff0c;这种方法是不可取的&#xff0c;接下来为大家介绍一下这种方法的问题所在。 首先我们绘制几面这样的墙体&#xff0c;主要做测试用的&am…

锁升级之Synchronized

Synchronized JVM系统锁一个对象里如果有多个synchronized方法&#xff0c;同一时刻&#xff0c;只要有一个线程去调用其中的一个synchronized方法&#xff0c;其他线程只能等待&#xff01;锁的是当前对象&#xff0c;对象被锁定后&#xff0c;其他线程都不能访问当前对象的其…

流程引擎之发展史及对比总结

流程引擎渊源市场上比较有名的开源流程引擎有 jBPM、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四个框架同宗同源&#xff0c;祖先都是 jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。而 Compile…