我有一个脚本,该脚本在第一次启动时从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
答案 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)