我无法让 json.load 工作 - 不理解错误消息



开发和python新手,并尝试创建json文件。

我正在尝试生成一个包含开始时间、入职时间和事件时间的人员列表:

import datetime
import random
import math
import json
import numpy as np
# generate list of candidates
cand = input("Enter number of candidates: ")
cand = int(cand)
startRange = 0.06 # standard deviation (scale)
startTime = 9.30 #mean (loc)
onboardRange = 0.5
onboardTime = 4.5
incidenceRatio = [0,0,0,0,1] #1 in 5 chance an incident arises
def calCan(): # creates a dictionary of candidates with start times, onboarding, incident times.
candattr = []
candidates = {"candidates":candattr}
a = 1
while a <= cand:
b = np.random.normal(loc=startTime, scale=startRange, size=(1, 1)) # startime
c = np.random.normal(loc=onboardTime, scale=onboardRange, size=(1, 1)) # onboarding time
d = random.choice(incidenceRatio) * np.random.normal(loc=onboardTime, scale=onboardRange, size=(1, 1)) # incident time - random.choice(incidenceRatio) - takes a random selection from incidenceRation list defined above.
btime = datetime.time(int(b//1),int(math.ceil(100 * (59 * (b % 1))/100)), 0)#converts bnum into time
ctime = datetime.time(0,int(c//1),int(math.ceil(100 * (59 * (c % 1))/100)))
dtime = datetime.time(0,int(d//1) ,int(math.ceil(100 * (59 * (d % 1))/100)))
candattr.append({
"name": "candidate {}".format(a),
"startTime": "{}".format(btime),#json doesn't recognize time so have to store as a string
"onboardTime": "{}".format(ctime),
"incidentTime": "{}".format(dtime)
})
a = a + 1
return candidates

然后我试图把它放到一个 JSON 中。

我可以使用以下命令让 JSON 打印得很好

candidateList = calCan()
print(json.dumps(candidateList, indent=4))

它返回如下内容:

{
"candidates": [
{
"name": "candidate 1",
"startTime": "09:17:00",
"onboardTime": "00:03:37",
"incidentTime": "00:04:04"
},
{
"name": "candidate 2",
"startTime": "09:16:00",
"onboardTime": "00:04:19",
"incidentTime": "00:00:00"
},
{
"name": "candidate 3",
"startTime": "09:15:00",
"onboardTime": "00:04:13",
"incidentTime": "00:03:25"
}
]
}

但是当我尝试使用 json.load 来操作它时

candidateList = calCan()
candidateList = str(candidateList)
data = json.loads((candidateList)

我得到各种可怕的错误,我无法做出正面或反面:

Traceback (most recent call last):
File "queue.py", line 56, in <module>
data = json.loads(candidateList)
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjson__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjsondecoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjsondecoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

如果我尝试在(候选人列表(中添加双引号:

data = json.loads("candidateList")

它仍然没有让我去任何地方

Traceback (most recent call last):
File "queue.py", line 56, in <module>
data = json.loads(("candidateList"))
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjson__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjsondecoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjsondecoder.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)

遵循下面的一些建议 - 我已经停止将 candidate List 转换为字符串,而是使用 json.load。

candidateList = calCan()
data = json.load(candidateList)

这将返回:

Traceback (most recent call last):
File "queue.py", line 56, in <module>
data = json.load(candidateList)
File "C:UsersGordon RoseAppDataLocalProgramsPythonPython38libjson__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'dict' object has no attribute 'read'

在格式正确的 JSON 中,字符串需要双引号,但在字典的字符串文本中,字符串键和值作为单引号字符串给出。这是json.dumps(candidateList)str(candidateList)(其中candidateList = calCan()(之间的主要区别。

首先是

'{"candidates": [{"name": "candidate 1", "startTime": "09:18:00", "onboardTime": "00:04:10", "incidentTime": "00:00:00"}, {"name": "candidate 2", "startTime": "09:18:00", "onboardTime": "00:04:23", "incidentTime": "00:00:00"}, {"name": "candidate 3", "startTime": "09:19:00", "onboardTime": "00:05:08", "incidentTime": "00:00:00"}, {"name": "candidate 4", "startTime": "09:14:00", "onboardTime": "00:05:17", "incidentTime": "00:00:00"}, {"name": "candidate 5", "startTime": "09:12:00", "onboardTime": "00:04:38", "incidentTime": "00:00:00"}]}'

第二个是

"{'candidates': [{'name': 'candidate 1', 'startTime': '09:18:00', 'onboardTime': '00:04:10', 'incidentTime': '00:00:00'}, {'name': 'candidate 2', 'startTime': '09:18:00', 'onboardTime': '00:04:23', 'incidentTime': '00:00:00'}, {'name': 'candidate 3', 'startTime': '09:19:00', 'onboardTime': '00:05:08', 'incidentTime': '00:00:00'}, {'name': 'candidate 4', 'startTime': '09:14:00', 'onboardTime': '00:05:17', 'incidentTime': '00:00:00'}, {'name': 'candidate 5', 'startTime': '09:12:00', 'onboardTime': '00:04:38', 'incidentTime': '00:00:00'}]}"

data = json.loads(json.dumps(candidateList))

以及

data = json.dumps(str(candidateList).replace("'",'"'))

按预期工作。

最新更新