我试图生成一个地图,然后将其转换为yaml文件,如下所示:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
Run Code Online (Sandbox Code Playgroud)
我认为在创建地图时我遗漏了一些重要的东西.我的代码如下.
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type T struct {
cn string
street string
}
func main() {
names := []string{"kasi", "remya", "nandan"}
m := make(map[string]map[string]T, len(names))
for _, name := range names {
//t := T{cn: "Chaithra", street: "fkmp"}
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
}
fmt.Println(m)
y, _ := yaml.Marshal(&m)
fmt.Println(string(y))
//fmt.Println(m, names)
}
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
panic: runtime error: …
Run Code Online (Sandbox Code Playgroud) 我尝试在我的application.yml configration中使用env变量,如:
spring:
main:
show_banner: false
---
spring:
profiles: production
server:
address: $OPENSHIFT_DIY_IP
port: $OPENSHIFT_DIY_PORT
Run Code Online (Sandbox Code Playgroud)
但是env变量没有解决.我必须提供不同的符号吗?
在Rails中,您可以使用<%= ENV ['FOOVAR']%>
唯一的选择是运行应用程序,如:
java -jar my.jar --server.address=$OPENSHIFT_DIY_IP --server.port=$OPENSHIFT_DIY_PORT
Run Code Online (Sandbox Code Playgroud) 所以,我知道我可以这样做:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist: *sites
Run Code Online (Sandbox Code Playgroud)
并拥有sitelist
和anotherlist
都包含www.foo.com
和www.bar.com
.不过,我真正想要的是anotherlist
对还包含www.baz.com
,而无需重复www.foo.com
和www.baz.com
.
这样做会在YAML解析器中出现语法错误:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist: *sites
- www.baz.com
Run Code Online (Sandbox Code Playgroud)
只使用锚和别名,似乎不可能做我想要的而不添加另一级子结构,例如:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist:
- *sites
- www.baz.com
Run Code Online (Sandbox Code Playgroud)
这意味着此YAML文件的使用者必须了解它.
有一种纯粹的YAML方式做这样的事情吗?或者我是否必须使用一些后YAML处理,例如实现变量替换或自动提升某些类型的子结构?我已经在进行那种后处理来处理其他一些用例,所以我并不完全厌恶它.但我的YAML文件将由人类编写,而不是由机器生成,因此我希望尽量减少用户在标准YAML语法之上需要记忆的规则数量.
我也希望能够用地图做类似的事情:
namedsites: &sites
Foo: www.foo.com
Bar: www.bar.com
moresites: *sites
Baz: www.baz.com
Run Code Online (Sandbox Code Playgroud)
我有一个搜索YAML规范,但找不到任何东西,所以我怀疑答案只是"不,你不能这样做".但是,如果有人有任何想法会很棒.
编辑:由于没有答案,我假设没有人发现我在YAML规范中没有的任何东西,并且这不能在YAML层完成.所以我打开了一个问题,想要对YAML进行后处理以帮助解决这个问题,以防将来有人发现这个问题.
我想在YAML中合并数组,并通过ruby加载它们 -
some_stuff: &some_stuff
- a
- b
- c
combined_stuff:
<<: *some_stuff
- d
- e
- f
Run Code Online (Sandbox Code Playgroud)
我想将组合数组作为 [a,b,c,d,e,f]
我收到错误:在解析块映射时没有找到预期的键
如何在YAML中合并数组?
Vim似乎没有正确地对YAML文件中的破折号进行反应,因此打破了格式.
例如,我有一个块应该是这样的:
handlers:
- name: restart exim4
service: name=exim4 state=restarted
Run Code Online (Sandbox Code Playgroud)
当我完成输入restart exim4
并输入service:
Vim reindents时,我的最后service
一行:
handlers:
- name: restart exim4
service: name=exim4 state=restarted
Run Code Online (Sandbox Code Playgroud)
很明显,Vim尝试按列排列句子,但这不是YAML所需要的.我想创建一个包含两个值的数组.
如何解决?
更新宝石后我得到了这个:
/home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 182 column 9 (Psych::SyntaxError)
from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:119:in `parse'
from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:106:in `load'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:6:in `<module:LATEX>'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:3:in `<top (required)>'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `<top (required)>'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `<top (required)>'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `block in require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler.rb:120:in `require'
from /home/megas/Work/railscasts/config/application.rb:10:in `<top (required)>'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `require'
from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `block in …
Run Code Online (Sandbox Code Playgroud) YAML文件中的变量是否可能?例如:
theme:
name: default
css_path: compiled/themes/$theme.name
layout_path: themes/$theme.name
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如何theme: name: default
在其他设置中使用?语法是什么?
我是YAML的新手,一直在寻找解析YAML文件和使用/访问解析后的YAML数据的方法.
我遇到了关于如何解析YAML文件的解释,例如,PyYAML 教程," 我如何在Python中解析YAML文件 "," 将Python dict转换为对象? ",但我没有找到的是关于如何从解析的YAML文件访问数据的简单示例.
假设我有一个YAML文件,例如:
treeroot:
branch1: branch1 text
branch2: branch2 text
Run Code Online (Sandbox Code Playgroud)
如何访问"branch1 text"文本?
" YAML解析和Python? "提供了一个解决方案,但是我在从更复杂的YAML文件访问数据时遇到了问题.而且,我想知道是否有一些标准的方法从解析的YAML文件访问数据,可能类似于" 树迭代 "或" 元素路径 "符号或解析XML文件时将使用的东西?
我试图在yaml中存储一些配置变量,表示为关联数组,也就是字典.我是这样做的:
content_prices:
- {country: AU, price: 6990000}
- {country: AT, price: 4990000}
- {country: BE, price: 4990000}
Run Code Online (Sandbox Code Playgroud)
当我尝试从我的ROR init文件解析它时会产生异常:
undefined方法`symbolize_keys!' 为零:NilClass
以下是我如何创建它:
Config = YAML.load_file("#{Rails.root}/config/prices.yml")[Rails.env].symbolize_keys!
Run Code Online (Sandbox Code Playgroud)
我猜我的yaml语法错了,那怎么写得好呢?