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



我已经下载了 rubygems.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"
      }
      } 

有人遇到过这个问题吗??

请帮助解决任何问题。

提前谢谢。问候普拉桑特苏塔利亚

首先,我不确定您是否需要安装 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_object 和 Enumerable#inject

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

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"]
}

最新更新