Открытие строки json для удобного чтения и записи в ruby
У меня есть файл 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... Возможно ли это?
------------- ОБНОВИТЬ --------------
У меня это работает, но я уверен, что это обидит людей... поэтому я включил это ниже.
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 )
1 ответ
Самый простой способ перейти в / из 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)
Создать объект Ruby из строки JSON.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