Parse json для объекта ruby - программирование
Подтвердить что ты не робот

Parse json для объекта ruby

Я просмотрел разные ресурсы и все еще путаюсь, как разбирать 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?

4b9b3361

Ответ 1

Следующий код более прост:

require 'json'

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

Ответ 2

Сегодня я искал что-то, что превращает json в объект, и это работает как шарм:

person = JSON.parse(json_string, object_class: OpenStruct)

Таким образом, вы можете сделать person.education.school или person[0].education.school, если ответ представляет собой массив

Я оставляю это здесь, потому что может быть полезно для кого-то

Ответ 3

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"

Ответ 4

Недавно мы выпустили библиотеку Ruby static_struct, которая решает проблему. Проверьте это.

Ответ 5

Если вы используете 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