我无法使json.loads正常工作不理解错误消息

2024-05-13 18:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

熟悉开发和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

我可以使用

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.loads和

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:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\decoder.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:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\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)

遵循下面的一些建议-我已经停止将candidateList转换为字符串,而是使用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:\Users\Gordon Rose\AppData\Local\Programs\Python\Python38\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
AttributeError: 'dict' object has no attribute 'read'

Tags: inpyjsontimelinerandomusersfile
1条回答
网友
1楼 · 发布于 2024-05-13 18:51:26

在格式正确的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("'",'"'))

按预期工作

相关问题 更多 >