我正在用Python脚本编写一个函数,该函数将读取json文件并打印。
脚本的内容为:
def main(conn):
global link, link_ID
with open('ad_link.json', 'r') as statusFile:
status = json.loads(statusFile.read())
statusFile.close()
print(status)
link_data = json.load[status]
link = link_data["link"]
link_ID = link_data["link_id"]
print(link)
print(link_ID)
我收到以下错误消息:
link_data = json.load[status]
TypeError: 'function' object is not subscriptable
出了什么问题?
ad_link.json的内容以这种方式保存我收到的文件。
"{\"link\": \"https://res.cloudinary.com/dnq9phiao/video/upload/v1534157695/Adidas-Break-Free_nfadrz.mp4\", \"link_id\": \"ad_Bprise_ID_Adidas_0000\"}"
用于接收和写入JSON文件的功能
def on_message2(client, userdata, message):
print("New MQTT message received. File %s line %d" % (filename, cf.f_lineno))
print("message received?/'/'/' ", str(message.payload.decode("utf-8")), \
"topic", message.topic, "retained ", message.retain)
global links
links = str(message.payload.decode("utf-8")
logging.debug("Got new mqtt message as %s" % message.payload.decode("utf-8"))
status_data = str(message.payload.decode("utf-8"))
print(status_data)
print("in function on_message2")
with open("ad_link.json", "w") as outFile:
json.dump(status_data, outFile)
time.sleep(3)
此功能的输出
New MQTT message received. File C:/Users/arunav.sahay/PycharmProjects/MediaPlayer/venv/Include/mediaplayer_db_mqtt.py line 358
message received?/'/'/' {"link": "https://res.cloudinary.com/dnq9phiao/video/upload/v1534157695/Adidas-Break-Free_nfadrz.mp4", "link_id": "ad_Bprise_ID_Adidas_0000"} topic ios_push retained 1
{"link": "https://res.cloudinary.com/dnq9phiao/video/upload/v1534157695/Adidas-Break-Free_nfadrz.mp4", "link_id": "ad_Bprise_ID_Adidas_0000"}
编辑
我发现错误是JSON格式。我收到的JSON数据格式错误。我该如何纠正?
答案 0 :(得分:0)
def main(conn):
global link, link_ID
with open('ad_link.json', 'r') as statusFile:
status = json.load(statusFile)
status=json.loads(status)
link = status["link"]
link_ID = status["link_id"]
print(link)
print(link_ID)
答案 1 :(得分:0)
def main(conn):
global link, link_ID
with open('ad_link.json', 'r') as statusFile:
link_data = json.loads(statusFile.read())
link = link_data["link"]
link_ID = link_data["link_id"]
print(link)
print(link_ID)
答案 2 :(得分:0)
这里有两个主要错误:
json.load
函数用作序列或字典映射。这是一个函数,您只能调用它;您将使用json.load(file_object)
。由于status
实际上是一个字符串,因此您必须使用json.loads(status)
来真正解码存储在字符串中的JSON文档。on_message2
中,您再次将JSON数据编码为JSON 。现在,您必须两次对其进行解码。不幸的是,这浪费了计算机资源。在on_message2
函数中,message.payload
对象是一个字节值,其中包含UTF-8编码的JSON文档,如果您要将其写入文件,请勿解码为文本,并且不要再次将文本编码为JSON。只需将这些字节直接 写入文件:
def on_message2(client, userdata, message):
logging.debug("Got new mqtt message as %s" % message.payload.decode("utf-8"))
with open("ad_link.json", "wb") as out:
out.write(message.payload)
注意'wb'
状态;会以 binary模式打开文件进行写入,此时您可以将bytes
对象写入该文件。
在模式下打开没有b
的文件时,以文本模式打开文件,并且在向该文件对象写入文本字符串时,Python对该文本进行编码到字节为您。默认编码取决于您的操作系统设置,因此如果没有对encoding
的显式open()
参数,您甚至无法确定自己是否再次以UTF-8 JSON字节结尾!由于您已经具有个字节值,因此无需手动解码然后再次使用Python编码,因此请使用二进制文件对象,并避免在此处进行解码/编码。
您现在可以使用json.load()
加载文件内容,而无需再次解码:
def main(conn):
with open('ad_link.json', 'rb') as status_file:
status = json.load(status_file)
link = status["link"]
link_id = status["link_id"]
请注意,我再次将文件打开为二进制文件。从Python 3.6开始,json.load()
函数可同时用于二进制文件和文本文件,对于二进制文件,它可自动检测JSON数据是否编码为UTF-8,UTF-16或UTF-32。 \
如果您使用的是Python 3.5或更早版本,请以文本形式打开文件,但要明确将编码设置为UTF-8:
def main(conn):
with open('ad_link.json', 'r', encoding='utf-8') as status_file:
status = json.load(status_file)
link = status["link"]
link_id = status["link_id"]