1

jsonファイルがあります。私はそれを情報の保存に使用しているので、常に読み取りと書き込みの両方が行われます。

私は一般的にルビーとおっとに完全に慣れていないので、これについてはクレイジーな方法で行っていると確信しています。

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に辞書を追加します...これは可能ですか?

- - - - - - - アップデート - - - - - - -

私はそれを機能させました、しかしそれは人々を怒らせると確信しています...それで私はそれを以下に含めました。

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 )
4

1 に答える 1

7

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 オブジェクトを作成します。

この回答から別の質問への回答を取得しました。

ただし、必要に応じてこれをクラスにラップできます。

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
于 2012-01-31T16:47:56.550 に答える