2012-03-09 1 views
3
#!/usr/bin/env ruby 

require 'json' 

class A 
    def to_json(*a) 
    { :a => 'a' }.to_json(*a) 
    end 
end 

class B < A 
    def to_json(*a) 
    super({ :b => 'b' }) 
    end 
end 

puts B.new.to_json 

내가 그것을 합리적인 방법으로하위 클래스에서 Ruby의 to_json을 사용하고 super의 json을 포함하려면 어떻게해야합니까?

{"a":"a", "b":"b"} 

을 생산하기 위해 어떻게합니까

{"a":"a"} 

생산?

저는 Ruby 1.9.3과 최신 json gem을 사용하고 있습니다.

관련 질문은 다음과 같습니다. * a to_json에 대한 인수는 무엇입니까? 나는 아무 쓸모없는 문서를 샅샅이 뒤졌다.

답변

1

{:a=>'a'}{:b=>'b'} 두 클래스로 구성된 두 개의 해시가 캡슐화되어 외부 세계에 표시되지 않습니다. 내가 볼 수있는 유일한 방법은 json 문자열을 해시로 구문 분석하고 병합 한 다음 결과를 json으로 변환하는 것입니다. 여기

class B < A 
    def to_json(*a) 
    JSON.parse(super).merge({:b=>'b'}).to_json 
    end 
end 

그러나

작은 차이가있을 것입니다 : 당신은 {:a=>'a',:b=>'b'}을 병합하고 *a

+0

"* A는 JSON 형식에 대한 옵션을 설정하는 매개 변수입니다 JSON 형식에 대한 옵션을 설정하는 매개 변수입니다 {"a":"a","b":"b"}

을 가지고있어 ". 나는 그것을 볼 수있다. 그러나 법적 선택은 무엇인가? – dfrankow

+0

솔직히, 나는 그것을 사용하는 어떤 예를 보지 못했다. – megas

1

다른 메소드 json_map이 있습니다.

#!/usr/bin/env ruby 

require 'json' 

class A 
    def to_json(*a) 
    json_map.to_json(*a) 
    end 

    def json_map 
    { :a => 'a' } 
    end 
end 

class B < A 
    def json_map 
    map = super 
    map[:b] = 'b' 
    map 
    end 
end 

puts B.new.to_json 

아마도 더 아름다운 해결책이있을 수 있습니다. 그러나 이것은 효과적 일 수 있습니다.

관련 문제