Python 序列化已序列化的json字符串?

Python 序列化已序列化的json字符串?,python,json,Python,Json,我有一个将数据写入缓存的函数,其中数据必须序列化为json格式的字符串。与其检查输入的data是否是有效的json字符串(即try except语句),我是否可以始终调用json.dumps(data)?也就是说,如果输入的数据已序列化为json格式,则调用的是json.dumps(data) json.dumps(json.dumps(a)) 不等于 json.dumps(a) 因为第二个将a序列化为字符串,第一个将a序列化为字符串,然后将此字符串序列化为表示此字符串的字符串 例如: &g

我有一个将数据写入缓存的函数,其中数据必须序列化为json格式的字符串。与其检查输入的
data
是否是有效的json字符串(即try except语句),我是否可以始终调用
json.dumps(data)
?也就是说,如果输入的
数据
已序列化为json格式,则调用的是
json.dumps(data)

json.dumps(json.dumps(a))
不等于

json.dumps(a)
因为第二个将a序列化为字符串,第一个将a序列化为字符串,然后将此字符串序列化为表示此字符串的字符串

例如:

>>> import json
>>> a = { 'foo' : 'bar' }
>>> s_a = json.dumps(a)
>>> s_s_a = json.dumps(s_a)
>>> a
{'foo': 'bar'}
>>> s_a
'{"foo": "bar"}'
>>> s_s_a
'"{\\"foo\\": \\"bar\\"}"'
>>> 
也就是说,如果输入数据已经序列化为json格式,那么调用
json.dumps(data)
是否无害

好吧,我想这是无害的,因为结果仍然是一个有效的JSON字符串。但是在这种情况下,仅仅使用
s='{}'
更无害

两者都不是真正有用的
json.dumps(json.dumps(obj))
不会给你一些可以解码成
obj
的东西,它会给你一些可以解码成
json.dumps(obj)
的东西,这是无用的

我想您可以通过调用
json.loads
来处理这个问题,直到它出现为止,但是,除了重复您想要避免的事情之外(需要
尝试
/
,除了
),如果您想要发送的实际值是一个字符串,而该字符串恰好是某个内容的有效json编码,那么这样做是错误的(例如,如果你问我“我点击什么来格式化代码”,我回答
{}
,你对
“{}”
字符串进行了双重编码,你会得到一个空的dict而不是我的字符串),这将使调试错误变得更加困难,等等


所以,不,不要这样做。

试试看。在dict上运行dumps,然后在字符串上再次运行。JSON支持编码字符串,JSON格式的数据只是一个字符串。您会得到双重编码的数据,但这不是您所关心的,是吗?什么是“无害”呢?它确实改变了通过一次解码过程运行数据的效果,因为您需要两次过程才能将数据恢复到原始形式。如果您只需要“任何有效的JSON字符串”,而不关心它的含义,那么从这个意义上说,是的,它是无害的……但是忽略
数据
并使用
'{}“
适用于所有内容。无论如何,正确的做法不是尝试自动检测内容类型的try/except语句,而是要求传递到缓存的任何内容都已经以特定的形式存在,并修复任何不符合该要求的代码。那么?这仍然不会破坏任何内容。如果您尝试并使用当然了?@MartijnPieters:除非你计划通过递归调用
json.loads
来解析它,直到它失败,这只会重现OP想要避免的问题。此外,即使这样,如果你试图序列化一个恰好是一个字符串的字符串,你也会得到错误的答案对某些东西进行有效的JSON编码,因为这样做太过分了。