YAML中多行字符串的配置方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YAML中多行字符串的配置方法相关的知识,希望对你有一定的参考价值。

参考技术A

有时候我们会在配置文件中配置一段文字说明,这种时候通常会出现两种需求:

简单的说,就是:

假设,我们需要配置这样一段文字:

下面,就针对上面的两种情况来看看可以怎么来实现:

这个需求下,我们希望配置和显示都按句子换行,就是这样:

这样写:

最终输出:

通过 \\n 在显示的时候换行,通过配置行末的 \\ 让这个字符串换行继续写(这个必须有,如果没有第二行行首会多一个空格)。

注意 :这里必须使用双引号来定义字符串,不能用单引号。因为单引号是不支持 \\n 换行的。

在方法一种,其实我们在文字中加入了几个转义符号,其实对于阅读并不方便。在方法二中,将介绍更适合阅读的几种形式:

如上面一共有三种配置都会自动按配置中所写的换行来换行,但是在文末会有一些区别,有的会增加一个空行,有的不会,有的会新增两个空行,具体说明如下:

这个需求下,我们希望配置里是按行写的,但是显示是如下面这样在一行的:

最粗暴的写法,反正不用换行,那就直接写了:

这里不论用双引号还是单引号都是可以的。因为不存在需要转移的内容,所以总体还算清晰。

比较好的表述方式就是使用 > 、 >+ 、 >- 来定义,比如下面这几种:

这三种都不会对配置中的换行进行实际换行,但是依然在文末的处理会有一些小区别,具体如下:

YAML 多行数组

【中文标题】YAML 多行数组【英文标题】:YAML Multi-Line Arrays 【发布时间】:2014-07-02 15:39:06 【问题描述】:

在YAML,您可以轻松创建multi-line strings。但是,我希望能够使用 | 字符创建一个多行数组(主要是为了在配置文件中的可读性)。

一个 YAML array 可以表示为:['key1', 'key2', 'key3']

YAML sequence 使用破折号,后跟空格,然后是字符串:

- String1
- String2
- String3

这将评估为:['string1', 'string2', 'string3']

YAML 映射是我们在 YAML 中经常看到的键值对数组:

Key1: string1
Key2: string2
Key3: string3

这一切都很好,但我一生都看不到如何做一个多行数组。像这样的:

|
['string1', 'string2', 'string3']
['string4', 'string5', 'string6']

没有在 YAML 中创建多个数组映射并在我选择的编程语言中合并它们,有没有办法实现多行数组,也许像 Python 那样使用 但在 YAML 中?

【问题讨论】:

老实说,什么是多行数组&什么时候才有意义?而不仅仅是代码的外观 必须水平滚动屏幕才能看到所有选项,而不是一次在一个屏幕上看到它们。 多行可能使差异更具可读性,因为添加或删除的每个项目都对应于添加或删除的 1 行。 @XedinUnknown 良好的技术论证和推理 - 版本控制使用受未来变化的影响较小。感谢分享。 【参考方案1】:

当数组元素值的数量很少时,以下内容对我有用,并且从可读性的角度来看它很好:

key: [string1, string2, string3, string4, string5, string6]

已经过测试,可以与 snakeyamlruamel.yaml 一起使用。

【讨论】:

【参考方案2】:

如果你需要的是一个数组数组,你可以这样做:

key:
  - [ 'value11', 'value12', 'value13' ]
  - [ 'value21', 'value22', 'value23' ]

【讨论】:

感谢 Vinicius,但问题明确指出:“。我希望能够创建多行数组”,而不是多行多个数组。 没有意识到这个问题并不完全是我的问题,而是为此而来 - 谢谢@Vinicius【参考方案3】:

你试过了吗?

-
  name: Jack
  age: 32
-
  name: Claudia
  age: 25

我明白了:["name"=>"Jack", "age"=>32, "name"=>"Claudia", "age"=>25](我使用 YAML Ruby 类)。

【讨论】:

【参考方案4】:

一个 YAML 序列 一个数组。所以这是正确的表达方式:

key:
  - string1
  - string2      
  - string3
  - string4
  - string5
  - string6

含义相同:

key: ['string1', 'string2', 'string3', 'string4', 'string5', 'string6']

将单行数组拆分为多行也是合法的:

key: ['string1', 'string2', 'string3', 
  'string4', 'string5', 
  'string6']

甚至在单行数组中有多行字符串:

key: ['string1', 'long
  string', 'string3', 'string4', 'string5', 'string6']

【讨论】:

如果字符串以 - 开头(例如在命令行中传递的选项)是否会出现问题?然后我必须报价吗? ` - “-myarg”`? 这完全取决于您用来解析 YAML 的任何程序。这个问题只是关于 YAML 规范。 我不知道 YAML 可以处理这样的括号。谢谢你:-)【参考方案5】:

以下方法可行:

myarray: [
  String1, String2, String3,
  String4, String5, String5, String7
]

我使用snakeyaml 实现对其进行了测试,但我不确定其他实现。

【讨论】:

它与 Puppet Enterprise 3.7 hiera yaml (Ruby yaml) 一起工作我发现 ruby​​ yaml 也非常敏感的一件事是识别,避免使用制表符。所以上面的例子应该像两行一样,有相同数量的空格,第一行是myarray: [String1, String2, String3,,第二行是`String4,String5,String5,String7]`

以上是关于YAML中多行字符串的配置方法的主要内容,如果未能解决你的问题,请参考以下文章

springboot不同版本加载yaml中的配置问题

Golang项目中引入yaml.v2配置文件

pytest参数化之yaml文件操作05

从yaml文件读取配置,然后修改配置,怎样更新到yaml文件

在yaml-cpp中为yaml变量返回bool的任何方法?

spring配置文件(application.propertiesapplication.ymlapplication.yaml))中的配置项加载到自定义类中的方法