Ruby将数组转换为哈希对象为json

时间:2016-09-09 23:02:53

标签: ruby-on-rails arrays json ruby object

我有一个动态创建的数组,如下所示:

napSchema.find({ pillows: 2 }, function(err, napTasks) {
    // ...
});

我正在尝试创建一个最终看起来像这样的json对象:

 ids =  [111,333,888]

所以我在repl中测试时尝试了这个:

{
    "cars": [{
        "id": "111"
    }, {
        "id": "333"

    }, {
        "id": "888"
    }]
}

不起作用。我不知道如何做到这一点的最好方法。我需要遍历数组吗?

3 个答案:

答案 0 :(得分:1)

因此,如果您想将ID转换为字符串,则不是很清楚。我假设没有,但如果你想把它们作为字符串,只需在地图中的i调用中添加.to_s

因此,从输出向后工作,我看到你有一个带有一个键的哈希值,值是一个键值哈希的数组。从那以后,我做了一个等价的ruby结构,hash =>哈希数组。

require 'json'
{ cars: [111,333,888].map do |i| 
    { id: i } 
  end 
}.to_json
 => "{\"cars\":[{\"id\":111},{\"id\":333},{\"id\":888}]}"

如果你在铁轨中,你不需要要求json。

对于红宝石,因为一切都是一个物体,你可以把它变成有效的单线。鉴于缺乏背景,我不能说这是否有意义。

如果你在一个对象中,你可能想要将id哈希的构建分解为一个新方法并调用它。如果它的Rails和id实际上处于您正在抓取的ActiveRecord关系中,您可以执行以下操作:

{ users: User.select(:id).first(3) }.to_json
  User Load (0.3ms)  SELECT  `users`.`id` FROM `users`  ORDER BY `users`.`id` ASC LIMIT 3
=> "{\"users\":[{\"id\":1},{\"id\":2},{\"id\":3}]}"

显然不是与你的情况完美匹配,但你应该可以从那里跑。

答案 1 :(得分:1)

我建议您使用方法Array#product

{ "cars": ["id"].product(ids).map { |k,v| { k=>v } } }
  #=> {:cars=>[{"id"=>111}, {"id"=>333}, {"id"=>888}]} 

{ "cars": ["id"].product(ids).map { |a| [a].to_h } }
  #=> {:cars=>[{"id"=>111}, {"id"=>333}, {"id"=>888}]} 

然后应用to_json

答案 2 :(得分:0)

也许这会有所帮助。

你可以像这样创建那个哈希。

car_hash = {:cars => (['id']*(ids.size)).zip(ids).map {|k, v| { k => v} }}

您可以将其转换为json。

require 'json'
car_hash.to_json