博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python -m json.tool 中文乱码 Format JSON with python
阅读量:7168 次
发布时间:2019-06-29

本文共 1168 字,大约阅读时间需要 3 分钟。

现在以 json 为数据传输格式的 RESTful 接口非常流行。为调试这样的接口,一个常用的办法是使用 curl 命令:

curl http://somehost.com/some-restful-api

对于返回的 json 字符串,一般在服务端不加处理的情况下,都是没有任何 '\t' 和 '\n' 的。为了方便查看,在 bash 上可以简单地对它进行格式化:

curl http://somehost.com/some-restful-api | python -mjson.tool

当然这要求机器上安装了 python,其实也就是利用了 json.tool 这个程序。

然而有时候还有一个问题,就是若返回的 json 字符串中包含中文,那么这样打印出来之后,中文会变成以 \u 开头的转义形式,从而让程序员无法直接观察到中文的内容。这并非是一个 bug,而是 json 本身的标准,它要求 json 的内容都是 ascii 编码的。标准的 json 编码器和解码器都会遵循这一点。

解决这个问题的办法是编辑 json.tool 程序,该程序存在于 python 系统库安装路径下的 json/tool.py。在 main 方法的最后,将:

json.dump(obj, outfile, sort_keys=True, indent=4)

修改为:

json.dump(obj, outfile, sort_keys=True, indent=4, ensure_ascii=False)

即让 json.tool 程序不强行保证 json 的内容都转义为 ascii 编码。修改后,再次运行

curl http://somehost.com/some-restful-api | python -mjson.tool

打印的结果即可正常包含中文。

不过这样还是会有问题,当返回的 json 字符串中包含了一些类似 emoji 表情这种无法正常编码的字符时,将结果打印到 bash 没问题,但是一旦打印到 less 或者文件上,则会提示编码错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

解决办法,手动在 json.tool 程序中编码。在 json/tool.py 的最后,修改为(需提前 import codecs):

s = json.dumps(obj, sort_keys=True, indent=4, ensure_ascii=False)outfile.write(codecs.encode(s, 'utf-8'))

这样就可以了。

gist: 

 

转载地址:http://vgqwm.baihongyu.com/

你可能感兴趣的文章
求两个字符串的最长公共子字符串
查看>>
移动互联时代,移动端车牌识别的价值在哪?
查看>>
CentOS 7 单用户模式,救援模式。
查看>>
五款用起来爱不释手的手机APP有哪些
查看>>
广告配音免费制作软件让你轻松完成广告配音
查看>>
C++ Primer 学习笔记(第五章:语句)
查看>>
依图挺入AI芯片赛道,新产品“求索”视觉推理能力超越英伟达
查看>>
什么是“容器技术”?为什么它对物联网和云计算如此重要?
查看>>
教你如何实现 Android TextView 文字轮播效果
查看>>
UITableView
查看>>
ContextMenu和OptionsMenu主要有以下区别
查看>>
iptables详解
查看>>
Mysql 分区介绍(九) —— 分区管理
查看>>
exchange2010---将邮箱置于保留挂起中---Retention Hold
查看>>
Vert.x系列(四)-- HAManager源码分析
查看>>
Java 8 中的 Streams API 详解
查看>>
搭建安全的Web服务器
查看>>
初学者
查看>>
小叙安装CentOS 6.5
查看>>
LVM 扩展/减缩/镜像 【有图有真相】
查看>>