str与json.dumps的区别
Dwzb
统计专业学生
我们常用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
转化成的字符串,则无法通过json.dumps
转化为python对象
>>> m = ['a', 'b']
>>> n = str(m)
>>> n
"['a', 'b']"
>>> json.loads(n)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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 None
json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
也就是说str
转化出的字符串格式不符合json规范,无法完成json格式字符串与python对象之间的转换。(但是可以使用eval
函数转换)
参考资料:
专栏信息
专栏主页:python编程
专栏目录:目录
版本说明:软件及包版本说明
编辑于 2018-05-25 09:39