返回json,python的类

时间:2017-06-08 07:32:59

标签: python json

我有一个应该返回json的python类,它看起来像这样:

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 :(得分:7)

使用str(..)

您无法直接在json.loads 对象上致电ScanThis。这样就行不通了。如错误所述,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数据。

答案 1 :(得分: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模块从已有的字符串/文件加载,或序列化为字符串/文件以进行存储或转移(例如通过互联网发送)。