在python中将json转换为字符串


79

一开始我没有清楚地解释我的问题。在JSON中将json转换为字符串时,请尝试使用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。

当您使用单引号和双引号时,会有很大的不同,请尝试使用str版本的json.loads进行加载
Padraic Cunningham

json.dumps()用于转换JSON,而不是从JSON转换为字符串。
Barmar

2
str具有绝对没有做JSON; str(somedict)看起来有点像JSON的事实是巧合。str获取对象的字符串表示形式,该字符串表示形式看起来可能与JSON相似(例如,针对实现的类__str__)。
'32上校

1
@BAE JSON需要双引号字符串。JSON中的单引号字符串无效。
'32上校

Answers:


136

json.dumps()不仅仅是从Python对象中生成字符串,它还会在类型转换表之后始终生成有效的JSON字符串(假设对象内部的所有内容都可序列化)

例如,如果值之一是Nonestr()将产生一个无法加载的无效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()将转换Nonenull生成可以加载的有效JSON字符串:

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

实际上,我对它们在输出字符串中单引号和双引号的区别更感兴趣。
BAE

@BAE好,在这种情况下很简单:stackoverflow.com/questions/4162642/…
alecxe

1

还有其他区别。例如,{'time': datetime.now()}不能序列化为JSON,但可以转换为字符串。您应根据目的使用这些工具之一(即稍后将对结果进行解码)。


实际上,我对它们在单引号和双引号中的区别更感兴趣。
BAE

然后alecxe回答了您。
Eugene Primako
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.