Не могу заставить работать json .loads - не понимаю сообщение об ошибке - PullRequest
0 голосов
/ 30 мая 2020

Новое в разработке и 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 .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)

Следуя некоторым советам, приведенным ниже - я перестал преобразовывать список кандидатов в строку и вместо этого использую 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'

1 Ответ

0 голосов
/ 30 мая 2020

В правильно отформатированном 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("'",'"'))

работают как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...