将json解析为对象ruby

将json解析为对象ruby,ruby,json,Ruby,Json,例如,我查看了不同的资源,仍然对如何将json格式解析为自定义对象感到困惑 class Resident attr_accessor :phone, :addr def initialize(phone, addr) @phone = phone @addr = addr end end 和JSON文件 { "Resident": [ { "phone": "12345", "addr": "xxxxx"

例如,我查看了不同的资源,仍然对如何将json格式解析为自定义对象感到困惑

class Resident
  attr_accessor :phone, :addr

  def initialize(phone, addr)
      @phone = phone
      @addr = addr
  end
end    
和JSON文件

{
  "Resident": [
    {
      "phone": "12345",
      "addr":  "xxxxx"
    }, {
      "phone": "12345",
      "addr": "xxxxx"
    }, {
      "phone": "12345",
      "addr": "xxxxx"
    }
  ]
}
将json文件解析为3个常驻对象的数组的正确方法是什么?

需要“json”
require 'json'

class Resident
    attr_accessor :phone, :addr

    def initialize(phone, addr)
        @phone = phone
        @addr = addr
    end
end

s = '{"Resident":[{"phone":"12345","addr":"xxxxx"},{"phone":"12345","addr":"xxxxx"},{"phone":"12345","addr":"xxxxx"}]}'

j = JSON.parse(s)

objects = j['Resident'].inject([]) { |o,d| o << Resident.new( d['phone'], d['addr'] ) }

p objects[0].phone
"12345"
班级居民 属性访问器:电话,:地址 def初始化(电话、地址) @电话 @地址=地址 结束 结束 s='{“居民”:[{“电话”:“12345”,“地址”:“xxxxx”},{“电话”:“12345”,“地址”:“xxxxx”},{“电话”:“12345”,“地址”:“xxxxx”}]}' j=JSON.parse
objects=j['Resident'].inject([]){| o,d | o以下代码更简单:

require 'json'

data = JSON.parse(json_data)
residents = data['Resident'].map { |rd| Resident.new(rd['phone'], rd['addr']) }

今天我在寻找一种可以将json转换为对象的东西,这就像一个符咒:

person = JSON.parse(json_string, object_class: OpenStruct)
这样,如果响应是数组,则可以执行
person.education.school
person[0].education.school


我之所以把它放在这里,是因为它可能对某些人有用。

我们最近发布了一个Ruby库
static_struct
,它解决了这个问题。

如果您使用的是
ActiveModel::Serializers::JSON
,您只需从_JSON(JSON)
调用
,您的对象就会被映射到这些值

class Person
  include ActiveModel::Serializers::JSON

  attr_accessor :name, :age, :awesome

  def attributes=(hash)
    hash.each do |key, value|
      send("#{key}=", value)
    end
  end

  def attributes
    instance_values
  end
end

json = {name: 'bob', age: 22, awesome: true}.to_json
person = Person.new
person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
person.name # => "bob"
person.age # => 22
person.awesome # => true
班级人员
包含ActiveModel::Serializers::JSON
属性访问器:名称、年龄、真棒
def属性=(散列)
hash.each do |键、值|
发送(“#{key}=”,值)
结束
结束
def属性
实例值
结束
结束
json={name:'bob',年龄:22,awesome:true}.to_json
person=person.new
person.from_json(json)#=>#
person.name#=>“bob”
person.age#=>22
person.awesome#=>真的

将此JSON解析为ruby散列,然后遍历该散列并创建常驻对象。@SergioTulentsev是通过使用JSON.Parse(jsonfile)实现的吗?@SergioTulentsev谢谢我得到了这部分内容,但如何适应新对象?是使用类_变量_定义的还是其他什么?只是一个说明,需要删除“xxxxx”后面的逗号,否则JSON会抱怨。这还不错,但你可以使用
可枚举映射#map
来代替每个映射。我添加了我的想法作为答案。这是最好的方法。方便,但不是自定义对象。满足了我的需要。谢谢!