第二次加载JSON文件时获取“ JSONDecodeError”

时间:2020-06-09 16:01:28

标签: python json

我有一个脚本,该脚本在第一次启动时从JSON文件加载数据,然后继续检查JSON文件是否已更新。如果已更新,则会从JSON文件重新加载数据。

到目前为止,初始加载工作正常,但是当再次读取文件时,我得到“ json.decoder.JSONDecodeError:预期值:第1行第1列(字符0)”。为什么会出现此错误?

test.json

{"open":0}

testingFile.py

import json
import time
import datetime
import os

recordedMod = os.path.getmtime('test.json')


def getJSON():
    status = ''
    funcData = ''
    doorOpen = ''
    #read json file
    with open('test.json') as myfile:
        funcData=myfile.read()
        print(funcData)
    #load json data
    status = json.loads(funcData)
    #get Door open Status
    doorOpen = status["open"]
    #close File
    myfile.close()

    return doorOpen


doorStatus = getJSON()
print(doorStatus,end='\r')

while (True):
    currentMod = os.path.getmtime('test.json')

    if currentMod>recordedMod:
        doorStatus = getJSON()
        print(doorStatus,end='\r')

跟踪

Traceback (most recent call last):
  File "testingFile.py", line 34, in <module>
    doorStatus = getJSON()
  File "testingFile.py", line 19, in getJSON
    status = json.loads(funcData)
  File "/usr/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

更新

正在从外部来源编辑和保存JSON文件。目前,我正在通过使用文本编辑器编辑JSON文件并通过ssh保存进行测试。后来的计划是使用node.js更新文件

更新和解决方案

我接受了可以帮助我找到解决方案的答案,但是对于导致我所遇到的问题的原因以及解决方案的解释是,从外部源保存文件时,会同时对其进行检查。因此,一瞬间该文件为空,这将引发错误。没有任何形式的错误处理,这停止了代码的运行。通过在getJSON函数中添加if语句,类似于接受的答案,程序将在文件不可用时退出该函数,而不是停止。

新功能

def getJSON():
    with open('test.json') as myfile:
        funcData=myfile.read()
        if funcData:
            status = json.loads(funcData)
            doorOpen = status['open']
            return doorOpen

1 个答案:

答案 0 :(得分:0)

您的程序正确报告json文件损坏。换句话说,您最好开始相信错误消息。在这种情况下,它是一个空文件,或者至少funcData为空。

您的代码需要使用错误的输入功能,这些输入报告为JSONDecodeError。我不知道为什么输入文件为空,但是它是空的。该程序告诉您每天要清理,您只需查看funcData即可确认它是空字符串。

如果需要,该函数可以仅返回True / False值,或者如果出现任何错误,则返回None。您应该处理异常,但是它可以在函数内或函数外。在这里,我编写了一个函数来处理json文件,并编写了一个函数来处理显示。由于我们正在打印错误,因此将异常处理程序放入显示功能中。

关于json读取器功能的通知,我使用“ get”处理了json有效但没有所需数据的情况。而且您已经知道,所有python函数如果不执行返回操作都将返回None,因此,如果文件为空,它将返回None而不是JSONEncodeError。

我还清理了文件更改处理程序循环。现在,它仅执行一项工作:在文件更改时触发显示功能。

import json
import os
import time

def getJsonAttribute(filename, attribute):
    with open(filename) as myfile:
        funcData = myfile.read()
        if funcData:
            status = json.loads(funcData)
            doorStatus = status.get(attribute, None)
            return bool(doorStatus)

def displayDoor(filename):
    try:
        doorStatus = getJsonAttribute(filename, 'open')
        if doorStatus is None:
            print ('what door?')
        else:
            print ('the door is', 'open' if doorStatus else 'closed')
    except json.JSONDecodeError as e:
        print ('the door has bad json:', str(e))

recordedMod = 0.0
while (True):
    currentMod = os.path.getmtime('test.json')
    if currentMod > recordedMod:
        recordedMod = currentMod
        displayDoor('test.json')
    time.sleep(1)