2010-12-31 4 views
4

개체를 JSON에 직렬화하고 파일에 쓰고 다시 읽으려고합니다. 이제 json.net 같은 곳에서 .net과 같은 것을 기대할 수 있습니다.Ruby 객체를 JSON으로 순차적으로 직렬화하고 다시로드 하시겠습니까?

JsonSerializer.Serialize(obj); 

이 작업을 완료해야합니다. JSON 문자열을 돌려 받는다.

Ruby에서 어떻게합니까? 레일 없음, ActiveRecord 없음, 아무것도 없습니다. 내가 찾을 수없는 보석이 있니?

puts JSON.generate([obj]) 

OBJ가 객체 같다 :

class CrawlStep 

    attr_accessor :id, :name, :next_step 

    def initialize (id, name, next_step) 
    @id = id 
    @name = name 
    @next_step = next_step 
    end 
end 

obj = CrawlStep.new(1, 'step 1', CrawlStep.new(2, 'step 2', nil)) 

모든 내가 돌아 얻을 :

["#<CrawlStep:0x00000001270d70>"] 

내가 뭘

는 내가 JSON의 보석 및 전화 설치 잘못된?

답변

14

가장 쉬운 방법은 to_json 방법과 json_create 방법을 만드는 것입니다. 귀하의 경우, 당신은이 작업을 수행 할 수 있습니다

class CrawlStep 
    # Insert your code here (attr_accessor and initialize) 

    def self.json_create(o) 
    new(*o['data']) 
    end 

    def to_json(*a) 
    { 'json_class' => self.class.name, 'data' => [id, name, next_step] }.to_json(*a) 
    end 
end 

은 그럼 당신은 JSON.dump(obj)를 호출하여 직렬화 및 JSON.parse(obj)로를 unserialize. to_json에있는 해시의 데이터 부분은 무엇이든 될 수 있지만 new/ initialize에 해당하는 매개 변수를 유지하는 것이 좋습니다. 저장해야 할 다른 것이 있으면 여기에 넣고 어쨌든 구문을 분석하여 json_create에 설정해야합니다.

+0

위대한 작품 - 감사합니다. – sirrocco

+1

json gem 소스를 살펴볼 때까지 create_additions 옵션을 true로 설정하여 옵션 해시를 전달해야한다는 사실을 알게 될 때까지이 방법은 저에게 적합하지 않았습니다. 예 : 'JSON.parse (obj, create_additions : true)'또는'JSON.load (str, nil, create_additions : true)'를 호출합니다. 그렇지 않으면 기본적으로 false로 설정됩니다. 적어도 버전 1.5.5의 경우입니다. – cjross

관련 문제