2012-01-31 41 views
1

我有一個JSON文件。我正在使用它來存儲信息,因此它會不斷被讀取和寫入。打開JSON字符串,以方便讀取和寫入紅寶石

我對ruby和oop一般都是全新的,所以我相信我會以瘋狂的方式解決這個問題。

class Load 
    def initialize(save_name) 
    puts "loading " + save_name 
     @data = JSON.parse(IO.read($user_library + save_name)) 
     @subject = @data["subject"] 
     @id = @data["id"] 
     @save_name = @data["save_name"] 
     @listA = @data["listA"] # is an array containing dictionaries 
     @listB = @data["listB"] # is an array containing dictionaries 

    end 
    attr_reader :data, :subject, :id, :save_name, :listA, :listB 
end 

example = Load.new("test.json") 
puts example.id 

=> 937489327389749 

所以我現在可以輕鬆地閱讀json文件,但我怎麼能回寫到文件 - 參考示例?說我想改變編號example.id.change(7129371289) ...或將詞典添加到列表A和B ...這可能嗎?

------------- UPDATE --------------

我有工作,但我相信它會得罪人...所以我把它列入下面。

class Load 
    def initialize(save_name) 
    puts "debug printed from inside 'Load'" 
    puts "loading " + save_name 

     @data = JSON.parse(IO.read($user_library + save_name)) 
     @subject = @data["subject"] 
     @id = @data["id"] 
     @is_a = @data["is_a"] 
     @save_name = @data["save_name"] 
     @listA = @data["listA"] 
     @listB = @data["listB"] 

     def append(dataID, input) 
     puts "debug printed from inside 'Load' 'append'" 
     puts dataID 
     puts input 

      if dataID == "ListA" 
      puts "yes this is ListA" 
      append = @data 
      append["listA"] << input 
      puts append 
       File.open($user_library + append["save_name"], "w") do |f| 
       f.write(append.to_json) 
       end 
      end 

      if dataID == "ListB" 
      puts "yes this is ListB" 
      append = @data 
      append["listB"] << input 
      puts append 
       File.open($user_library + append["save_name"], "w") do |f| 
       f.write(append.to_json) 
       end 
      end 
     end  
    end 
attr_reader :data, :subject, :id, :save_name, :listA, :listB 
end 

puts "OPENING SAVED SUBJECT" 

puts Load.new("animals.json").listA 

puts "CALLING APPEND" 

new_hash = {"cow" => "horse"} 
Load.new("animals.json").append("ListA", new_hash) 

回答

5

最簡單的方法去/從JSON是隻使用JSON庫來轉換數據酌情:

  • json = my_object.to_json - 與特定對象的方法來創建一個JSON字符串。
  • json = JSON.generate(my_object) - 從對象創建JSON字符串。
  • JSON.dump(my_object, someIO) - 創建JSON字符串並寫入文件。
  • my_object = JSON.parse(json) - 從JSON字符串創建一個Ruby對象。
  • my_object = JSON.load(someIO) - 從文件創建一個Ruby對象。

摘自this answer to another of your questions

但是,你可以把這個包在一個類中,如果你想:

class JSONHash 
    require 'json' 
    def self.from(file) 
    self.new.load(file) 
    end 
    def initialize(h={}) 
    @h=h 
    end 

    # Save this to disk, optionally specifying a new location 
    def save(file=nil) 
    @file = file if file 
    File.open(@file,'w'){ |f| JSON.dump(@h, f) } 
    self 
    end 

    # Discard all changes to the hash and replace with the information on disk 
    def reload(file=nil) 
    @file = file if file 
    @h = JSON.parse(IO.read(@file)) 
    self 
    end 

    # Let our internal hash handle most methods, returning what it likes 
    def method_missing(*a,&b) 
    @h.send(*a,&b) 
    end 

    # But these methods normally return a Hash, so we re-wrap them in our class 
    %w[ invert merge select ].each do |m| 
    class_eval <<-ENDMETHOD 
     def #{m}(*a,&b) 
     self.class.new @h.send(#{m.inspect},*a,&b) 
     end 
    ENDMETHOD 
    end 

    def to_json 
    @h.to_json 
    end 

end 

上述行爲就像一個哈希,但你可以使用foo = JSONHash.from("foo.json")從磁盤加載,修改散列,你通常會,然後只需要foo.save當你想保存到磁盤。

或者,如果你沒有在磁盤上的文件以開始:

foo = JSONHash.new a:42, b:17, c:"whatever initial values you want" 
foo.save 'foo.json' 
# keep modifying foo 
foo[:bar] = 52 
f.save # saves to the last saved location 
+0

感謝,2天連續:)...我有設法得到它的方式工作,我想一想知道自己在做什麼的人看到了,就會適合。不過,我會將其作爲對原始問題的修改。 – beoliver 2012-01-31 17:05:29