Из JSON в рубиновый хэш?

Я могу пойти одним путем, используя

require 'json'

def saveUserLib(user_lib)
    File.open("/Users/name/Documents/user_lib.json","w") do |f|
    f.write($user_lib.to_json)
    end
end

uname = gets.chomp
$user_lib["_uname"] = uname
saveUserLib($user_lib)

но как мне вернуть его обратно как user_lib?

3 ответа

Решение

Ты хочешь JSON.parse или же JSON.load:

def load_user_lib( filename )
  JSON.parse( IO.read(filename) )
end

Ключ здесь заключается в использовании IO.read как простой способ загрузить строку JSON с диска, чтобы ее можно было проанализировать. Или, если у вас есть данные UTF-8 в вашем файле:

  my_object = JSON.parse( IO.read(filename, encoding:'utf-8') )

Я связался с документацией 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 из файла.

В качестве альтернативы:

def load_user_lib( filename )
  File.open( filename, "r" ) do |f|
    JSON.load( f )
  end
end

Примечание: я использовал имя "snake_case" для метода, соответствующего вашему "camelCase" saveUserLib так как это соглашение Ruby.

Вот несколько примеров:

require 'json'

source_hash = {s: 12, f: 43}
json_string = JSON.generate source_hash
back_to_hash = JSON.parse json_string

JSON.load сделает свое дело. Вот пример, который идет обоими путями:

>> require 'json'
=> true
>> a = {"1" => "2"}
=> {"1"=>"2"}
>> b = JSON.dump(a)
=> "{\"1\":\"2\"}"
>> c = JSON.load(b)
=> {"1"=>"2"}
Другие вопросы по тегам