Вопрос-Ответ

Reading JSON from a file [duplicate]

Чтение JSON из файла [дубликат]

Простое на вид утверждение бросает мне в глаза некоторые ошибки.

У меня есть файл JSON с именем strings.json вот так:

"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
{"-name": "address", "#text": "Address"}]

Я хочу прочитать файл JSON, пока только это. У меня есть эти инструкции, которые я обнаружил, но это не работает:

import json
from pprint import pprint

with open('strings.json') as json_data:
d = json.loads(json_data)
json_data.close()
pprint(d)

Ошибка, отображаемая на консоли, заключалась в следующем:

Traceback (most recent call last):
File "/home/.../android/values/manipulate_json.py", line 5, in <module>
d = json.loads(json_data)
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]

Если я использую json.load вместо json.loads, я получаю эту ошибку:

Traceback (most recent call last):
File "/home/.../android/values/manipulate_json.py", line 5, in <module>
d = json.load(json_data)
File "/usr/lib/python2.7/json/__init__.py", line 278, in load
**kw)
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]
Переведено автоматически
Ответ 1

json.load()Метод (без "s" в "load") может читать файл напрямую:

import json

with open('strings.json') as f:
d = json.load(f)
print(d)

Вы использовали json.loads() метод, который используется только для строковых аргументов.


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

Существуют также решения для исправления JSON, например, Как мне автоматически исправить недопустимую строку JSON?.

Ответ 2

Вот копия кода, который у меня отлично работает,

import json

with open("test.json") as json_file:
json_data = json.load(json_file)
print(json_data)

с данными

{
"a": [1,3,"asdf",true],
"b": {
"Hello": "world"
}
}

Возможно, вы захотите обернуть свой json.загрузите строку с помощью try catch, потому что неверный JSON вызовет сообщение об ошибке stacktrace.

Ответ 3

Проблема заключается в использовании инструкции with:

with open('strings.json') as json_data:
d = json.load(json_data)
pprint(d)

Файл уже будет неявно закрыт. Повторный вызов не требуется json_data.close().

Ответ 4

В Python 3 мы можем использовать приведенный ниже метод.

Чтение из файла и преобразование в JSON

import json
from pprint import pprint

# Considering "json_list.json" is a JSON file

with open('json_list.json') as fd:
json_data = json.load(fd)
pprint(json_data)

Оператор with автоматически закрывает открытый файловый дескриптор.


Преобразование строки в JSON

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)
python json