阅读 1935

str与json.dumps的区别

本文首发于知乎

我们常用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
复制代码

从上面例子可以看出

  • strjson.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 "<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对象之间的转换。

参考资料:

strjson.dumps的区别

欢迎关注我的知乎专栏

专栏主页:python编程

专栏目录:目录

版本说明:软件及包版本说明

文章分类
后端