【问题标题】:How can I convert a string in my JSON file into a Ruby hash?如何将 JSON 文件中的字符串转换为 Ruby 哈希?
【发布时间】:2019-12-19 09:03:04
【问题描述】:

我正在从我的 Rails 后端中的 Twitter API 获取推文。我能够在我的数据库中创建推文,然后将推文呈现为 JSON。但推文的一部分仍然显示为字符串。如何将此特定部分转换为 Ruby 哈希,以便我可以访问键:值对?

  • 我尝试过 .serializable_hash、.hash、to_json,但要么数据类型错误(需要为数组),要么只是添加了更多 \ 字符

  • .strip、.split、.gsub 也不起作用

  • 当我放入字符串时,它看起来像一个哈希,但我无法保存该输出

这是 json 的渲染方式:

   "media": [
      "{\"id\"=>1159941035461529600, \"id_str\"=>\"1159941035461529600\", \"indices\"=>[62, 85], \"media_url\"=>\"http://pbs.twimg.com/media/EBjwOeMVUAAVOia.jpg\", \"media_url_https\"=>\"https://pbs.twimg.com/media/EBjwOeMVUAAVOia.jpg\", \"url\"=>\"https://t.asdco/mFwUSlGEpv\", \"display_url\"=>\"pic.twitter.com/mFwUSlGEpv\", \"expanded_url\"=>\"https://twitter.com/CommonBlackGirI/status/1159941046161170432/photo/1\", \"type\"=>\"photo\", \"sizes\"=>{\"thumb\"=>{\"w\"=>150, \"h\"=>150, \"resize\"=>\"crop\"}, \"medium\"=>{\"w\"=>1122, \"h\"=>819, \"resize\"=>\"fit\"}, \"large\"=>{\"w\"=>1122, \"h\"=>819, \"resize\"=>\"fit\"}, \"small\"=>{\"w\"=>680, \"h\"=>496, \"resize\"=>\"fit\"}}}"
    ]

我尝试在序列化程序文件中创建一个方法,但这不起作用,因为它只是字符串,而不是可遍历的哈希

  def media_url
    tweet = self.object
    tweet.media[0]
  end

我想将上面的字符串转换为 Ruby 哈希,以便我可以获取每条推文的 media_url

【问题讨论】:

  • JSON.parse 似乎是你要找的东西
  • 这是一个 Ruby Hash 被原始发出,而不是作为 JSON 对象发出。渲染时尝试to_jsonmedia_url 不渲染,但其他东西会。
  • 我试过 JSON.parse,得到了这种错误:JSON::ParserError (767: unexpected token at '{"screen_name"=>"KimberlyNFoster", "name"=>"Kimberly Nicole Foster ", "id"=>142116606, "id_str"=>"142116606", "indices"=>[0, 16]}')
  • to_json 添加了更多 "\" => "\"{\\\"screen_name\\\"=\\u003e\\\"KimberlyNFoster\\\", \\\"name\\ \"=\\u003e\\\"金佰利妮可福斯特\\\", \\\"id\\\"=\\u003e142116606, \\\"id_str\\\"=\\u003e\\\"142116606 \\\", \\\"索引\\\"=\\u003e[0, 16]}\""
  • 你是怎么做到的? h[:"media"][0] 的对象不是有效的 json (它看起来像 Hash 通过 to_s 转换为 String)如果您需要将 Hash 转换为 JSON,方法是 to_json 但您应该解释首先这是如何生成的,或者只是使用 twitter gem 而不必太担心实现

标签: ruby-on-rails json ruby


【解决方案1】:

我认为这样的事情会有所帮助:

def media_url
  tweet = self.object
  JSON.parse(tweet.media[0].gsub('=>', ':'))["media_url"]
end

您需要将=> 替换为: 才能使JSON.parse 工作

或者

要获得完整的哈希,您可以使用更通用的方法,例如 media

def media
  tweet = self.object
  JSON.parse(tweet.media[0].gsub('=>', ':'))
end

【讨论】:

  • 这很完美!谢谢!我尝试使用 gsub,但试图摆脱“\\”。你的用例要好得多
猜你喜欢
  • 2013-07-06
  • 2014-09-24
  • 1970-01-01
  • 2010-11-05
  • 2011-12-19
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多