2017-09-07 1 views
-1

나는 git에서 라이브러리를 복제 했으므로 방금 savePlayerDictionary 메소드를 사용했습니다.TypeError : __dict__는 'unicode'가 아닌 사전으로 설정해야합니다.

json 파일을 저장했는데 모든 것이 정상적으로 보입니다.

하지만

나는 loadPlayerDictionary를 사용하려고

, 나는 오류를 얻을 :

TypeError: __dict__ must be set to a dictionary, not a 'unicode' 

내 코드 :

def savePlayerDictionary(playerDictionary, pathToFile): 
    """ 
    Saves player dictionary to a JSON file 
    """ 
    player_json = {name: player_data.to_json() for name, player_data in playerDictionary.items()} 
    json.dump(player_json, open(pathToFile, 'wb'), indent=0) 


def loadPlayerDictionary(pathToFile): 
    """ 
    Loads previously saved player dictionary from a JSON file 
    """ 
    result = {} 
    with open(pathToFile, "r") as f: 
     json_dict = json.load(f) 
     for player_name in json_dict: 
      parsed_player = Player(None,None,False) 
      parsed_player.__dict__ = json_dict[player_name] 
      result[player_name] = parsed_player 
    return result 

player_data.to_json()는 다음과 같이 구현됩니다

def to_json(self): 
    return json.dumps(self.__dict__) 

코드는 내가 도망 것은 :

get_ipython().magic(u'matplotlib inline') 
import basketballCrawler as bc 
import matplotlib.pyplot as plt 

players = bc.loadPlayerDictionary("myJson.json") 
+0

왜 처음에 '__dict__'에 할당하고 있습니까? '__dict __. update()'를 사용합니다. 그러나 분명히'json_dict [player_name]'은 사전이 아닙니다. –

+0

'to_json()'메서드는 무엇을 반환합니까? –

+0

to_json 메서드는 다음과 같습니다. def to_json (self) : return json.dumps (self .__ dict__) –

답변

1

당신은 값에 대한 이중 인코딩 JSON 데이터의 결과로, 다시 JSON 에 그 JSON 데이터에 전체 사전 매핑 이름을 인코딩, JSON에 플레이어 데이터를 인코딩하는 그 매핑의.

디코딩 할 때 각 플레이어의 데이터가 아니라 이름 데이터 매핑 만 디코딩됩니다. 당신은 개별적으로 디코딩해야 할 것 :

parsed_player = Player(None,None,False) 
parsed_player.__dict__ = json.loads(json_dict[player_name]) 

그냥 to_json()에서 인코딩되지 않은 경우가 더 쉬울 것 :

def to_json(self): 
    return vars(self) 

(나는 같은 사전을 얻을 수있는 청소기 함수로 vars() function을 사용).

플레이어 데이터를 지속적으로 유지하려는 경우 pickle module을 대신 사용해보세요. 더 빠르고 다재다능하며, __dict__ 속성으로 별도의 노래와 춤을 가질 필요가 없습니다. 객체들에 대한 영속 사전을 만들기 위해 에 빌드 된 shelve이라는 래퍼 모듈이 있습니다.

+0

지연을 드려 죄송합니다. 이것은 많은 도움이 :) –

관련 문제