中文编码问题
这样一段代码:
import json
dict = {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
dup = json.dumps(dict ,ensure_ascii=False)
print(dup)
Python2执行输出:
{"id": 1, "title": "第一章 秦羽"}
Python3执行报错:
TypeError: Object of type bytes is not JSON serializable
终稿:
安装模块:
pip3 install numpy
最终代码:
import json
import numpy as npclass MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.ndarray):return obj.tolist()elif isinstance(obj, bytes):return str(obj, encoding='utf-8');return json.JSONEncoder.default(self, obj)dict = {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
dup = json.dumps(dict , cls=MyEncoder, ensure_ascii=False, indent=4)
print(dup)
之前的单个转码:
sql = "SELECT id,title FROM novel LIMIT 10;"
result = mysql.getAll(sql)
for each in result:ach['title'] = each['title'].decode('utf-8')
参考:https://blog.csdn.net/bear_sun/article/details/79397155
Web输出
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:
- json.dumps(): 对数据进行编码。
- json.loads(): 对数据进行解码。
# 字典类型中有中文编码
dict= {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
# 转Json对象
dict= json.dumps(dict, cls=MyEncoder, ensure_ascii=False, indent=4)
# 转字典类型
dict= json.loads(dict)context = {}
context.update({'novel_list': result})
# 或者直接
context = {'novel_list': result}return render(request, 'novel_list.html', context)
例子如下:
import json
import numpy as npclass MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.ndarray):return obj.tolist()elif isinstance(obj, bytes):return str(obj, encoding='utf-8');return json.JSONEncoder.default(self, obj)dict = {'id': 1, 'title': b'\xe7\xac\xac\xe4\xb8\x80\xe7\xab\xa0 \xe7\xa7\xa6\xe7\xbe\xbd'}
dup = json.dumps(dict, cls=MyEncoder, ensure_ascii=False, indent=4)
print(dup)
indent
根据数据格式缩进显示,读起来更加清晰,indent的数值,代表缩进的位数。
ensure_ascii
如果无任何配置,或者说使用默认配置, 输出的会是中文的ASCII字符吗,而不是真正的中文。 这是因为json.dumps 序列化时对中文默认使用的ascii编码。
{"id": 1,"title": "\u7b2c\u4e00\u7ae0 \u79e6\u7fbd"
}
cls
dict类型的数据(存在中文),在python2中是可以转化的,但是在python3中存在序列化问题:
TypeError: Object of type bytes is not JSON serializable