在json的数据处理过程中,最让人无奈的就是json serializable的问题,遇到的多了,慢慢就总结了一点经验。
还是要从最基础的说起:

正如上面所说的:
- 在将dict, list等python对象编码成json字符串的时候就要用到json.dumps()
- 而将json字符串解码为python 对象时用的是json.loads()
至于其他的基础知识查文档都可以看到,我主要说一下遇到问题怎么解决。
class JSONEncoder(json.JSONEncoder):
""" solve the problem that ObjectId and datetime can't serializable"""
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, UUID):
return o.hex
return json.JSONEncoder.default(self, o)直接将遇到的不能转换的类型分装成一个类,尤其是在mongodb的数据处理中,经常能碰到objectid ,datetime,uuid的转换错误,以后要是遇到别的继续添加就是。
其中ObjectId要从bson引入。
from bson import ObjectIddatetime也要引入也有可能遇到NoneType的情况
NoneType要从types引入
from types import NoneTypeUUID要从uuid引入
from uuid import UUID接下来就是在处理的函数中调用这个类即可。
比如说我们有一个python_dict,想要将其转化为json_str
json_str= json.dumps(python_dict,cls=JSONEncoder,indent=4)其中参数cls 是我们自己封装的类,indent参数一个数字,也可以不加,在这加的原因后面会提到。
如果我们想要让打印出来的json_str具有醒目的格式,indent则会很有用,至于具体的数字是多少,随你设定,设置为4是因为和python的缩进是一致的,看起来舒服而已。
如果想要在前端页面中显示出来json的样式。有两种方式:
- 在前端使用js实现
- 在将数据存入数据库之前我们就将数据转换为标准的 json 字符串,直接在页面调用即可。
比如在flask中,直接使用<pre>标签即可。
<pre>{{json_str}}</pre>这样显示出来的就是标准的json样式了,对于内容一目了然。
补充:
其中有一个比较坑的地方。其实到这一步的时候我们该做的都已经做了,讲道理来说应该没什么问题了。但是在实践的过程中我发现页面展示出来的结果中文格式还是不正确。是'\u***\u**'这样的unicode编码。回到数据库查看发现数据在存的时候就存的是unciode的编码。
最后查看json_str的格式,发现确实是unicode的编码,这样当然不会显示正确了。
所以最后一步再加上
json_str = json_str.encode('utf-8')将json字符串以'utf-8'进行编码。
这样问题就完美的得到了解决。