2012-10-04 118 views
16

我看着不同的資源,仍然可以得到關於如何解析JSON格式的自定義對象困惑,例如解析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對象的數組?

+2

將此JSON解析爲紅寶石哈希,然後遍歷該哈希並創建Resident對象。 –

+0

@SergioTulentsev是通過使用JSON.parse(jsonfile)? –

+0

flint_stone:是的,確切的。 –

回答

26

下面的代碼更簡單:

require 'json' 

data = JSON.parse(json_data) 
residents = data['Resident'].map { |rd| Resident.new(rd['phone'], rd['addr']) } 
4
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" 
+0

這並不壞,但你可以使用'Enumerable#map'而不是每個。 –

+0

'inject'更好:) – 2012-10-04 08:43:35

+0

我加了我的想法作爲答案。 –

36

今天,我一直在尋找的東西,轉換JSON到一個對象,這個工程就像一個魅力:

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

這樣如果響應是陣列,則可以執行person.education.schoolperson[0].education.school

我將它留在這裏是因爲可能對某人有用

+4

恕我直言,最好的方式來做到這一點。 – Alu

+1

方便,但不是自定義對象。 –

2

我們最近發佈了一個解決此問題的Ruby庫static_structCheck it out

0

如果您使用的是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