如何解析哈希数组(字符串)

时间:2018-02-16 13:22:45

标签: ruby

我有以下数组:

["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]

我从redis获取此数组,我需要迭代并访问id和name键。我真的需要在每次迭代中调用JSON.parse吗?

如何迭代和显示数据?

2 个答案:

答案 0 :(得分:1)

首先,循环没有错:

arr = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
arr.map {|raw| JSON.parse(raw) }

现在,如果出于任何原因你想避免循环,这里有一些有趣的选择:

arr = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
JSON.parse "[#{arr.join(",")}]"

所以:用“,”加入数组,创建一个我们放在“[]”之间的字符串 - 这会将您的JSON编码值列表转换为单个JSON编码数组。

这再说一遍 - 循环没有错。

答案 1 :(得分:0)

关于你的问题,如果你需要用地图方法做到这一点,你已经在评论和马丁的替代方案中得到了答案。

这是一种将逻辑与您的观点分开的方法,如Sergio建议

控制器,模型或帮助文件中的某处

class Visitor
  require 'json'
  def initialize string
    hash = JSON.parse(string)
    @id   = hash["id"]
    @name = hash["name"]
  end

  def to_s
    "#{@id}: #{@name}"
  end
end

class Visitors
  include Enumerable

  @@visitors = []
  def initialize array
    array.map{|visitor| @@visitors << Visitor.new(visitor)}
  end

  def each
    @@visitors.map{|visitor| yield visitor}
  end
end


array = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
visitors =  Visitors.new(array)

在你看来

visitors.each do |visitor|
  <%=visitor%>
end

# 1: A
# 20: B