ruby – 如何使用文字标量样式在YAML中转储字符串?

我有一大串格式化数据(例如 JSON),我希望在保留格式的同时使用Psych in ruby​​转储到YAML.

基本上,我希望JSON使用literal style出现在YAML中:

---
json: |
  {
    "page": 1,"results": [
      "item","another"
    ],"total_pages": 0
  }

但是,当我使用YAML.dump时,它不使用文字样式.我得到这样的东西:

---
json: ! "{\n  \"page\": 1,\n  \"results\": [\n    \"item\",\"another\"\n  ],\n  \"total_pages\":
  0\n}\n"

我怎么能告诉Psych将scalars转换为想要的风格?

解:

非常感谢Aaron Patterson提出的我正在扩展的解决方案:https://gist.github.com/2023978

虽然有点冗长,但这个要点是一种标记ruby中某些字符串的工作方式,使用YAML中的文字样式输出.

解决方法

require 'psych'

# Construct an AST
visitor = Psych::Visitors::YAMLTree.new({})
visitor << DATA.read
ast = visitor.tree

# Find all scalars and modify their formatting
ast.grep(Psych::Nodes::Scalar).each do |node|
  node.plain  = false
  node.quoted = true
  node.style  = Psych::Nodes::Scalar::LIteraL
end

begin
  # Call the `yaml` method on the ast to convert to yaml
  puts ast.yaml
rescue
  # The `yaml` method was introduced in later versions,so fall back to
  # constructing a visitor
  Psych::Visitors::Emitter.new($stdout).accept ast
end

__END__
{
  "page": 1,"results": [
    "item","another"
],"total_pages": 0
}

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...