Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拆下'-';Ruby中JSON键中的除法器_Ruby_Json_Key Value - Fatal编程技术网

拆下'-';Ruby中JSON键中的除法器

拆下'-';Ruby中JSON键中的除法器,ruby,json,key-value,Ruby,Json,Key Value,我正在尝试从TumblrAPI读取一些JSON数据 我使用HashieGem将值作为对象属性读取。这会使阅读更容易/更干净 它变成这样: data['post']['title'] regular-title: Mijn eerste post format: html regular-body: <p>post</p> convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-ke

我正在尝试从TumblrAPI读取一些JSON数据

我使用HashieGem将值作为对象属性读取。这会使阅读更容易/更干净

它变成这样:

data['post']['title']
regular-title: Mijn eerste post
format: html
regular-body: <p>post</p>
convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-key":"value-value"}}'))
为此:

data.post.title
不幸的是,有些键显示为“-”分隔符,如下所示:

data['post']['title']
regular-title: Mijn eerste post
format: html
regular-body: <p>post</p>
convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-key":"value-value"}}'))
常规标题:Mijn eerste post
格式:html
正规机构:员额

因此,我不能使用post.regular-title。有没有办法将所有的减号(-)替换为下划线(41;)?

这样就可以了:

def convert_object(data)
  case data
    when Hash
      data.inject({}) do |h,(k,v)|
        h[(k.respond_to?(:tr) ? k.tr('-', '_') : k)] = convert_object(v)
        h
      end
    when Array
      data.map { |i| convert_object(i) }
    else
      data
  end
end
您可以这样使用它:

data['post']['title']
regular-title: Mijn eerste post
format: html
regular-body: <p>post</p>
convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-key":"value-value"}}'))

Karaszi Istvan在解决方案上帮了我很多。我在散列中添加了对数组的检查。这样,散列中数组中的散列也将被下划线

def convert_hash(hash)
  case hash
  when Hash
    hash.inject({}) do |h,(k,v)|
      h[k.tr('-', '_')] = convert_hash(v)
      h
    end
  when Array
    array = hash
    number = 0
    array.each do 
      array[number] = convert_hash(array[number])
      number += 1
    end
    array
  else
    hash
  end
end

我不知道为什么我添加了“数字”作为迭代器。不知怎的,hash.each都不起作用。

谢谢,你的解决方案帮了我很大的忙。这看起来比我难看的编码要好:)。