из JSON в рубиновый хэш? - PullRequest
       13

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

45 голосов
/ 29 января 2012

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

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 ]

97 голосов
/ 29 января 2012

Вы хотите 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.

2 голосов
/ 29 января 2012

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

>> require 'json'
=> true
>> a = {"1" => "2"}
=> {"1"=>"2"}
>> b = JSON.dump(a)
=> "{\"1\":\"2\"}"
>> c = JSON.load(b)
=> {"1"=>"2"}
2 голосов
/ 29 января 2012

вот пример:

require 'json'

source_hash = {s: 12, f: 43}
json_string = JSON.generate source_hash
back_to_hash = JSON.parse json_string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...