2016-11-24 19 views
2

我有這個dictionary,其中keystuplesPython的 - JSON類型錯誤:鍵 '元組' 不是一個字符串

tags = {'playlist': {('seen live', 21): 1, ('indie', 46): 1, ('british rock', 2): 1, ('alternative rock', 19): 1, ('00s', 2): 1, ('english', 2): 1, ('brit pop', 2): 1, ('pop rock', 2): 1, ('90s', 10): 1, ('classic rock', 3): 1, ('hard rock', 2): 1, ('Manchester', 4): 1, ('favorites', 1): 1, ('british', 61): 1, ('rock', 89): 1, ('alternative', 53): 1, ('punk', 1): 1, ('male vocalists', 2): 1, ('britpop', 100): 1, ('pop', 7): 1, ('UK', 4): 1, ('oasis', 9): 1, ('indie rock', 12): 1, ('Britrock', 3): 1, ('england', 1): 1, ('brit rock', 2): 1}} 

我想這跟json格式上傳到目錄中,有:

with open(path, 'w') as t: 
     json.dump(tags, t) 

但似乎tupleskeys沒有使用json.dump()允許的,因爲我得到這個回溯:

TypeError: key ('seen live', 21) is not a string

有沒有解決方法呢?

+0

根據您想要對序列化數據層執行什麼操作,有多個選項。首先選擇JSON有沒有原因?你是否將此傳遞給非python程序? – tdelaney

+0

可能會將它傳遞給非pyhton程序,是的。我之所以選擇它,是因爲音樂API數據通常是用JSON序列化的,我將處理這種數據。 –

回答

0

如果要將數據保存爲JSON,則需要將其轉換爲JSON可以使用的格式。我不知道你的數據是什麼,或者這是否是最好的選擇,但作爲一個例子,我把元組轉換成一個字符串,以後可以拆分出來。因此,例如,('alternative rock', 19)變爲'alternative rock 19'。您可能需要其他一些格式,但這是一種合理的方式。

>>> tags = {'playlist': {('seen live', 21): 1, ('indie', 46): 1, ('british rock', 2): 1, ('alternative rock', 19): 1, ('00s', 2): 1, ('english', 2): 1, ('brit pop', 2): 1, ('pop rock', 2): 1, ('90s', 10): 1, ('classic rock', 3): 1, ('hard rock', 2): 1, ('Manchester', 4): 1, ('favorites', 1): 1, ('british', 61): 1, ('rock', 89): 1, ('alternative', 53): 1, ('punk', 1): 1, ('male vocalists', 2): 1, ('britpop', 100): 1, ('pop', 7): 1, ('UK', 4): 1, ('oasis', 9): 1, ('indie rock', 12): 1, ('Britrock', 3): 1, ('england', 1): 1, ('brit rock', 2): 1}} 
>>> tags['playlist'] = {'{} {}'.format(*k):v for k,v in tags['playlist'].items()} 
>>> print(tags['playlist']) 
{'alternative 53': 1, 'oasis 9': 1, 'alternative rock 19': 1, 'british 61': 1, 'male vocalists 2': 1, 'brit rock 2': 1, 'england 1': 1, 'punk 1': 1, 'pop rock 2': 1, '00s 2': 1, 'seen live 21': 1, 'indie 46': 1, 'hard rock 2': 1, 'favorites 1': 1, 'Britrock 3': 1, 'english 2': 1, 'indie rock 12': 1, '90s 10': 1, 'classic rock 3': 1, 'brit pop 2': 1, 'pop 7': 1, 'british rock 2': 1, 'rock 89': 1, 'UK 4': 1, 'Manchester 4': 1, 'britpop 100': 1} 
>>> json.dumps(tags) 
'{"playlist": {"alternative 53": 1, "oasis 9": 1, "alternative rock 19": 1, "british 61": 1, "male vocalists 2": 1, "brit rock 2": 1, "england 1": 1, "punk 1": 1, "pop rock 2": 1, "00s 2": 1, "seen live 21": 1, "indie 46": 1, "hard rock 2": 1, "favorites 1": 1, "Britrock 3": 1, "english 2": 1, "indie rock 12": 1, "90s 10": 1, "classic rock 3": 1, "brit pop 2": 1, "pop 7": 1, "british rock 2": 1, "rock 89": 1, "UK 4": 1, "Manchester 4": 1, "britpop 100": 1}}' 
+0

你可以使用類似'repr'的東西給出元組的字符串表示形式。然而,這帶來了如何在沒有'eval'的情況下解析它的問題 –

1

如果您需要更多不同數據類型的支持,請改爲使用pickle模塊。

import pickle 

with open(path, 'w') as t: 
    pickle.dump(tags, t) 
+2

也許......這一切都取決於其他軟件想要讀取它的內容。醃菜只適用於python程序。 – tdelaney

相關問題