在Python中将JSON转换为字符串

107

我一开始没有清楚地解释我的问题。 在将JSON转换为python中的字符串时,请尝试使用str()json.dumps()

>>> data = {'jsonKey': 'jsonValue',"title": "hello world"}
>>> print json.dumps(data)
{"jsonKey": "jsonValue", "title": "hello world"}
>>> print str(data)
{'jsonKey': 'jsonValue', 'title': 'hello world'}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world"}'
>>> str(data)
"{'jsonKey': 'jsonValue', 'title': 'hello world'}"

我的问题是:

>>> data = {'jsonKey': 'jsonValue',"title": "hello world'"}
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': "hello world\'"}'
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\'"}'
>>> 

我期望的输出:"{'jsonKey': 'jsonValue','title': 'hello world''}"

>>> data = {'jsonKey': 'jsonValue',"title": "hello world""}
  File "<stdin>", line 1
    data = {'jsonKey': 'jsonValue',"title": "hello world""}
                                                          ^
SyntaxError: EOL while scanning string literal
>>> data = {'jsonKey': 'jsonValue',"title": "hello world\""}
>>> json.dumps(data)
'{"jsonKey": "jsonValue", "title": "hello world\\""}'
>>> str(data)
'{\'jsonKey\': \'jsonValue\', \'title\': \'hello world"\'}'

我的期望输出:"{'jsonKey': 'jsonValue','title': 'hello world\"'}"

不必为我再次将输出字符串更改为json(dict)格式。

如何做到这一点?


第二个表单本质上不是JSON。 - user948581
当你使用单引号和双引号时,会有很大的区别。尝试使用字符串版本通过 json.loads 进行加载。 - Padraic Cunningham
json.dumps() 用于将数据转换为 JSON 格式,而不是将 JSON 转换为字符串。 - Barmar
3
str 和 JSON 毫不相关;str(somedict) 看起来有点像 JSON 纯属巧合。str 是获取对象的字符串表现形式,可能与 JSON 完全不同(例如实现了 __str__ 方法的类)。 - Colonel Thirty Two
@ColonelThirtyTwo 我知道,实际上我更感兴趣的是当输入为 JSON 时,在输出字符串中单引号和双引号之间的区别。 - BAE
3
JSON需要使用双引号字符串,JSON中的单引号字符串是无效的。 - Colonel Thirty Two
2个回答

178

json.dumps() 不仅仅是把 Python 对象转换成字符串,它还能确保输出的结果符合 JSON 格式(假设对象中的所有内容都可序列化),并遵循 类型转换表格(Type Conversion Table)

例如,如果其中一个值为None,那么使用 str() 转换后会生成无效的 JSON 字符串,无法被加载:

>>> data = {'jsonKey': None}
>>> str(data)
"{'jsonKey': None}"
>>> json.loads(str(data))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 2 (char 1)

然而,dumps() 方法会将 None 转换为 null ,从而生成一个有效的可加载 JSON 字符串:

>>> import json
>>> data = {'jsonKey': None}
>>> json.dumps(data)
'{"jsonKey": null}'
>>> json.loads(json.dumps(data))
{u'jsonKey': None}

事实上,我更感兴趣的是输出字符串中单引号和双引号之间的差异。 - BAE
1
@BAE 嗯,在这种情况下很简单:https://dev59.com/qm855IYBdhLWcg3wvnOE。 - alecxe

1

还有其他不同之处。例如,{'time': datetime.now()}不能被序列化为JSON,但可以转换为字符串。根据用途(即结果是否会被解码),您应该使用这些工具中的一个。


事实上,我更感兴趣的是单引号和双引号之间的差异。 - BAE
然后alecxe已经回答了你。 - Eugene Primako

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