2017-03-01 49 views
1

我有一串字符串,我需要分析每個字符串並檢查它是否是有效的JSON。 的Python的方式(EAFP)規定是這樣的:檢查字符串是否爲JSON而不引發異常?

import json 
def parse_json(string): 
    try: 
     return json.loads(string) 
    except: 
     return string 

的問題是,字符串顯著數量並不JSONs,並通過這個代碼提出的許多異常緩慢的過程頗有幾分。

我正在尋找一些方法來嘗試和解析文本爲JSON,返回某種預先定義的值(例如一個空的tuple()),指示該字符串不是JSON兼容的。 如果這是最簡單的解決方案,我並不介意在標準的json軟件包(重寫一個或兩個函數..)時進行黑客攻擊。

有什麼建議嗎?

+6

我非常懷疑開銷是捕捉異常,而是試圖首先解析字符串。 –

+0

正如@Danield所指出的,除Python之外的處理相對便宜。檢查一個字符串是否有效JSON然後轉換它可能比你所做的要慢。但是,如果無效數據全部以相同的方式被破壞,那麼如果檢查該條件的方法非常快,您可以避免嘗試使用'loads()'來轉換它們。 – martineau

+0

@DanielRoseman而try-except子句幾乎是免費的,但不會產生任何例外情況,但成本較高(例如http://stackoverflow.com/a/2522013/4369617)。由於我每天必須處理數以億計的字符串,這成爲一種負擔。 – redlus

回答

-3

如果字符串是JSON,它應該以「{」開頭並以「}」結尾。

我想你可以先檢查字符串是否以「{」開頭;如果沒有,你肯定知道這是一個簡單的字符串;如果它以「{」開頭,則可以解析它並使用try/except(只是爲了確保它不僅僅是一個以「{」開頭的簡單字符串)。

+1

並非所有有效的JSON值都是對象。 – chepner

0

速度問題,您可以使用多來加快分析,例如利用5名工人在多處理您解析5串在一個時間,而不是一個

如果我沒有理解問題的第二部分,爲自定義異常做這樣的事情來獲得不同的錯誤自定義錯誤由JSON返回:

def parse_json(string): 
    try: 
     return json.loads(string) 
    except exception1 as ex1: 
     print(ex1) 
     return string 
    except exception2 as ex2: 
     print(ex2) 
     return string 
    exc.... 

,或者如果你不想得到錯誤引發任何異常這樣做,只要給它一通什麼都不做,不出現任何東西:

def parse_json(string): 

try: 
    return json.loads(string) 
except exception1 as ex1: 
    pass 
+0

多重/分佈式處理是一個選項,但它不會減少額外處理異常的時間,這是我想要卸載的。理想情況下,我希望json.loads()函數在解析失敗而不是引發異常時返回預定義的值。 – redlus