2013-11-25 2 views
180

Я получаю немного головную боль только потому, что простое, простое заявление бросает некоторые ошибки на моем лице.Чтение 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.loads до json.load

и получил следующее:

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] 
+3

Вы уверены, что файл содержит действительный JSON? –

+1

Возможный дубликат [Разбор значений из файла JSON в Python] (http://stackoverflow.com/questions/2835559/parsing-values-from-a-json-file-in-python) – Pureferret

+0

См. Также: [Read & Напиши пример для JSON] (http://stackoverflow.com/a/37795053/562769) –

ответ

308

json.load() method (без «с» в «нагрузке») может прочитать файл непосредственно:

import json 

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

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

Редактировать: Новое сообщение - совершенно другая проблема. В этом случае в этом файле есть некорректный json. Для этого я бы рекомендовал запустить файл через json validator.

Есть также решения для фиксации json, например, How do I automatically fix an invalid JSON string?.

+1

hm ... Я изменил с json.loads на json.load, но я получаю этот хороший msg. – Doug

+4

А, а новое сообщение - совершенно другая проблема. В этом случае в этом файле есть некорректный json. Для этого я бы рекомендовал запустить файл с помощью [json validator] (http://jsonlint.com/). – ubomb

+3

получил! В файле отсутствует EOF. Файл не был правильно закончен. Я бы не заметил, что если бы это была не твоя хорошая рекомендация! Благодаря! – Doug

95

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

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.load линию с попыткой поймать, потому что недействительный JSON будет вызывают сообщение об ошибке stacktrace.

33

Проблема с использованием с высказыванием:

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

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

+1

Удалите json_data.close(). Как уже упоминалось, это будет называться неявно. –

+1

Спасибо @BonnieVarghese за указание. Я исправил выше – Zongjun

+1

@ Zongjun: Пожалуйста, исправьте загрузки json.load (json_data). – Knight71

7

В python 3, мы можем использовать метод ниже.

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

# Considering "json_list.json" is a json file 

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

или

json_data = json.load(open('json_list.json')) 

Строка JSON

json_data = json.loads('{"name" : "myName", "age":24}') 
Смежные вопросы