ruby - 将 json 解析为 ruby​​ 对象

标签 ruby json

在 ruby​​ 中,我如何将 json 解析为对象数组?
示例:我有 2 个类(class):

class Person 
  attr_accessor :name, :address, :email, :address
end

并且:

class Address
  attr_accessor :street, :city, :state, :person
end

当我发出请求时,我得到以下 json:

{
  "data": [
    {
      "id": 9111316,
      "name": "Mason Lee",
      "email": "normanodonnell@biospan.com",
      "address": {
        "state": "American Samoa",
        "street": "Cameron Court",
        "city": "Wakulla"
      }
    },
    {
      "id": 500019,
      "name": "Stella Weeks",
      "email": "hansenwhitfield@candecor.com",
      "address": {
        "state": "Nevada",
        "street": "Lake Street",
        "city": "Wacissa"
      }
    }
  ]
}

这个json应该被解析成一个Person的数组。
现在我正在做:

#json gem
require 'json'

#...
#parse the json and get the 'data'
parsed_json = JSON.parse json
json_data = parsed_json['data']

objects = Array.new
if json_data.kind_of?(Array)

  #add each person
  json_data.each { |data|
    current_person = Person.new
    data.each { |k, v|
      current_person.send("#{k}=", v)
    }
    objects.push(current_person)
  }
end

#return the array of Person
objects

我有很多像上面例子中的对象,手动解析是不可取的。 有自动执行此操作的方法吗?

我所说的“自动化方式”是指在 java 中使用 jackson 的东西:

ObjectMapper mapper = new ObjectMapper();
List<Person> myObjects = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, Person.class));

最佳答案

您可以使用散列初始化 Person:

json_data = JSON.parse(json)['data']
json_data.map do |data|
  Person.new data
end

class Person 
  attr_accessor :name, :email, :address

  def initialize params
    params.each { |k,v| klass.public_send("#{k}=",v) }
  end 
end

如果你想动态选择类,你可以使用:

json_data.map do |data|
  klass = 'Person'
  klass.get_const.new data

关于ruby - 将 json 解析为 ruby​​ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464740/

相关文章:

ruby - 是否有一种模式可以比较 ruby​​ 中可能为 nil 的对象?

ruby - 使用正则表达式检查字符串是否以辅音开头

javascript - jquery中如何获取json数据数组?

ruby - 如何对 Resque 执行方法或 Resque Job 类进行基准测试?

ruby - 使用私有(private) attr_accessor 时,为什么 self.attribute= 起作用,而 self.attribute 不起作用?

arrays - Ruby-将数组拆分为非常长的子数组

c# - 将硬编码的 JSON 字符串存储到变量

javascript - 在 Javascript 中添加数组对象中对象的值

java - 如何将以下 JSON 打印为漂亮的格式?

android - 改造 2.0 + RxJava + 错误 JSON 正文