删除“-” Ruby 中 JSON 键中的分隔符

发布于 2024-10-18 12:15:19 字数 410 浏览 1 评论 0原文

我正在尝试从 Tumblr API 读取一些 JSON 数据。

我正在使用 Hashie gem 将值读取为对象属性。这应该使阅读更容易/更清晰。

它变成这样:

data['post']['title']

变成这样:

data.post.title

不幸的是,有一些键显示为“-”作为分隔符,如下所示:

regular-title: Mijn eerste post
format: html
regular-body: <p>post</p>

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

I'm trying to read some JSON data from the Tumblr API.

I'm using the Hashie gem to read the values as object properties. This should make reading easier/cleaner.

it turns something like this:

data['post']['title']

into this:

data.post.title

Unfortunately there are some keys showing up with a '-' as divider between like this:

regular-title: Mijn eerste post
format: html
regular-body: <p>post</p>

therefore i cannot use post.regular-title. Is there a way to replace all the minus(-) symbols into underscores(_)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拥抱影子 2024-10-25 12:15:19

这样就可以了:

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

你可以这样使用它:

convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-key":"value-value"}}'))

This will do it:

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

You can use it like this:

convert_object(JSON.parse('{"something-here":"value","otherkey":{"other-key":"value-value"}}'))
桃气十足 2024-10-25 12:15:19

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 不起作用。

Karaszi Istvan helped me a lot with the solution. I added the check for an array in the hash. This way hashes in arrays in the hash will get underscored too.

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

I don't know why i added the 'number' as iterator. Somehow hash.each didn't work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文