2014-08-29 122 views
0

我有一個像這樣的字符串:分割字符串,並轉換爲JSON

{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"] 

而之前[「EQ(‘2’......所以我只需要保存我只需要的一切{'4':{1,2},'2':{1,2},'0':{1,2}} 我無法使用索引,因爲每次都會有不同的長度,所以我必須檢查「[」。有沒有反正在Python中做到這一點,然後將結果轉換成json?我是python新手,所以我會很感激任何幫助

+2

「蟒蛇中是否有這樣做」是的。 ['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

+1

@AdamSmith:除了給出的值不能可以直接編碼爲JSON,因爲它包含集合。一旦你決定如何將這些設置包含在JSON包含的內容中,這並不難,但在此之前這是不可能的。 – abarnert 2014-08-29 23:23:43

+0

爲什麼你有兩個JSON序列化連接在一起?無論如何,任何不涉及解析器的解決方案都將變得很脆弱,因爲您沒有跟蹤對象樹中的深度。 – 2014-08-29 23:24:09

回答

1

如果格式實際上是這個特定的,那很簡單:只是分割爲[,因爲沒有[內部{…}。所以:

>>> 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數組),你有兩個選擇。

第一個是子類JSONEncoderthe 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,這就是字典。

+0

感謝您的幫助,比方說,我想將{1,2}更改爲數組[1,2]。我發送這個數據到JavaScript,所以我需要迭代json對象中的每個項目,並閱讀它的數組 – 2014-08-30 00:08:32

+0

@HiradRoshandel:編輯答案解釋。 – abarnert 2014-08-30 00:32:23