从文件中读取JSON

514

一个看起来很简单的语句却在我的面前产生了一些错误。

我有一个名为strings.json的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]

8
文件中是否包含有效的 JSON 数据?您确定吗? - Explosion Pills
参见:JSON读写示例 - Martin Thoma
1
您的文件格式不是有效的JSON格式。请将其更改为:{"strings": [{"-name": "city", "#text": "城市"}, {"-name": "phone", "#text": "电话"}, ..., {"-name": "address", "#text": "地址"}]} - krizex
1
即输入无效的地方是缺少周围的 {} 大括号。 - smci
1
如果您从互联网上读取数据,通常可以使用相同的技术处理从HTTP API获取的响应(它将是一个类似文件的对象);但是,强烈建议改用第三方Requests库,该库包含对JSON请求的内置支持。有关详细信息,请参见https://dev59.com/-Ww15IYBdhLWcg3wzO5_;请注意,多个答案都提到了Requests。 - Karl Knechtel
显示剩余2条评论
7个回答

836

json.load()方法(load中没有"s")可以直接读取文件:

import json

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

您正在使用json.loads()方法, 该方法仅用于字符串参数。
使用json.loads时出现的错误是完全不同的问题。在这种情况下,文件中存在一些无效的JSON内容。对于这个问题,我建议您通过JSON验证器运行该文件。
还有一些解决方案可以修复JSON,例如如何自动修复无效的JSON字符串?

121

这是一份对我来说运行良好的代码副本,

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行周围添加try catch,因为无效的JSON会导致堆栈跟踪错误信息。


49

问题出在使用with语句:

with open('strings.json') as json_data:
    d = json.load(json_data)
    pprint(d)
文件即将被隐式关闭,因此无需再次调用 json_data.close()

4
为了美观地打印,我必须使用以下代码:print(json.dumps(d, sort_keys=True, indent=2))。其中,d是需要打印的数据。sort_keys=True表示按键进行排序,indent=2表示缩进两个空格。 - Mike D
问题中的无效JSON输入怎么办? - Peter Mortensen

41

在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)

3

除此之外,今天你可以使用pandas来导入JSON:pandas.read_json

您可能需要仔细使用orient参数。


1
如果您添加代码示例以及网址,这个答案会更好。 - James McCorrie

2

您可以使用Pandas库来读取JSON文件。

import pandas as pd
df = pd.read_json('strings.json', lines=True)
print(df)

-5
def read_JSON():
    with open("FILE PATH", "r") as i:
        JSON_data = i.read()
    print(JSON_data)

3
这只是打开JSON文件并将其读入变量,而不对其进行解析;你确定这是OP想要的吗? - TheTechRobo the Nerd
是的,这将有助于读取JSON对象以将它们用作请求有效载荷或任何其他目的。我正在使用它来实现当前API请求,并且对我来说效果很好。 - Pushparaj
如果你需要解析文件,那么使用.read的方式是不好的,因为你将不得不重新实现json模块已经完成的工作。 - Gino Mempin
我认为LOAD将使用Python字典重新实现JSON,但READ可以直接将JSON加载到数据框中。 - Pushparaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接