2017-06-08 147 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