2012-01-31 22 views
1

jsonファイルがあります。私は情報を格納するためにそれを使用しています。そのため、常に読み書きされています。ruby​​で簡単に読み書きできるjson文字列

私はまったく新しいルビーと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ファイルを簡単に読み取ることができますが、どのようにファイルに書き戻すことができますか? id 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

関連する問題