现在以 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: https://gist.github.com/nicky-zs/6af8a1afc771ad76d463

python -m json.tool 中文乱码 Format JSON with python的更多相关文章

  1. python json.dumps() 中文乱码问题

    python json.dumps() 中文乱码问题   python 输出一串中文字符,在控制台上(控制台使用UTF-8编码)通过print 可以正常显示,但是写入到文件中之后,中文字符都输出成as ...

  2. Spring MVC3返回JSON数据中文乱码问题解决(转)

    Spring MVC3返回JSON数据中文乱码问题解决 查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题. Spring版本:3.2.2.RELEASE Jack ...

  3. Python 生成的页面中文乱码问题

    第一 保证 程序源文件里的中文的编码格式,如我们把 源文件的编码设置成utf8的. reload(sys) sys.setdefaultencoding('utf-8') 第二, 告诉浏览器,我们须要 ...

  4. python向数据库插入中文乱码问题

    1.python向数据库插入中文乱码问题 直接手动insert into 中文 不乱码,但是用程序跑起来就乱码. conn =MySQLdb.connect(host="127.0.0.1& ...

  5. python json.dumps中文乱码

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: >>> import json>>> js = json.lo ...

  6. PHP读取mssql,json数据中文乱码

    PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码(936,即GBK编码) 当读取数据库数据时,使用php自带的json_encode()返回到前端,结果中文不显示. ...

  7. springmvc返回json字符串中文乱码问题

    问题: 后台代码如下: @RequestMapping("menuTreeAjax") @ResponseBody /** * 根据parentMenuId获取菜单的树结构 * @ ...

  8. python3解决 json.dumps中文乱码

    使用json.dumps()运行结果如下 role_name字段中文乱码了 只需要使用ensure_ascii=False 运行结果如下:

  9. spring mvc从@ResponseBody取到json发现中文乱码

    问题背景:如题. 问题定位:代码跟踪,从源头入手,一步一步跟进,直到设置中文编码的地方. 问题代码: /** * 获取单个测试桩接口内容 * * @author wulinfeng * @param ...

随机推荐

  1. mysql: 关于MySQL InnoDB锁行还是锁表?

          baidu zone - 关于MYSQL Innodb 锁行还是锁表,深入讲解

  2. Audio原理图设计

    1.DMIC 1)当双MIC时,通过MIC上的Selection PIN脚PULL  U/D进行左右channel选择.

  3. HMM MEMM CRF 差别 联系

    声明:本文主要是基于网上的材料做了文字编辑,原创部分甚少.參考资料见最后. 隐马尔可夫模型(Hidden Markov Model.HMM),最大熵马尔可夫模型(Maximum Entropy Mar ...

  4. Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】

    最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部 ...

  5. sublime 实用快捷键

    Command+Enter 在下一行插入新行.举个栗子:即使光标不在行尾,也能快速向下插入一行. Command+Shift+Enter 在上一行插入新行.举个栗子:即使光标不在行首,也能快速向上插入 ...

  6. YARN和MapReduce的内存设置參考

    怎样确定Yarn中容器Container,Mapreduce相关參数的内存设置,对于初始集群,由于不知道集群的类型(如cpu密集.内存密集)我们须要依据经验提供给我们一个參考配置值,来作为基础的配置. ...

  7. 误用了 react-scripts eject 命令

    react 小白编程 由于使用 create-react-app 脚手架构建项目的时候,会给几个命令用 其中一个命令吸引了我的注意力  yarn eject,因为构建完成后特别提示说“你不会想要用到这 ...

  8. LeetCode(82)题解: Remove Duplicates from Sorted List II

    https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ 题目: Given a sorted linked list, ...

  9. web前端页面中异步使用百度地图API

    <div id="allmap"></div> //百度地图API功能 function loadJScript() { var script = docu ...

  10. 2 Maven使用入门

    一.编写pom.xml文件     Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. ...