HJSON будет анализировать только целые числа или нулевые значения
Я пытаюсь разобрать, каким должен быть JSON, в dict Python. Однако файл JSON, с которым я работаю, недействителен, так как часто пары ключ-значение будут отсутствовать в кавычках. Мне кажется, что HJSON - это то, что я ищу, однако я обнаруживаю ошибки, если пытаюсь передать любое значение, кроме целого числа.
Поиграйте с ним, используя некоторые значения JSON, с которыми мне нужно работать:
import hjson
# EXAMPLE 1
working = hjson.loads('{ date_closed: null }') # <- THIS WORKS!
print(working)
OrderedDict([('date_closed', None)])
# EXAMPLE 2
works_too = hjson.loads('{ date_closed: 42 }') # <- THIS WORKS!
print(works_too)
OrderedDict([('date_closed', 42)])
# EXAMPLE 3
not_working = hjson.loads('{ date_closed: yes }') # <- ERRORS!
~/hjson/decoder.py in scanKeyName(s, end, encoding, strict)
278
279 if ch == '':
--> 280 raise HjsonDecodeError("Bad key name (eof)", s, end);
281 elif ch == ':':
282 if begin == end:
HjsonDecodeError: Bad key name (eof): line 1 column 21 (char 20)
# EXAMPLE 4
# Using different key name
also_not_working = hjson.loads('{ date_opened: yes }') # <- ERRORS with identical error message as above
# Different value name, showing it's not a 'key' error but a 'value' error
this_works = hjson.loads('{ date_opened: null }') # <- THIS WORKS!
print(this_works)
OrderedDict([('date_opened', None)])
# EXAMPLE 5
doesnt_work = hjson.loads('{ date_opened: None }') # <- ERRORS with identical error message as above
Сообщение об ошибке кажется неправильным. Это не
key name
это проблематично (поскольку иногда срабатывает один и тот же ключ), но скорееvalue name
.Единственные значения, которые могут быть проанализированы HJSON, - это целые числа (value
42
работает) иnull
ценности.
Что мне здесь не хватает?
1 ответ
Я просто возился с этим и взглянул на спецификацию HJSON и основываясь на приведенных там примерах (также в разделе try ), и думаю, что понял это. Это четко не объяснено как таковое, и кто-то может поправить меня, если я ошибаюсь, но похоже, что HJSON требует открывающих и закрывающих фигурных скобок,
{
а также
}
находиться на отдельных линиях; по крайней мере, я полагал, что реализация Python придерживается этого, во всяком случае. Например, вот прямое использование, которое я смог подтвердить, похоже, анализируется без проблем:
print(hjson.loads('''
{
testing_123: hello world
}
'''))
# now it works! prints out:
# OrderedDict([('testing_123', 'hello world')])
Итак, в вашем случае, я полагаю, самым простым способом исправить это (то есть, если вы не хотите вручную помещать фигурные скобки в отдельные строки) было бы создать функцию-оболочку
loads
, определяемый следующим образом:
import hjson
def loads(string, decoder=hjson.loads):
return decoder(string.replace('{', '{\n').replace('}', '\n}'))
И теперь я могу подтвердить, что оба приведенных выше случая теперь, похоже, разбираются так, как ожидалось изначально:
working_now = loads('{ date_closed: yes }')
print(working_now)
also_working = loads('{ date_opened: yes }') # <- ERRORS with identical error message as above
print(also_working)
Вне:
OrderedDict([('date_closed', 'yes')])
OrderedDict([('date_opened', 'yes')])