在Python中,json.load()和json.loads()之间的区别是什么?
我猜load()函数必须与文件对象一起使用(我需要因此使用上下文管理器),而loads()函数将文件的路径作为字符串。这有点让人困惑。
json.loads()中的字母“s”代表字符串吗?
非常感谢你的回答!
在Python中,json.load()和json.loads()之间的区别是什么?
我猜load()函数必须与文件对象一起使用(我需要因此使用上下文管理器),而loads()函数将文件的路径作为字符串。这有点让人困惑。
json.loads()中的字母“s”代表字符串吗?
非常感谢你的回答!
当前回答
是的,s代表字符串。json。load函数不获取文件路径,而是将文件内容作为字符串。查看文档。
其他回答
在大家解释的基础上再加一个简单的例子,
json.load ()
json。Load可以反序列化文件本身,即它接受一个文件对象,例如,
# open a json file for reading and print content using json.load
with open("/xyz/json_data.json", "r") as content:
print(json.load(content))
将输出,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
如果我使用json。加载来打开一个文件,
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
我会得到这个错误:
TypeError:期望的字符串或缓冲区
json.loads ()
Json.loads()反序列化字符串。
为了使用json。我将不得不使用read()函数传递文件的内容,例如,
使用content.read()和json.loads()返回文件的内容,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
输出,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
这是因为content.read()的类型是字符串,即<type 'str'>
如果我使用json.load()和content.read(),我会得到错误,
with open("json_data.json", "r") as content:
print(json.load(content.read()))
给了,
AttributeError: 'str'对象没有属性'read'
现在你知道了json。加载反序列化文件和json。加载反序列化字符串。
另一个例子,
sys。stdin返回文件对象,所以如果我打印(json.load(sys.stdin)),我将得到实际的json数据,
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
如果我想使用json.loads(),我会做print(json.loads(sys.stdin.read()))而不是。
快速回答(非常简单!)
json.load()接受一个FILE Json.load()需要一个文件(文件对象)-例如,您之前打开的文件,如'files/example.json'。
json.loads()接受一个STRING参数 JSON .loads()需要一个(有效的)JSON字符串——即{"foo": "bar"}
例子
假设您有一个文件示例。{"key_1": 1, "key_2": "foo", "Key_3": null}
>>> import json
>>> file = open("example.json")
>>> type(file)
<class '_io.TextIOWrapper'>
>>> file
<_io.TextIOWrapper name='example.json' mode='r' encoding='UTF-8'>
>>> json.load(file)
{'key_1': 1, 'key_2': 'foo', 'Key_3': None}
>>> json.loads(file)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 341, in loads
TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper
>>> string = '{"foo": "bar"}'
>>> type(string)
<class 'str'>
>>> string
'{"foo": "bar"}'
>>> json.loads(string)
{'foo': 'bar'}
>>> json.load(string)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'
在python3.7.7中,json的定义。根据cpython源代码加载如下:
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
return loads(fp.read(),
cls=cls, object_hook=object_hook,
parse_float=parse_float, parse_int=parse_int,
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
json。Load实际上调用json。加载并使用fp.read()作为第一个参数。
如果你的代码是:
with open (file) as fp:
s = fp.read()
json.loads(s)
这样做是一样的:
with open (file) as fp:
json.load(fp)
但是如果你需要像fp.read(10)那样指定从文件中读取的字节,或者你想要反序列化的字符串/字节不是来自文件,你应该使用json.loads()
对于json.loads(),它不仅反序列化字符串,还反序列化字节。如果s是bytes或bytearray,它将首先被解码为string。您也可以在源代码中找到它。
def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object.
...
"""
if isinstance(s, str):
if s.startswith('\ufeff'):
raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",
s, 0)
else:
if not isinstance(s, (bytes, bytearray)):
raise TypeError(f'the JSON object must be str, bytes or bytearray, '
f'not {s.__class__.__name__}')
s = s.decode(detect_encoding(s), 'surrogatepass')
文档非常清楚:https://docs.python.org/2/library/json.html
json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
反序列化fp(一个.read()支持的类似文件的对象,其中包含一个 JSON文档)转换为Python对象。
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
反序列化s(包含JSON文档的str或unicode实例) 使用此转换表转换为Python对象。
load是针对文件的,load是针对字符串的
是的,s代表字符串。json。load函数不获取文件路径,而是将文件内容作为字符串。查看文档。