我正在寻找一种简单的方法来解析JSON,提取值并将其写入Rails中的数据库。

具体来说,我正在寻找的是一种方法,从从位返回的JSON中提取shortUrl。ly API:

{
  "errorCode": 0,
  "errorMessage": "",
  "results":
  {
    "http://www.foo.com":
    {
       "hash": "e5TEd",
       "shortKeywordUrl": "",
       "shortUrl": "http://bit.ly/1a0p8G",
       "userHash": "1a0p8G"
    }
  },
  "statusCode": "OK"
}

然后把那个短URL写进一个与长URL相关的ActiveRecord对象。

这是我可以完全从概念上思考的事情之一,当我坐下来执行时,我意识到我有很多东西要学习。


当前回答

这些答案有点过时了。因此,我给你:

hash = JSON.parse string

Rails会自动为你加载json模块,所以你不需要添加require 'json'。

其他回答

橙汁宝石(https://github.com/ohler55/oj)应该工作。它简单快捷。

http://www.ohler.com/oj/#Simple_JSON_Writing_and_Parsing_Example

require 'oj'

h = { 'one' => 1, 'array' => [ true, false ] }
json = Oj.dump(h)

# json =
# {
#   "one":1,
#   "array":[
#     true,
#     false
#   ]
# }

h2 = Oj.load(json)
puts "Same? #{h == h2}"
# true

Oj宝石对JRuby不起作用。对于JRuby, this (https://github.com/ralfstx/minimal-json)或this (https://github.com/clojure/data.json)可能是不错的选择。

在Rails中解析JSON非常简单:

parsed_json = ActiveSupport::JSON.decode(your_json_string)

让我们假设,您希望将shortUrl与之关联的对象是一个Site对象,该对象具有两个属性——short_url和long_url。然后,要获得shortUrl并将其与适当的Site对象相关联,您可以这样做:

parsed_json["results"].each do |longUrl, convertedUrl|
  site = Site.find_by_long_url(longUrl)
  site.short_url = convertedUrl["shortUrl"]
  site.save
end

这个答案相当古老。Pguardiario拿到了。

一个可以查看的站点是Ruby的JSON实现。这个网站提供了一个gem,你可以安装一个更快的C扩展变体。

根据给出的文档页面的基准测试,他们声称它比ActiveSupport::JSON.decode快21.500倍

代码将与Milan Novota的回答相同,但解析将只是:

parsed_json = JSON(your_json_string)
require 'json'
out=JSON.parse(input)

这将返回一个哈希

RUBY区分大小写。

require 'json' # json must be lower case

JSON.parse(<json object>)  

例如

JSON.parse(response.body) # JSON must be all upper-case