ValueError: объект JSON не может быть декодирован при чтении из файла

Я пытаюсь загрузить документ JSON в свой код Python. Документ выглядит так:

{
  "FH45 G34": {
    "surname": "Foo",
    "firstName": "Bar",
    "address": "1275 Real Street, FooBar",
    "postCode": "Foo Bar",
    "county": "FooBar"
  },
  ...
}

Я пытаюсь загрузить файл со следующим кодом Python:

with open("foobar.json", "r") as foo:
        bar = json.load(foo)

Однако я получаю следующую ошибку ValueError: No JSON object could be decoded

Что случилось?

РЕДАКТИРОВАТЬ: я не могу использовать модуль SimpleJSON, так как он недоступен для Python 3.2, который я застрял в использовании. JSONLint также показывает, что мой JSON действителен.

РЕДАКТИРОВАТЬ 2: Весь файл находится здесь

РЕДАКТИРОВАТЬ 3: Каким-то образом проблема устранена сама собой.


person Paul Clavier    schedule 12.10.2015    source источник
comment
comment
@ivanab Я не могу использовать модуль SimpleJSON, так как он недоступен для Python 3.2, который я застрял в использовании.   -  person Paul Clavier    schedule 12.10.2015
comment
Вы уверены, что ваш файл json является допустимым json?   -  person Ivana Balazevic    schedule 12.10.2015
comment
@ivanab Согласно JSONLint.   -  person Paul Clavier    schedule 12.10.2015
comment
Вам не хватает запятой после ... Street, FooBar, поэтому json недействителен, как указано...   -  person holroy    schedule 12.10.2015
comment
Может быть, вы тоже можете попробовать ujson, он должен быть доступен и для Python 3.   -  person Ivana Balazevic    schedule 12.10.2015
comment
@ivanab К сожалению, это для Python 3.3 и выше.   -  person Paul Clavier    schedule 12.10.2015
comment
@holroy, это была просто ошибка при копировании файла json в stackoverflow. Я исправлю.   -  person Paul Clavier    schedule 12.10.2015
comment
Я думаю, вам нужно использовать with open("foobar.json", "r") as foo: bar = json.loads(foo.read())   -  person Casimir Crystal    schedule 12.10.2015
comment
@KevinGuan К сожалению, я получаю ту же ошибку. json.load следует просто прочитать сам файл, а затем преобразовать.   -  person Paul Clavier    schedule 12.10.2015
comment
Не могли бы вы предоставить весь файл или упростить файл до минимума и посмотреть, продолжает ли возникать ошибка? И какую библиотеку вы на самом деле используете?   -  person holroy    schedule 12.10.2015
comment
Хм... как насчет этого вопрос?   -  person Casimir Crystal    schedule 12.10.2015
comment
@KevinGuan, это возможный повторяющийся вопрос ... Но в нем есть намек на то, что если в одном из списков есть запятая в конце, это может привести к такому сообщению об ошибке. Так что нам нужно увидеть больше файла, а не только отрывок.   -  person holroy    schedule 12.10.2015
comment
@KevinGuan Я не могу использовать модуль SimpleJSON, так как он недоступен для Python 3.2, с которым я застрял.   -  person Paul Clavier    schedule 12.10.2015
comment
@holroy, весь файл здесь   -  person Paul Clavier    schedule 12.10.2015
comment
@PaulClavier Хорошо, извини за это.   -  person Casimir Crystal    schedule 12.10.2015
comment
@KevinGuan Нет проблем!   -  person Paul Clavier    schedule 12.10.2015
comment
@PaulClavier Хорошо, я только что скачал ваш файл и попробовал with open("foobar.json", "r") as foo: bar = json.loads(foo.read()), он отлично работает на Python 3.5. Может быть, эта проблема связана с Python 3.2?   -  person Casimir Crystal    schedule 12.10.2015
comment
@KevinGuan Я поговорю об этом со своим учителем.   -  person Paul Clavier    schedule 12.10.2015
comment
@PaulClavier Хорошо, удачи :)   -  person Casimir Crystal    schedule 12.10.2015
comment
@PaulClavier, используйте stackoverflow.com/questions /20199126/   -  person Anup    schedule 12.10.2015
comment
У меня работает с python 3.5 (О, я вижу, Кевин Гуар тоже меня побил. Что ж, я подтверждаю его эксперимент.)   -  person saulspatz    schedule 12.10.2015


Ответы (2)


При чтении файла с помощью Python 2.7 он преобразует большинство строк в строки Unicode, что говорит о том, что, возможно, следующее изменение может иметь значение в вашем мире Python 3.2:

with open('foobar.json', encoding='utf-8') as foo:
        bar = json.load(foo)
        # or
        bar = json.loads(foo.read())

