Ответ 1
Следующий код более прост:
require 'json'
data = JSON.parse(json_data)
residents = data['Resident'].map { |rd| Resident.new(rd['phone'], rd['addr']) }
Я просмотрел разные ресурсы и все еще путаюсь, как разбирать 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-х объектов Resident?
Следующий код более прост:
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
, если ответ представляет собой массив
Я оставляю это здесь, потому что может быть полезно для кого-то
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"
Недавно мы выпустили библиотеку Ruby static_struct
, которая решает проблему. Проверьте это.
Если вы используете ActiveModel::Serializers::JSON
, вы можете просто вызвать from_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