将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对象数组的正确方法?

以下代码更简单:

 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.schoolperson[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.name # => "bob" person.age # => 22 person.awesome # => true