【问题标题】:Hashtable to JSON in RubyRuby中的哈希表到JSON
【发布时间】:2018-12-16 14:38:24
【问题描述】:

我的 ruby​​ 脚本中有这个哈希表

    Table2 = {
    'Parameters' => {
        "#{splist[i]}" => {
        'Description' => "#{splist[i+1]}",
        'Type' => 'String',
        'Default' => "#{splist[i+2]}"
        },
        "#{splist[i+3]}" => {
        'Description' => "#{splist[i+4]}",
        'Type' => 'String',
        'Default' => "#{splist[i+5]}"
        },
        "#{splist[i+6]}" => {
        'Description' => "#{splist[i+7]}",
        'Type' => 'String',
        'Default' => "#{splist[i+8]}"
        },
        "#{splist[i+9]}" => {
        'Description' => "#{splist[i+10]}",
        'Type' => 'String',
        'Default' => "#{splist[i+11]}"
        }
    }
}

我将在脚本中进一步转换为 JSON,它几乎可以按预期工作。但由于某种原因,它在 Default 行中附加了一个“\n”。像这样

"Default": "10.0.0.0/16\n"

我怎样才能避免这种情况发生?

谢谢!

【问题讨论】:

  • 你试过使用String#chomp吗?示例:'Default' => "#{splist[i+11].to_s.chomp}"
  • 问题是缺少关键信息:splist[i+2](或splist[i+5],....或更可能,splist[i+11])中有什么,它是如何到达那里的?
  • 看不出这有多重要。它导致一个带有换行符的字符串,因为它显然有一个换行符。删除换行符似乎是一个安全的赌注,无论是在这里还是那里并不真正相关。
  • @ForeverZer0:删除换行 here... 有效。删除换行 earlier 可能会产生更好、更易读和更合乎逻辑的代码。 (我的猜测是换行符在最后一个 splist[i+11] 中,而 splistsplit 的结果;在这种情况下,chomp 行预拆分会更有意义,而不是处理splist[i+11] 作为规则的一个例外。)
  • @Amadan 可能,假设那里不需要换行符。无论哪种方式,它都没有相关的区别,并且很难被归类为阻止回答问题的“缺少关键信息”。我假设 OP 可以弄清楚如何将最相关和最优雅的位置添加到他们的代码中。我个人更喜欢学习如何使用工具来解决问题,不一定要一字不差地告诉你在哪里写什么。我不反对尽早修复可能是最好的解决方案,只是说对学习不重要。

标签: json ruby variables hash rubygems


【解决方案1】:

chomp 方法用于从字符串中删除行尾(除其他外)。默认情况下,如果不带参数调用,它将为您干净地删除“\n”字符。行尾很可能是由编辑器添加的,或者是任何创建字符串的机制。

为确保在添加或读取值时没有行结尾,请将chomp 方法附加到末尾。

params = Table2['Parameters'].chomp

引用自 Ruby 文档:

返回一个新的字符串,其中给定的记录分隔符从 str 的结尾(如果存在)。如果 $/ 没有从默认值更改 Ruby 记录分隔符,然后 chomp 也删除回车 字符(即它将删除 \n、\r 和 \r\n)。如果 $/ 是 空字符串,它将从字符串中删除所有尾随换行符。

【讨论】:

    【解决方案2】:

    根据你们的建议,我设法通过使用 chomp 来纠正问题,但我设法在此过程的早期添加了 @Amadan 的想法/建议,以确保以后添加的任何内容都可能避免同样的错误,“splist”的来源是从文件读取(带有一堆参数的配置文件),就像这样

    plist = []
    File.readlines(conf).each do |line|
        line.chomp!
        plist << line
    end
    

    之后立即转换为splist。

    非常感谢

    【讨论】:

    • 请注意,这可以更简洁地使用plist = File.readlines(conf).map(&amp;:chomp)
    • 正要提到同样的事情。 :)
    猜你喜欢
    • 2012-02-21
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多