我有一个应该返回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导致通过互联网进行数据传输
答案 0 :(得分:7)
str(..)
您无法直接在json.loads
对象上致电ScanThis
。这样就行不通了。如错误所述,json.loads
需要str
,bytes
或bytearray
对象。
但是,您可以使用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
模块从已有的字符串/文件加载,或序列化为字符串/文件以进行存储或转移(例如通过互联网发送)。