2012-09-24 3 views
3

저는 파이썬 클래스와 JSON을 매우 초보자로 생각하며 올바른 방향으로 나아갈 지 확신하지 못합니다.중첩 된 JSON 객체로 직렬화 할 수있는 Python 클래스 만들기

{ "item" : 
    { 
    "thing" : "foo", 
    "flag" : true, 
    "language" : "en_us" 
    }, 
    "numresults" : 3 
} 

내가 "항목"에 대한 클래스를 만드는 길을가는 시작이 같은 :

기본적으로

는,이 같은 POST 본문에서 JSON 요청을 수락 웹 서비스를

class Item(object): 
    def __init__: 
     self.name = "item" 

    @property 
    def thing(self): 
     return self.thing 

    @thing.setter 
    def thing(self, value): 
     self.thing = value 

    ... 

그래서, 내 질문은 :

  1. 내가 올바른 방향으로가는 건가요?
  2. 어떻게하면 Python 개체를 JSON 문자열로 바꿀 수 있습니까?

내가 파이썬에서 JSON에 대한 많은 정보를 발견했습니다, 나는 jsonpickle을 검토 한 결과,하지만 난 필요한 중첩 된 사전을 출력 끝나는 클래스를 만들 수없는 것.

편집 : Joran의 제안에 덕분에, 내가 속성을 사용하여 클래스와 붙어이 같은 방법 추가 :

def jsonify(self): 
     return json.dumps({ "item" : self.__dict__ }, indent=4) 

을하고 완벽하게 일했다.

도움을 주신 모든 분들께 감사드립니다.

+0

그냥 사전을 반환하는 jsonify 메서드를 추가하면 ... –

+0

질문 [Python serializable objects json] (http://stackoverflow.com/questions/1458450/python-serializable-objects-json). – martineau

+0

[json] (http://docs.python.org/library/json.html#module-json) 표준 라이브러리 모듈에 대한 설명서를 참조하십시오. – martineau

답변

0

그냥 ...

단지 JSON 결과를 반환하는 결과에 tojson 함수를 호출 ... 또는 반환하기 전에 전화 사전을

def jsonify(self): 
    return { 'Class Whatever':{ 
       'data1':self.data1, 
       'data2':self.data2, 
       ... 
           } 

    } 

를 반환하고 클래스에 한 가지 방법을 추가

1

colander project을 살펴보십시오. JSON에서 쉽게 직렬화 할 수있는 객체 지향 '스키마'를 정의 해 보겠습니다.

import colander 

class Item(colander.MappingSchema): 
    thing = colander.SchemaNode(colander.String(), 
           validator=colander.OneOf(['foo', 'bar'])) 
    flag = colander.SchemaNode(colander.Boolean()) 
    language = colander.SchemaNode(colander.String() 
            validator=colander.OneOf(supported_languages) 

class Items(colander.SequenceSchema): 
    item = Item() 

그런 다음 JSON에서 이러한로드 :

items = Items().deserialize(json.loads(jsondata)) 

colander는 작용 될 수있다 파이썬 객체 집합을 반환, 당신을 위해 데이터의 유효성을 검사합니다.

또는 JSON 구조로 또는 그 반대로 Python 객체를 변환 할 수 있도록 특정 객체 별 처리를 만들어야합니다.

0

소쿠리와 사전 추천은 모두 훌륭합니다.

나는 잠시 뒤로 물러나 이러한 객체를 어떻게 사용할 것인지 결정해야한다고 덧붙인다.
이 일반적인 접근법의 잠재적 인 문제점은 내보낼 속성을 결정하기 위해 목록이나 함수 또는 다른 매핑이 필요하다는 것입니다. (소와 소 정의에서 이것을 볼 수있다).

이 동작이 필요할 수도 있고 그렇지 않을 수도 있습니다.

예를 들어 sqlalchemy 프로젝트에는 필드 이름으로 정의 된 클래스가 있으며 이온 소다와 같은 특성이 있습니다. 하지만 개체 자체는 데이터베이스 및 db 연결과 관련된 많은 보조 데이터를 저장합니다. 당신이 관심 단지 기본 필드 데이터를 얻기 위하여

, 당신도 매핑 된 컬럼의 클래스의 데이터를 랩하는 개인 내부 딕셔너리에 액세스하거나 조회해야합니다

def columns_as_dict(self): 
    return dict((col.name, getattr(self, col.name)) for col in sqlalchemy_orm.class_mapper(self.__class__).mapped_table.c) 

전 이것을 지나치게 복잡하게 만드는 것을 의미하지는 않습니다. 저는 여러분이이 객체들을 어떻게 사용하는지 정확하게 생각할 것을 제안하고자합니다. 객체에 넣은 것과 동일한 정보 만 원하는 경우 - 간단한 해결책이 좋습니다. 이러한 객체에 다른 종류의 '개인 데이터'가있을 경우 다양한 유형의 정보를 구분해야합니다.

관련 문제