首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用YAML.mapping解析复杂的YAML-结构

用YAML.mapping解析复杂的YAML-结构
EN

Stack Overflow用户
提问于 2018-05-11 09:13:18
回答 1查看 452关注 0票数 3

我在YAML中有这样复杂的结构

代码语言:javascript
复制
yaml = <<-STR
'Tunisie Telecom':
  regex: 'StarTrail TT[);/ ]'
  device: 'smartphone'
  model: 'StarTrail'

Palm:
  regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino'
  device: 'smartphone'
  models:
    - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
      model: '$1 $2'
    - regex: 'Palm(?:[ \-])?((?!OS|Source|scape)[a-z0-9]+)'
      model: '$1'
STR

我试着用YAML.mapping解析它:

代码语言:javascript
复制
class Mobile
  YAML.mapping(
    name: Hash(String, Hash(String, String))
  )
end

puts Mobile.from_yaml(yaml)

得到了解析异常:

代码语言:javascript
复制
Missing yaml attribute: name at line 1, column 1 (YAML::ParseException)
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/yaml/nodes/nodes.cr:30:9 in 'raise'
  from mobiles_mapping.cr:0:3 in 'initialize'
  from mobiles_mapping.cr:20:3 in 'new'
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/yaml/from_yaml.cr:2:3 in 'from_yaml'
  from mobiles_mapping.cr:25:1 in '__crystal_main'
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:11:3 in '_crystal_main'
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:112:5 in 'main_user_code'
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:101:7 in 'main'
  from /usr/local/Cellar/crystal-lang/0.24.2_1/src/crystal/main.cr:135:3 in 'main'

但是,如果我试图使用YAML.parse进行解析:

代码语言:javascript
复制
{"Tunisie Telecom" => {"regex" => "StarTrail TT[);/ ]", "device" => "smartphone", "model" => "StarTrail"}, "Palm" => {"regex" => "(?:Pre|Pixi)/(d+).(d+)|Palm|Treo|Xiino", "device" => "smartphone", "models" => [{"regex" => "((?:Pre|Pixi))/(d+.d+)", "model" => "$1 $2"}, {"regex" => "Palm(?:[ -])?((?!OS|Source|scape)[a-z0-9]+)", "model" => "$1"}]}}

我犯了什么错?

在线示例:https://play.crystal-lang.org/#/r/41yk

UPD:我理解:宏找不到键'name‘,但是如何解析没有键的=> val,就像我的例子中只有键一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-11 12:34:29

您拥有的是一个Hash(String, Mobile),其中Mobile类似于

代码语言:javascript
复制
class Mobile
  YAML.mapping({
    regex: String,
    device: String,
    model: String?,
    models: Array(...)?
  })
end

因此,要解析应该调用Hash(String, Mobile).from_yaml

如果YAML是:

代码语言:javascript
复制
name:
  'Tunisie Telecom':
    regex: 'StarTrail TT[);/ ]'
    device: 'smartphone'
    model: 'StarTrail'

  Palm:
    regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino'
    device: 'smartphone'
    models:
      - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
        model: '$1 $2'
      - regex: 'Palm(?:[ \-])?((?!OS|Source|scape)[a-z0-9]+)'
        model: '$1'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50288944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档