在Ruby中,如何从散列输出json,并给它换行符和制表符

在Ruby中,如何从散列输出json,并给它换行符和制表符,ruby,json,Ruby,Json,我正在尝试格式化{“key”=>“value”}以将其转换为: { "key" : "value" } 用于写入json文件。 现在我正在做: hash = {"key" => "value"} puts hash.to_json.gsub('{', '{\n\t') 开始。这就产生了 {\n\t"key":"value"} 为什么我不能换行?对漂亮的东西和避免正则表达式都很好 使用内置方法 耶 以下是选项: 缩进:用于缩进级别的字符串(默认值:') 空格:放在后面的字符串

我正在尝试格式化
{“key”=>“value”}
以将其转换为:

{
    "key" : "value"
}
用于写入json文件。 现在我正在做:

hash = {"key" => "value"}
puts hash.to_json.gsub('{', '{\n\t')
开始。这就产生了

{\n\t"key":"value"}

为什么我不能换行?

对漂亮的东西和避免正则表达式都很好

使用内置方法

以下是选项:

  • 缩进
    :用于缩进级别的字符串(默认值:
    '
  • 空格
    :放在后面的字符串,一个
    分隔符(默认值:
    '
  • 前面的空格\u
    :放在
    对分隔符前面的字符串(默认值:
    '
  • object\u nl
    :放在JSON对象末尾的字符串(默认值:
    '
  • array\u nl
    :放在JSON数组末尾的字符串(默认值:
    '
  • allow_nan
    true
    如果
    nan
    ,则应生成
    Infinity
    -Infinity
    ,否则,如果遇到这些值,将引发异常。此选项默认为
    false
  • max_nesting
    :生成JSON的数据结构中允许的最大嵌套深度。使用
    禁用深度检查:max_nesting=>false
    ,默认值为
    100

正如@naomik提到的,尝试使用内置的“缩进”选项选项卡,例如:

require'json'
h={:key=>:value}
放置JSON.pretty_生成(h,:indent=>“\t”)
# {
#“键”:“值”
# }

pretty\u generate
的“opts”参数值记录在。

对于换行符和制表符,请重试

require 'json'
hash = {foo: 'bar'}
JSON.pretty_generate(hash, {indent: "\t", object_nl: "\n"})

注意!如果将单引号与换行符(“\n”)或制表符(“\t”)一起使用,则它们不会被解释为换行符,而是被解释为包含一个反斜杠和一个字母的普通字符串。这是一个常见的错误

有趣的发现;我发布了一个关于您的学习的后续解决方案(re:
JSON.generate
)供参考,
\n
没有扩展到新行的原因是您使用了单引号。改为使用双引号。@AJED32尝试使用双引号,但仍然会给我一个实际的“\n”而不是换行符如果您在IRB中测试它,那是因为在IRB中显示为“结果”的字符串在打印到控制台之前使用
String\inspect
进行转换。试试这个:
put'\n\n\n'
vs.
put“\n\n”
。不,我在一个通过bash脚本调用的ruby文件中测试这个。好吧,这很奇怪。所以
ruby-e'put“\n\n\n”
为您输出
\n\n\n
?实际上,这不会像pretty\u generate那样提供换行符。我认为
indent
在默认情况下是
(2个空格),而不是空字符串,否则,不指定它时就不会有缩进。这里是:
require 'json'
hash = {foo: 'bar'}
JSON.pretty_generate(hash, {indent: "\t", object_nl: "\n"})