簡體   English   中英

json.dumps 和 json.loads 在任何字符串列表上運行是否安全?

[英]Is json.dumps and json.loads safe to run on a list of any string?

當 JSON 序列化/反序列化 Python 中的文本列表時,是否有丟失信息的危險?

給定一個字符串列表lst

lst = ['str1', 'str2', 'str3', ...]

如果我跑

lst2 = json.loads(json.dumps(lst))

lst總是與lst2完全相同(即lst == lst2總是會導致True )? 或者是否有一些特殊的、不尋常的字符會破壞這些方法中的任何一種?

我很好奇,因為我將處理來自各種 Unicode 范圍的許多不同和不尋常的字符,我想絕對確定這個過程是 100% 健壯的。

取決於您所說的“完全相同”是什么意思。 我們可以確定三個不同的問題:

  • 語義身份。 您讀入的內容與您寫回的內容的含義相同,只要它首先是明確定義的。 Python(取決於版本)可能會重新排序字典鍵,並且對於某些代碼點,通常更喜歡 Unicode 轉義而不是文字字符,反之亦然。

     >>> json.loads(json.dumps("\P\\U0001fea5\\U0001f4a9")) 'P\\U0001fea5💩'
  • 詞法身份。 不。 如上所示,Unicode 代碼點的 JSON 表示可以通過不同的方式進行規范化,因此\P會變成文字P ,並且可打印的表情符號可能會也可能不會類似地變成 Unicode 轉義符,反之亦然。

    (這與正確的Unicode 規范化不同,后者確保將同形文字轉換為相同的精確代碼點。)

  • 進垃圾,出垃圾。 不。 如果您有無效的輸入,Python 通常會崩潰而不是通過它,盡管您可以通過捕獲錯誤和/或傳遞標志來請求不那么嚴格的行為來修改其中的一些。

     >>> json.loads(r'"\\u123\u0026quot;') File "<stdin>", line 1 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-4: truncated \\uXXXX escape >>> print(json.loads(r'"\?"')) ? >>> #!? should probably crash or moan instead!

您似乎在問第一種情況,但如果您不確定自己已決定如何處理無效的 Unicode 數據,則第三種情況可能會讓您大吃一驚。

如果您關心磁盤上的 JSON 在版本之間是等效的,則第二種情況會有所不同; 這對你來說似乎並不重要,但這個問題的未來訪問者可能會關心。

在某種程度上,是的,它應該是安全的。 但是請注意,JSON 不是根據字節字符串定義的,而是根據 Unicode 文本定義的。 這意味着在執行 json.parse 之前,您需要首先從您使用的任何文本編碼中解碼該字符串。 此 Unicode 編碼/解碼步驟可能會導致不一致。

您可能會遇到的另一個隱含問題是,此過程是否會往返。 答案是,它通常會,但這取決於編碼/解碼過程。 根據處理步驟,您可能正在規范化在 Unicode 中被視為等效但使用不同代碼點組成的不同字符。 例如,像å這樣的重音字符可以使用字母a和組合字符來編碼為復合字符,或者它可以編碼為該字符的規范代碼點。

還有 JSON 轉義字符的問題,它看起來像“\ሴ”。 一旦解碼,Python 不會保留字符最初是使用 JSON 轉義編碼還是作為 Unicode 字符編碼,因此您也會丟失該信息,並且在這種情況下文本可能無法完全往返。

除了 Unicode 書呆子的深角中關於等效字符和規范化的那些問題之外,從/到 JSON 本身的編碼和解碼是非常安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM