将 JSON 数据嵌入到 YAML 文件中

我正在为我的桌子编写一个固定装置。其中一列接受 JSON 字符串作为值。

问题是这个夹具没有加载失败,因为:

Fixture::FormatError: a YAML error occurred parsing /home/saurajeet/code/dcbox/test/fixtures/hardware.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html
The exact error was:
ArgumentError: syntax error on line 145, col 73: `  portslist: [{"name":"ob1","port_num":0,"port_type":"network"},{"name":"ob2","port_nu'.....

有什么解决办法吗。

97187 次浏览

我相信引用这句话应该能够奏效:

portslist: '[{"name":"ob1","port_type" ... }]'

Clarkevans 对已接受答案的评论表明,对于较长的 JSON 位来说,这是一个更好的答案,因为您可以包装这些行。我查了一下他提到的 块标量语法块标量语法,想在这里举个例子:

portslist: >
[{"name":"ob1","port_num":0,"port_type":"network"},
{"name":"ob2","port_nu...

如果你有字符串,你可以像 Vlad Khomich 提到的那样简单地使用:

portslist: '[{"name":"ob1","port_num":0,"port_type":"network"},...]'

如果您正在使用 ERB 并且拥有一个对象,那么您可以使用 to _ JSON 并且进行检查来转义为一个 JSON 字符串:

portslist: <%= [{name: 'ob1', port_num: 0, port_type: 'network'},...].to_json.inspect %>

如果您有一个很大的 JSON 规范,您可以将它存储在一个单独的文件中并使用 Ruby 加载,这样您就可以保持 YAML 文件的整洁:

portslist: <%= File.read('/path/to/file.json').inspect %>

为了完整起见: 如果您正在使用 ActiveRecord::Store,您可以使用相同数据的 YAML 表示来加载数据,即使它是一个 JSON 存储:

one:
portslist:
-
name: 'ob1'
port_num: 0
port_type: 'network'
-
name: 'ob2'
port_num: 1
port_type: 'network'

在我的表中,列 Stripe _ connect的类型为 JSONB。在夹具中,以下是工作原理。请注意,外部的单引号是必需的,但方括号不是。单引号之间的所有内容都是一条长线。

 stripe_connect: '{"scope":"read_write", "livemode":false, "token_type":"bearer", "access_token":"sk_test_madeupvalue", "refresh_token":"rt_Ae29madeupvalueyX", "stripe_user_id":"acct_103yZabcdefg", "stripe_publishable_key":"pk_test_0HEOmadeupvalue"}'

|也是可能的。例如。

MyObject:
type: object
example: |
{
"id": 54,
"manufacturer": "ACME",
"location": "New York",
"createdAt": "2012-10-01 07:42:35.825565",
"description": "test",
}

看看 Yaml-multiline.info提供的精彩的互动文档和演示。我已经存档了下面的文本内容:

YAML 支持两种类型的字符串格式: < em > block 标量 和 流量标量格式(标量是 YAML 调用的格式 基本值,如数字或字符串,而不是复杂类型,如 块标量可以更好地控制它们的方式 而流标量具有更有限的转义支持。

块标量

一个块标量头有三个部分:

块样式指示符 : < a href = “ https://yaml.org/spec/1.2.2/# 812-Liter- 样式”rel = “ nofollow noReferrer”> 块样式 指示如何 块中的换行应该表现良好 保持为换行,使用 字面意思样式,用管道表示 (|)。如果你想用空格代替它们,使用 叠好了样式,用直角括号(>)表示 使用折叠样式得到一个换行,通过 放入 换行符。带有额外缩进的行也不能 折起来)

块咀嚼指示器 : 一个 href = “ https://yaml.org/spec/1.2.2.2/# 8112-block-chomping-Indicer”rel = “ nofollow noReferrer”> chomping index 控件 在字符串的 结束处换行会发生什么 默认值为 夹子,在字符串的末尾放置一个换行符 删除所有换行,通过放置一个负号(-)将它们变成 脱衣服 在样式指示器之后。剪辑和带都忽略多少 换行实际上位于块的末尾; 对于 留着,它们都是 在样式指示器后面放一个加号(+)。

缩进指示符 : 通常情况下,你用来缩进一个块的空格数会自动从它的第一个来猜测 你可能需要一个 < em > < a href = “ https://yaml.org/spec/1.2.2/# 8111-block-indentation-Indicer”rel = “ nofollow noReferrer”> block 缩进 指示器 块的第一行以额外的空格开始。在这种情况下, 只需将用于缩进的空格数(在1和9之间) 在标题的末尾。

流标量

(编辑。为 SO 重新格式化)

双引号

逃脱(像 \n)工作。此外,还可以转义新行,以防止它们被转换为空格。还可以通过留空行来添加新行。忽略行上的前导空格。

单引号

逃脱(如 \n)不做任何事情。新行可以通过留空行来添加。忽略行上的前导空格。

原味的

转义(如 \n)不做任何事情。新行可以通过留空行来添加。额外的前导空格被忽略。