将YAML中的别名与Ruby一起使用
我有以下YAML:将YAML中的别名与Ruby一起使用,ruby,yaml,Ruby,Yaml,我有以下YAML: - PRO_PLAN: - description: This is the Pro plan publicName: Pro Plan startDate: 12-20-2015 - PRO_MONTHLY_DIRECT: - publicName: Pro Monthly price: 20 sub_target: zone - PRICING_COMPONENTS: &pro_entitlem
- PRO_PLAN:
- description: This is the Pro plan
publicName: Pro Plan
startDate: 12-20-2015
- PRO_MONTHLY_DIRECT:
- publicName: Pro Monthly
price: 20
sub_target: zone
- PRICING_COMPONENTS: &pro_entitlements
analytics_range: 21600
rules: 10
cannon: true
- PRO_ANNUAL_DIRECT:
- publicName: Pro Annual
price: 240
sub_target: zone
- PRICING_COMPONENTS:
<<: *pro_entitlements
我不是YAML高手,但看起来你使用了错误的语法。试试这个:
-
PRO_PLAN:
-
description: "This is the Pro plan"
publicName: "Pro Plan"
startDate: 12-20-2015
-
PRO_MONTHLY_DIRECT:
-
price: 20
publicName: "Pro Monthly"
sub_target: zone
-
PRICING_COMPONENTS: &pro_entitlements
-
analytics_range: 21600
cannon: true
rules: 10
works: true
-
PRO_ANNUAL_DIRECT:
-
price: 240
publicName: "Pro Annual"
sub_target: zone
-
PRICING_COMPONENTS:
-
<<: *pro_entitlements
-
专业计划:
-
描述:“这是专业计划”
公共名称:“专业计划”
起始日期:12-20-2015
-
PRO_月刊(PRO_DIRECT):
-
价格:20
publicName:“专业月刊”
次级目标:区域
-
定价\u组件:&专业\u权利
-
分析范围:21600
坎农:是的
规则:10
作品:真的
-
专业人员年度指导:
-
售价:240
公共名称:“专业年度”
次级目标:区域
-
定价单元组件:
-
似乎正确的语法是为定价组件的subHash
添加缩进:
---
- PRO_PLAN:
- description: This is the Pro plan
publicName: Pro Plan
startDate: 12-20-2015
- PRO_MONTHLY_DIRECT:
- publicName: Pro Monthly
price: 20
sub_target: zone
- PRICING_COMPONENTS: &pro_entitlements
analytics_range: 21600
rules: 10
cannon: true
- PRO_ANNUAL_DIRECT:
- publicName: Pro Annual
price: 240
sub_target: zone
- PRICING_COMPONENTS:
<<: *pro_entitlements
---
-专业计划:
-说明:这是Pro计划
公众名称:专业计划
起始日期:12-20-2015
-PRO_月刊(PRO_DIRECT):
-公众名称:专业月刊
价格:20
次级目标:区域
-定价\u组件:&专业\u权利
分析范围:21600
规则:10
坎农:是的
-专业人员年度指导:
-公众名称:专业年刊
售价:240
次级目标:区域
-定价单元组件:
当我需要构建更复杂的YAML文档时,我通常从使用Ruby和Ruby的哈希和数组对象开始。YAML序列化程序知道如何构建别名和锚定,如果我们允许,它将这样做:
require 'yaml'
foo = {'foo' => 1}
bar = {'bar' => 2, 'foo' => foo}
baz = {'baz' => 3, 'foo' => foo}
puts [foo, bar, baz].to_yaml
# >> ---
# >> - &1
# >> foo: 1
# >> - bar: 2
# >> foo: *1
# >> - baz: 3
# >> foo: *1
这里它为foo
数组创建一个别名,然后在序列化哈希数组时引用它
对YAML使用相同的想法:
require 'yaml'
PRO_ENTITLEMENTS = {
'analytics_range' => 21600,
'rules' => 10,
'cannon' => true
}
doc = [
{
'PRO_PLAN' =>
[
{
'description' => 'This is the Pro plan',
'publicName' => 'Pro Plan',
'startDate' => '12-20-2015'
},
{
'PRO_MONTHLY_DIRECT' =>
[
{
'publicName' => 'Pro Monthly',
'price' => 20,
'sub_target' => 'zone'
},
{
'PRICING_COMPONENTS' => PRO_ENTITLEMENTS,
'analytics_range' => 21600,
'rules' => 10,
'cannon' => true
}
]
},
{
'PRO_ANNUAL_DIRECT' =>
[
{
'publicName' => 'Pro Annual',
'price' => 240,
'sub_target' => 'zone'
},
{
'PRICING_COMPONENTS' => PRO_ENTITLEMENTS,
}
]
}
]
}
]
puts doc.to_yaml
运行它会返回:
---
- PRO_PLAN:
- description: This is the Pro plan
publicName: Pro Plan
startDate: 12-20-2015
- PRO_MONTHLY_DIRECT:
- publicName: Pro Monthly
price: 20
sub_target: zone
- PRICING_COMPONENTS: &1
analytics_range: 21600
rules: 10
cannon: true
analytics_range: 21600
rules: 10
cannon: true
- PRO_ANNUAL_DIRECT:
- publicName: Pro Annual
price: 240
sub_target: zone
- PRICING_COMPONENTS: *1
这并不能保证是适合您使用的正确输出,只是一个如何在Ruby中构建结构并让YAML输出它的示例,这样您就可以看到序列化后它应该是什么样子
我们可以运行往返测试:
YAML.load(doc.to_yaml)
# => [{"PRO_PLAN"=>
# [{"description"=>"This is the Pro plan",
# "publicName"=>"Pro Plan",
# "startDate"=>"12-20-2015"},
# {"PRO_MONTHLY_DIRECT"=>
# [{"publicName"=>"Pro Monthly", "price"=>20, "sub_target"=>"zone"},
# {"PRICING_COMPONENTS"=>
# {"analytics_range"=>21600, "rules"=>10, "cannon"=>true},
# "analytics_range"=>21600,
# "rules"=>10,
# "cannon"=>true}]},
# {"PRO_ANNUAL_DIRECT"=>
# [{"publicName"=>"Pro Annual", "price"=>240, "sub_target"=>"zone"},
# {"PRICING_COMPONENTS"=>
# {"analytics_range"=>21600, "rules"=>10, "cannon"=>true}}]}]}]
我认为Ruby YAML语法分析器失败来检测错误。如果您试图在我的
ruamel.yaml
解析器上来回执行此操作(基于Python,这将保留别名/锚点名称和我很高兴它起到了作用。利用Ruby输出YAML的能力没有什么错。我最喜欢的物理老师告诉我,聪明人很懒惰,会找到简单的方法做事。如果它适合你的大脑,就使用它。谢谢你,它太棒了。让我更聪明yaml解决了它自己奇怪的语法…谢谢你!我更喜欢认为它是恶魔。很高兴它有帮助。
YAML.load(doc.to_yaml)
# => [{"PRO_PLAN"=>
# [{"description"=>"This is the Pro plan",
# "publicName"=>"Pro Plan",
# "startDate"=>"12-20-2015"},
# {"PRO_MONTHLY_DIRECT"=>
# [{"publicName"=>"Pro Monthly", "price"=>20, "sub_target"=>"zone"},
# {"PRICING_COMPONENTS"=>
# {"analytics_range"=>21600, "rules"=>10, "cannon"=>true},
# "analytics_range"=>21600,
# "rules"=>10,
# "cannon"=>true}]},
# {"PRO_ANNUAL_DIRECT"=>
# [{"publicName"=>"Pro Annual", "price"=>240, "sub_target"=>"zone"},
# {"PRICING_COMPONENTS"=>
# {"analytics_range"=>21600, "rules"=>10, "cannon"=>true}}]}]}]
expected a mapping or list of mappings for merging, but found scalar
in "<byte string>", line 11, column 27:
- PRICING_COMPONENTS: &pro_entitlements
^
- PRICING_COMPONENTS: &pro_entitlements
analytics_range: 21600
rules: 10
cannon: true