2015-02-04 4 views
6

JSON에 간단한 구조체를 직렬화하려고하는데 JSON에서 해당 구조체의 인스턴스를 만들 수 없습니다. 여기 내가 어떻게 그것을하려고하는지입니다.Ruby JSON을 사용하여 struct serialize

require 'rubygems' 
require 'json' 

Person = Struct.new(:name, :age) 

json = Person.new('Adam', 19).to_json 
puts json 

me = JSON.load(json) 
puts me.name 

은 내가 다음과 같은 출력 얻을 :이 경우

"#<struct Person name=\"Adam\", age=19>" 
/usr/lib/ruby/1.9.1/json/common.rb:148:in `parse': 746: unexpected token at '"#<struct Person name=\"Adam\", age=19>"' (JSON::ParserError) 
    from /usr/lib/ruby/1.9.1/json/common.rb:148:in `parse' 
    from /usr/lib/ruby/1.9.1/json/common.rb:309:in `load' 
    from why.rb:9:in `<main>' 

답변

10

person.to_json 당신이 무엇을 기대하고 있지 않습니다.

당신 require 'json'에서, JSON 라이브러리를 다른 곳에서 제공하는 더 전문 #to_json 방법이 없다면 대체입니다 Object#to_json 방법은 삽입합니다. This inserted method은 기본적으로 객체에 #to_s#to_json을 호출하는 것과 같습니다.

여기서 Person 클래스의 경우 은 standard Object#to_s을 출력하며 기본적으로 JSON 라이브러리에서 구문 분석 할 수있는 문자열을 제공하지 않습니다.

그러나, StructHash 해당 구조체를 변환하는 데 사용할 수있는 #to_h 방법을 제공 않으며, Hash합니다 (JSON 라이브러리를 필요에 따라)를 JSON 구문 분석 출력을 생성하는 방법을 알고있다.

그래서 단순히 변경 :

json = Person.new('Adam', 19).to_json 
puts json 

에 :

person = Person.new('Adam', 19) 
puts person.to_h.to_json 

당신이 무엇을 기대 할 것입니다.

(제쳐두고, 내가 실제로 직접 #to_h#to_jsonLaw of Demeter 위반 호출로 Person 클래스 #to_json를 구현하는 것이 좋습니다.) 완벽하게 작동

+1

감사합니다. 나는 미래에 to_h 메소드가 루비 2.0에 추가되었다는 것을 읽는 사람들에게 주목하고 싶다. 그래서 만약 당신이 1.9.3을 사용한다면 당신은 업그레이드해야 할 것이다. –

관련 문제