如何用Ruby on RailsparsingJSON?
我正在寻找一种简单的方法来parsingJSON,提取一个值并将其写入Rails中的数据库。
具体来说,我正在寻找,是一种从bit.ly API返回的JSON中提取shortUrl
的方法:
{ "errorCode": 0, "errorMessage": "", "results": { "http://www.foo.com": { "hash": "e5TEd", "shortKeywordUrl": "", "shortUrl": "http://bit.ly/1a0p8G", "userHash": "1a0p8G" } }, "statusCode": "OK" }
然后把这个shortUrl写入一个与长URL相关联的ActiveRecord对象中。
这是我完全可以在概念上思考的事情之一,当我坐下来执行时,我意识到我有很多东西要学习。
这些答案有点过时了。 所以我给你:
hash = JSON.parse string
Rails应该为你自动加载json
模块,所以你不需要添加require 'json'
。
在Rails中parsingJSON非常简单:
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
快ActiveSupport::JSON.decode
代码将与米兰Novota的这个gem的答案相同,但parsing只是:
parsed_json = JSON(your_json_string)
这是2013年的更新。
ruby
Ruby 1.9具有C扩展的默认JSON gem 。 你可以使用它
require 'json' JSON.parse ''{ "x": "y" }' # => {"x"=>"y"}
parse!
变体可以用于安全的来源。 还有其他的gem,这可能比默认的实现更快。 请参阅multi_json列表。
轨道
Rails的现代版本使用multi_json ,它是一个可以自动使用最快的JSON gem的gem。 因此,推荐的方法是使用
object = ActiveSupport::JSON.decode json_string
请参阅ActiveSupport :: JSON获取更多信息。 特别是方法来源中的重要一行是
data = MultiJson.load(json, options)
然后在您的Gemfile中,包含您要使用的gem。 例如,
group :production do gem 'oj' end
Ruby捆绑的JSON能够自己展现一点魔力。
如果你有一个包含你想分析的JSON序列化数据的string:
JSON[string_to_parse]
JSON将查看参数,看它是一个string,并尝试解码它。
同样,如果你有一个你想序列化的散列或数组,使用:
JSON[array_of_values]
要么:
JSON[hash_of_values]
JSON会将其序列化。 如果要避免[]
方法的视觉相似性,也可以使用to_json
方法 。
这里有些例子:
hash_of_values = {'foo' => 1, 'bar' => 2} array_of_values = [hash_of_values] JSON[hash_of_values] # => "{\"foo\":1,\"bar\":2}" JSON[array_of_values] # => "[{\"foo\":1,\"bar\":2}]" string_to_parse = array_of_values.to_json JSON[string_to_parse] # => [{"foo"=>1, "bar"=>2}]
如果你以JSON为根,你可能会注意到它是YAML的一个子集,实际上,YAMLparsing器是处理JSON的东西。 你也可以这样做:
require 'yaml' YAML.load(string_to_parse) # => [{"foo"=>1, "bar"=>2}]
如果您的应用程序正在parsingYAML和JSON,则可以让YAML处理序列化数据的两种风格。
require 'json' out=JSON.parse(input)
这将返回一个哈希
require 'json' hash = JSON.parse string
使用散列工作,做你想做的事情。
OJgem( 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
Ojgem将不适用于JRuby。 对于JRuby这个( https://github.com/ralfstx/minimal-json )或这个( https://github.com/clojure/data.json )可能是不错的select。
RUBY区分大小写。
require 'json' # json must be lower case JSON.parse(<json object>)
例如
JSON.parse(response.body) # JSON must be all upper-case
Ruby有一个JSONparsing器:
require 'json'
这是我会做的:
json = "{\"errorCode\":0,\"errorMessage\":\"\",\"results\":{\"http://www.foo.com\":{\"hash\":\"e5TEd\",\"shortKeywordUrl\":\"\",\"shortUrl\":\"http://bitly/1a0p8G\",\"userHash\":\"1a0p8G\"}},\"statusCode\":\"OK\"}" hash = JSON.parse(json) results = hash[:results]
如果你知道源url,那么你可以使用:
source_url = "http://www.foo.com".to_sym results.fetch(source_url)[:shortUrl] => "http://bitly/1a0p8G"
如果您不知道源url的关键字,则可以执行以下操作:
results.fetch(results.keys[0])[:shortUrl] => "http://bitly/1a0p8G"
如果您不想使用符号来查找密钥,则可以将哈希中的密钥转换为string:
results = json[:results].stringify_keys results.fetch(results.keys[0])["shortUrl"] => "http://bitly/1a0p8G"
如果您担心JSON结构可能会更改,则可以在尝试访问密钥之前构build一个简单的JSON模式并validationJSON。 这将提供一个警卫。
注意:由于发布规则,必须修改bit.ly url。
你可以尝试这样的事情:
def details_to_json { :id => self.id, :credit_period_type => self.credit_period_type, :credit_payment_period => self.credit_payment_period, }.to_json end