2012-10-04 68 views
2

我有一個接收格式化爲一個python字典蟒蛇AST VS的JSON字符串str的字典翻譯

"{'a':'1','b':'2',...}" 

,我需要轉換爲正確的字典字符串的一段代碼。

我已經嘗試了兩種方法,使用json.loads(s)和​​ AST似乎更強大,接受任何形式的字符串中引號和「只是工作」,而JSON似乎是對報價細節和止跌非常挑剔」不能僅以單一格式的報價格式失敗。我真的希望儘可能靈活地使用輸入,因此寧願使用ast,但是,我的一些同事聲稱它可能不是一個「安全」的模塊和功能。

任何人都可以建議ast和ast.literal_eval()的安全性,特別是與json.loads()相比?

感謝

+0

報價是真的像你的問題?單引號不匹配。 – 2012-10-04 20:12:36

+0

你是對的,讓我解決這個問題... – dyasny

+2

如果數據源是JSON,只能使用'json.loads'。如果它只是一個'repr(python_dict)',那麼即使它有時會起作用,它在語義上也是不正確的。 – agf

回答

6

使用ast.literal_eval() - 它的設計做你想做的。 JSON恰好符合語法,但這不是您應該依賴的。

至於安全性,literal_eval()專門設計用於安全地使用來自不受信任來源的數據。實際上,the docs的第一個單詞是'Safely':

安全地評估表達式節點或包含Python表達式的字符串。提供的字符串或節點可能只包含以下Python文字結構中的 :字符串,數字,元組,列表, 字典,布爾值和無。

這可用於從不可信來源安全評估包含Python表達式的字符串,而不需要自己解析 值。

那些建議你不要使用它的人可能是想到eval(),這確實是不安全的。

+0

完美,謝謝。我會等待幾個回覆,並設置答案 – dyasny