本文首发于
我们常用json文件存储数据,在写入文件前,通常使用json.dumps
函数将python对象转化为字符串再写入文件。但是str
函数也可以将字典、列表等转化为字符串,那么我们在写入json文件时可不可以不import json
,直接用str
来做呢?答案时不可以的。
我们来看几个例子
>>> import json>>> str([1,2])'[1, 2]'>>> str([1, 2])'[1, 2]'>>> json.dumps([1,2])'[1, 2]'>>> json.dumps([1, 2])'[1, 2]'>>> json.dumps([1, 2]) == str([1, 2])True复制代码
从上面例子可以看出
str
和json.dumps
都不是原模原样地输出我们输入的内容,会自动将列表逗号后面只加一个空格- 在
[1, 2]
这个例子上,二者是一样的
下面我们来看几个不一样的例子 1.引号
>>> str(['a', 'b'])"['a', 'b']">>> json.dumps(['a', 'b'])'["a", "b"]'>>> json.dumps(['a', 'b']) == str(['a', 'b'])False>>> str({ 'a': 1})"{'a': 1}">>> json.dumps({ 'a': 1})'{"a": 1}'>>> json.dumps({ 'a': 1}) == str({ 'a': 1})False复制代码
str
转化后的字符串中,引号是用单引号,而json.dumps
是双引号,这在字典和列表中都是这样
2.布尔值(True False
)
>>> str([True, False])'[True, False]'>>> json.dumps([True, False])'[true, false]'>>> json.dumps([True, False]) == str([True, False])False复制代码
str
转化后的字符串中,True
是首字母大写的,而json.dumps
将所有字母都转化为了小写
3.None
>>> str([1, None])'[1, None]'>>> json.dumps([1, None])'[1, null]'>>> json.dumps([1, None]) == str([1, None])False复制代码
str
转化后的字符串中,None
还是用None
表示,而json.dumps
则用null
表示。
我们都知道,使用json.dumps
的目的是将python对象转化为字符串,以存储到文件之中。之后需要数据的时候还要从文件中读取,再用json.loads
转化为python对象,类似下面这个过程
>>> m = ['a', 'b']>>> n = json.dumps(m)>>> n'["a", "b"]'-----存储入文件,读取文件----->>> p = json.loads(n)>>> p.append('c')>>> p['a', 'b', 'c']复制代码
但是我们如果用str
转化成的字符串,则无法再转化为python对象
>>> m = ['a', 'b']>>> n = str(m)>>> n"['a', 'b']">>> json.loads(n)Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Anaconda3\lib\json\__init__.py", line 319, in loads return _default_decoder.decode(s) File "C:\Program Files\Anaconda3\lib\json\decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Program Files\Anaconda3\lib\json\decoder.py", line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from Nonejson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)复制代码
也就是说str
转化出的字符串格式不符合json规范,无法完成json格式字符串与python对象之间的转换。
参考资料:
欢迎关注我的知乎专栏
专栏主页:
专栏目录:
版本说明: