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

  1. Сообщение об ошибке кажется неправильным. Это не key name это проблематично (поскольку иногда срабатывает один и тот же ключ), но скорее value name.

  2. Единственные значения, которые могут быть проанализированы 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')])
Другие вопросы по тегам