2017-06-08 183 views
-1

我有一個Python類應該返回一個JSON,它看起來是這樣的:類返回JSON,蟒蛇

class ScanThis(): 
    def__init__(self, test): 
     data={} 
     if test>5: 
      data["amount"] = test 
      self.json_data = json.dumps(data) 
     else: 
      data["fail"] = test 
      self.json_data = json.dumps(data) 

    def __str__(self): 
     return self.json_data 

,我試圖調用它像這樣:

output= json.loads(ScanThis(8)) 
print(output["command"]) 

但我得到這個錯誤:

TypeError: the JSON object must be str, bytes or bytearray, not 'ScanThis' 

我相信我剛纔的CLAS返回類型ScanThis的對象(),而不是一個JSON像我想要的。我只是想現在怎麼樣我會解決這個問題 謝謝

PS:我很抱歉,如果這個代碼是粗糙的或無效的,它不是實際的代碼,就類似我做了

東西更新:同樣,這不是真正的代碼,它只是實際代碼的一個小的基本片段。還有我使用一個類一個很好的理由,並且使用JSON的原因在互聯網上的數據傳輸涉及

+2

你似乎沒有理解課堂的目的。如果您不想返回類的實例,請不要使用類 - 請改用函數。 –

+0

'json.loads'不會在'ScanThis'實例上隱式調用'__str__'。 – deceze

+0

@deceze正確的,我真的剛剛意識到這是如何從下面的答案 –

回答

6

使用str(..)

您可以直接在ScanThis對象不通話json.loads。所以這是行不通的。如錯誤所述,json.loads預計爲strbytesbytearray對象。

但是,您可以使用str(..)調用__str__(self)方法,從而獲得了JSON數據:

output = json.loads(str(ScanThis(8))) 
#     ^get the __str__ result

使用另一種方法

話雖這麼說,它通常是一個更好的主意來定義的方法,例如to_json來獲取JSON數據,因爲現在你已經讓str(..)返回一個JSON對象。因此,也許更優雅的方式做到這一點是:

class ScanThis(): 
    def__init__(self, test): 
     data={} 
     if test>5: 
      data["amount"] = test 
      self.json_data = json.dumps(data) 
     else: 
      data["fail"] = test 
      self.json_data = json.dumps(data) 

    def to_json(self): 
     return self.json_data 

,並稱之爲:

output = json.loads(ScanThis(8).to_json()) 

現在,你仍然可以使用__str__用於其他用途。此外,通過使用to_json,您可以使其明確結果將是一個JSON字符串。使用str進行JSON轉換當然是不被禁止的,但str(..)作爲名稱並不能提供有關結果格式的很多保證,而to_json(或其他類似名稱)強烈暗示您將獲得JSON數據。

+0

謝謝,這對我來說非常合適,我並沒有真正理解'def __str__'部分,並且真的認爲它會自動調用,真的很愚蠢,再次感謝! –

0

我不認爲你想要在那裏使用一個類。 而是嘗試使用返回一個字符串的函數。例如:

def scan_this(test): 
    data={} 
    if test>5: 
     data["amount"] = test 
     json_data = json.dumps(data) 
    else: 
     data["fail"] = test 
     json_data = json.dumps(data) 

    return json_data 

output = json.loads(scan_this(8)) 

但是!!現在你只是做了額外的工作,沒有任何東西?爲什麼你需要將一個python字典序列化爲一個json格式的字符串,然後直接將它加載回python字典中?在Python中處理數據時,最好將其保存爲本地數據類型,並且只使用json模塊從您已有的字符串/文件加載,或者序列化爲字符串/文件以進行存儲或傳輸(例如通過互聯網發送)。

+0

我知道使用方法會容易得多,但我發佈的代碼並不是全部,完整的代碼需要一個類。相信我,我更喜歡一種方法 –

+0

哦,實際的代碼確實需要通過互聯網發送這些數據。我的問題的方法調用的一部分是在不同的類 –

+0

@DrewU在這種情況下,你應該提供更多的上下文,包括你剛剛評論的信息,以及你需要'__init__'方法中的所有代碼的原因一類。 – swalladge