如何用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.decodeActiveSupport::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