如果格式實際上是這個特定的,那很簡單:只是分割爲[
,因爲沒有[
內部{…}
。所以:
>>> s = """{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]"""
>>> sd, _, sl = s.partition('[')
>>> sl = '[' + sl
現在,想必你不想給串轉換成JSON,但dict
該字符串代表。要做到這一點,你必須eval
它。因爲除了顯示全部文字之外什麼都沒有,所以您可以使用安全ast.literal_eval
函數來執行此操作。所以:
>>> import ast
>>> d = ast.literal_eval(sd)
>>> sd
"{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}"
>>> d
{'2': {1, 2}, '4': {1, 2}, '0': {1, 2}}
但是,你仍然不能JSON-IFY,因爲{1, 2}
是一個集合,JSON沒有做套。你必須決定你想要轉換成什麼。數組?有None
值的字典?還有別的嗎?
把所有的套入名單(可呈現爲JSON數組),你有兩個選擇。
第一個是子類JSONEncoder
。 the docs頂部附近有一個很好的例子,它可以將complex
值作爲2元素列表進行編碼,您應該能夠輕鬆地適應您的目的:將complex
更改爲set
,將[o.real, o.imag]
更改爲list(o)
。
第二個是預處理東西。就像最初的解析一樣,這很容易取決於你的格式有多嚴格。如果字典中的所有頂級值都是集合,並且其他都不是集合,則只是{k: list(v) for k, v in sd.items()}
。另一方面,如果你有一個任意的字典,遞歸地包含字符串,數字,字典和列表的集合,那麼你可能想寫一個遞歸函數來轉換它。
同時......您從哪裏得到這些數據?我的猜測是你有一些其他你的代碼的一部分,只是打印出一個字典(或f.write
-ing一個字典的str()
...),然後是一個列表。如果是這樣,而不是稍後嘗試恢復該數據,則應該將代碼更改爲首先編寫JSON(或其他可解析的內容)。
如果您的格式是有點不那麼友好,如果字典可以有名單裏面 - 你會需要做一些票友。例如,你可以計算開放大括號減去大括號並繼續下去,直到你回到0,這就是字典。
「蟒蛇中是否有這樣做」是的。 ['str.split'](https://docs.python.org/2/library/string.html#string.split)是你的朋友。「然後將結果轉換成json」是的,[有一個用於json的完整模塊](https://docs.python.org/2/library/json.html) – 2014-08-29 23:15:35
@AdamSmith:除了給出的值不能可以直接編碼爲JSON,因爲它包含集合。一旦你決定如何將這些設置包含在JSON包含的內容中,這並不難,但在此之前這是不可能的。 – abarnert 2014-08-29 23:23:43
爲什麼你有兩個JSON序列化連接在一起?無論如何,任何不涉及解析器的解決方案都將變得很脆弱,因爲您沒有跟蹤對象樹中的深度。 – 2014-08-29 23:24:09