从rubygems.org/gems/json下载的JSON gem的响应 - 1.8.1

时间:2013-12-19 11:51:03

标签: ruby json

我已下载 ruby​​gems.org/gems/json/json-1.8.1.gem gem来解析JSON请求。

JSON.parse(strResponseBody)方法的预期O / P为“哈希哈希”

如果我们在下面的JSON字符串上打印JSON.parse的输出:

   {"BodyStyles":[{"k":"Car"},{"k":"Truck"},{"k":"SUV/Crossover"}]}

我们得到以下输出:

{"BodyStyles"=>[{"k"=>"Car"}, {"k"=>"Truck"}, {"k"=>"SUV/Crossover"}]} 

当我执行以下代码时,我将输出作为“数组的哈希”

   result.each{|keys,values|
      puts values.class                 ====> Coming as Array.
      values.each{|key,value|
        puts key                        ====> O/P: {"k"=>"Car"} instead of "Car"
      }
      } 

任何人都遇到过这个问题?

请帮忙解决问题。

提前致谢。 问候, Prasant Sutaria

2 个答案:

答案 0 :(得分:1)

首先,我不确定你是否需要安装JSON gem,因为我认为它已被移植到Ruby所有你需要用Ruby 1.9.3及以上版本require 'json',然后回到你的代码

{"BodyStyles"=>[{"k"=>"Car"}, {"k"=>"Truck"}, {"k"=>"SUV/Crossover"}]} 

result.each{|keys,values|
  puts values.class                # The key here is "BodyStyles" and the values is an array  
  values.each{|ele|          #since values is an Array ([{"k"=>"Car"}, {"k"=>"Truck"}, {"k"=>"SUV/Crossover"}]) then you should not do "values.each{|key,value|"
    ele.values.first         #It seems you are only interested in the values from the Hash in this case "Car", the assumption here is that you have only one key value mapping, else you might need to use ele.values instead
  }
}

有更短更优雅的方式来写这个,但这尤其取决于你。请查看Enumerable#each_with_objectEnumerable#inject

答案 1 :(得分:0)

结果是正确的。你缺少的是整个哈希是

result = {"BodyStyles"=>[{"k"=>"Car"}, {"k"=>"Truck"}, {"k"=>"SUV/Crossover"}]} 

这意味着当你执行

result.each { |keys,values| }

每个将执行一次(主哈希中只有一个项目)带参数

keys = "BodyStyles" (string)
values = [{"k"=>"Car"}, {"k"=>"Truck"}, {"k"=>"SUV/Crossover"}] (Array)

这就是声明

的原因
puts values.class

打印数组。要实现您想要的结果

result["BodyStyles"].each { |items|
  puts items["k"]
}