如何将JSON文件中的字符串转换为Ruby哈希?

3

我正在从Twitter API中获取推文并在我的Rails后端进行处理。 我能够在我的数据库中创建推文,然后将推文呈现为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。

6
JSON.parse 似乎是你正在寻找的。 - max pleaner
这是一个 Ruby Hash 被原样输出而不是作为 JSON 对象的问题。在渲染时尝试使用 to_jsonmedia_url 没有被渲染,但其他东西被渲染了。 - tadman
我尝试使用JSON.parse,出现了这样的错误: JSON::ParserError (767: 在'{"screen_name"=>"KimberlyNFoster", "name"=>"Kimberly Nicole Foster", "id"=>142116606, "id_str"=>"142116606", "indices"=>[0, 16]}'中出现了意外的标记) - Jasterix
to_json 添加了更多的“\” => ""{\"screen_name\"=\u003e\"KimberlyNFoster\", \"name\"=\u003e\"Kimberly Nicole Foster\", \"id\"=\u003e142116606, \"id_str\"=\u003e\"142116606\", \"indices\"=\u003e[0, 16]}"" - Jasterix
你是怎么得到那个的?在 h[:"media"][0] 处的对象不是有效的 JSON(它看起来像是一个通过 to_s 转换为 StringHash)。如果你需要将 Hash 转换为 JSON,方法是 to_json,但首先你应该解释一下这是如何生成的,或者只需使用 twitter gem,并不太担心实现。 - engineersmnky
1个回答

4

我认为这样的东西会有所帮助:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接