Python在读取JSON文件时抛出错误

时间:2018-08-14 12:38:49

标签: python json

我正在用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数据格式错误。我该如何纠正?

3 个答案:

答案 0 :(得分:0)

在处理支持类似读取操作的文件对象时,

loads替换load

 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)

这里有两个主要错误:

  1. 您正在尝试将json.load函数用作序列或字典映射。这是一个函数,您只能调用它;您将使用json.load(file_object)。由于status实际上是一个字符串,因此您必须使用json.loads(status)来真正解码存储在字符串中的JSON文档。
  2. 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"]