2012-12-03 3 views
0

JSON 생성 문자열 유지 특성 이름을 만들 수있는 방법이 있습니까? 이 모델에서 : 그것을 아직도 할 수있는 방법이 있나요JSON 클래스 속성 이름을 유지하는 방법은 무엇입니까?

{ 
    "json_class": "Person", 
    "data": 
    { 
     "name" : "John" 
    } 
} 

:

class Person 
    attr_accessor :name 

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

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

JSON이 문자열 생성

{ 
    "json_class": "Person", 
    "data": ["John"] 
} 

을하지만이 같은 문자열을 원했다 이름으로 속성에 액세스 하시겠습니까? 마찬가지로 : 특정 속성에 필터링하려면

def to_json(*a) 
    { 'json_class' => self.class.name, 'data' => attributes }.to_json(*a) 
end 

, 당신은이 작업을 수행 할 수 있습니다 :

person.name 
+0

예, 당신 말이 맞아. 나는 그것을 이미 편집 했으므로 지금은 OK이다. 도움을 주신 mikhailvs. – Juliano

+0

다음을 시도해 보라.'JSON.parse (person.to_json (methods : [: name]))' – zx1986

+0

또는'person.as_json (methods : : name) ' – zx1986

답변

1

대신 '이름'을 지정하는 완전한 속성을 전달할 수

def to_json(*a) 
    attrs_to_use = attributes.select{|k,v| %[name other].include?(k) } 
    { 'json_class' => self.class.name, 'data' => attrs_to_use }.to_json(*a) 
end 

그리고 '이름'만 사용하려면 다음을 작성하십시오.

def to_json(*a) 
    { 'json_class' => self.class.name, 'data' => {:name => name} }.to_json(*a) 
end 
,

UPDATE

하나는 모든 속성을 처리 할 수 ​​초기화 할 수있는 방법을 명확히하기 위해, 당신은 같은 것을 할 수 있습니다

class Person 
    attr_accessor :name, :other 

    def initialize(object_attribute_hash = {}) 
    object_attribute_hash.each do |k, v| 
     public_send("#{k}=", v) if attribute_names.include?(k) 
    end 
    end 

    def attribute_names 
    %[name other] # modify this to include all publicly assignable attributes 
    end 

    def attributes 
    attribute_names.inject({}){|m, attr| m[attr] = send(attr); m} 
    end 

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

    def to_json(*a) 
    { 'json_class' => self.class.name, 'data' => attributes }.to_json(*a) 
    end 
end 
+0

OK. 그러나 Person 객체를 어셈블하기 위해 그것을 다시 파싱하고 내가 얻은 이름 속성에 액세스하려고 할 때 : 'p = JSON.parse (json_str)' 'puts p.name' 'name' 'John'I 둘 다 아닌 값 문자열을 출력하기를 원했습니다. 왜 그렇게 된거 야? – Juliano

+0

이런 방식으로 JSON 문자열에서 구문 분석 될 때 "name"속성은 배열 [[ "name", "John"]'이됩니다. 내가 뭘 놓치고 있니? – Juliano

+0

'json_create' 메소드는'new (* o [ 'data'])'를 사용하여 데이터 해시를 배열 배열로 'splatting'합니다. 'new (o [ 'data'])' – PinnyM

관련 문제