JSONDecodeError:预期值:使用有效json时的第1行

问题描述

我一直在使用看门狗和json作为脚本,在其中我监视要创建的文件和json以读取已创建的文件。该脚本很简单:

import watchdog.events
import watchdog.observers
import json

def on_created(self,event):

    with open(event.src_path,'r') as f:
        print(f.read())
        data = json.load(f)


def main(self):
    observer = watchdog.observers.Observer()
    observer.schedule(NotificationsEvent(),path=os.path.split(self.notificationFlag)[0],recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

基本上是在创建带有json路径的新文件时。读取它,然后将其作为json加载,并且效果很好,但有时会抛出一个错误

期望值:第1行第1列(字符0)

当我检查返回我的f.read()的印刷品时:

{
    "delay": 0,"image": "https://secure-images.nike.com/is/image/DotCom/CK9388_484","keyword": false,"link": "https://www.nike.com/se/t/traningssko-metcon-6-78352H/CK9388-484","name": "NIKE METCON 6","price": "1337","shortcut": [
        "[Checkout](https://www.nike.com/se/cart)"
    ],"sizes": [],"sku": "CK9388-100","store": "Nike","text": "New!","webhook": "nike"
}

我已经使用https://jsonlint.com/来查看它是否有效并且有效,但是有时我还是会收到错误消息。我确实得到50分之一。我无法再次再现该错误,它很少发生,但是确实发生了。

我不知道,我已经不知道可能是什么原因引起的:(

感谢所有帮助!

解决方法

f.read()正在读取整个文件,因此json.load()没什么可读取的。

您应该读入变量,然后使用json.loads()

def on_created(self,event):

    with open(event.src_path,'r') as f:
        js = f.read()
        print(js)
        data = json.loads(js)

或者您可以在它们之间倒回文件。

def on_created(self,'r') as f:
        print(f.read())
        f.seek(0)
        data = json.load(f)

如果在没有print(f.read())行的情况下遇到错误,则问题是您的代码在编写器完成写入文件之前就已运行。

实际上并没有可靠的方法来告诉编写者何时完成了文件写入。最好的解决方案是让它自动创建文件。它应该将数据写入另一个文件,然后将该文件重命名为您的代码正在监视的文件。

您可以将循环与try/except

一起使用
def on_created(self,event):
    for _ in range(5): // limit the number of retries
        try:
            with open(event.src_path,'r') as f:
                data = json.load(f)
            break
        except JsonDecodeError:
            print("JSON load error,retrying")
            os.sleep(1) // allow time for writer to finish