Обнаружить нарушающую линию

Если вышеперечисленное не работает, вам нужно найти оскорбительный код json. Один из способов сделать это — просто удалить половину файла и повторить попытку. Если это все еще не удается, продолжайте удалять половину файла.

Если это работает, замените файл неисправной частью и снова начните удаление половинок. После нескольких попыток вы сможете найти проблемную часть файла или определить, есть ли у вас базовая ошибка чтения.

Чтобы устранить ошибки чтения, вы можете попробовать выполнить print('file: {}'.format(foo.read())) перед вызовом json.loads(), просто чтобы проверить прочитанное содержимое.

Протестируйте встроенный json

Другой тест, который вы можете попробовать для дальнейшего устранения источников ошибок, состоит в том, чтобы взять одну или несколько записей, вставленных в строку, и проверить, является ли это обработкой файла или обработкой json, которая дает вам ошибку. Что-то похожее на следующее:

json_text= '''
{ "FH45 G34": 
  {
    "surname": "Foo", 
    "firstName": "Bar",
    "address": "1275 Real Street, FooBar", 
    "postCode": "Foo Bar", 
    "county": "FooBar"
  }
}'''

parsed = json.loads(json_text)

И вы также можете проверить, не происходит ли это из-за пробела в ключе первой записи. Другими словами, удалите пробелы из ошибочной записи, прежде всего в значениях левого ключа.

Если эти тесты в порядке, у вас есть проблемы с чтением вашего файла. Если они терпят неудачу, у вас есть проблема с модулем json.

person holroy    schedule 12.10.2015
comment
Нет, все еще не работает над Python 3.2. Я сохранил файл как UTF-8 в Блокноте, установил кодировку UTF-8 и UTF-8-SIG и попробовал только одну запись, но все равно получаю ту же ошибку. - person Paul Clavier; 16.10.2015
comment
@PaulClavier, попробуйте встроенные тесты, как описано в моем обновлении. - person holroy; 17.10.2015
comment
@PaulClavier, я тестировал только что скомпилированный Python 3.2.6 и не могу сгенерировать ошибку. Какую именно версию Python вы используете и под какой операционной системой? - person holroy; 17.10.2015
comment
Встроенные тесты проходят - person Paul Clavier; 23.10.2015
comment
@PaulClavier, если встроенный тест пройден, у вас есть проблемы с чтением файла. Вы пробовали читать файл и просто печатать каждую строку? - person holroy; 23.10.2015

Следующий код был протестирован и безупречно работает с whole JSON file, как указано в вашем вопросе.

Рабочий пример — протестировано с Python 2.6.9 и 2.7.10 и < strong>3.2.5 и 3.3.5 и 3.5.0

import json

with open('data.json', 'r') as json_data:

    data = json.load(json_data)

    for key, value in data.items():
        print('''
key    {0}

    county       {1}
    surname      {2}
    postCode     {3}
    firstName    {4}
    address      {5}
'''.format(*[key,
             value['county'],
             value['surname'],
             value['postCode'],
             value['firstName'],
             value['address']]))

Вывод

key    VB95 JGL

    county       FooBar
    surname      Foo
    postCode     Foo Bar
    firstName    Bar
    address      1272 Real Street, FooBar


key    AH63 FIR

    county       FooBar
    surname      Foo
    postCode     Foo Bar
    firstName    Bar
    address      1275 Real Street, FooBar
person jesterjunk    schedule 19.10.2015
comment
Я уже пробовал это, и, к сожалению, это тоже не сработало. .load() все равно автоматически читает файл для вас, так что это не имеет значения. .loads() лучше, когда вы анализируете, скажем, ответ с веб-страницы. - person Paul Clavier; 19.10.2015
comment
@ paul-clavier Я только что отредактировал и протестировал свой код, чтобы отразить то, что вы упомянули, и запустил его на новой установке Python 3.2.5, и он работает так же, как и все другие версии, с которыми я его тестировал. Похоже, ваша копия библиотеки json может быть сломана/повреждена, или, возможно, что-то не так с вашей установкой Python. - person jesterjunk; 19.10.2015
comment
@ paul-clavier Можете ли вы предоставить точную версию выпуска Python 3.2, которую вы используете? 3.2.0 или 3.2.1 или 3.2.2 или 3.2.3 или 3.2.4 или 3.2.5 или 3.2.6? Вы можете получить свою версию Python с помощью следующей строки import sys; print('.'.join(map(str, sys.version_info[0:3]))) - person jesterjunk; 19.10.2015
comment
@PaulClavier, вы пробовали последний тест, который я предложил, с использованием json.loads(multiline_text_variable), чтобы проверить, происходит ли сбой загрузки вашего файла или сбой фактической библиотеки json? - person holroy; 21.10.2015