zoukankan      html  css  js  c++  java
  • python -m json.tool 中文乱码 Format JSON with python

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

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

    对于返回的 json 字符串,一般在服务端不加处理的情况下,都是没有任何 ' ' 和 ' ' 的。为了方便查看,在 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

  • 相关阅读:
    有趣的放大镜
    特效代码
    向数据库添加学生信息。存放在REQUEST对象里
    机房servlet过滤器
    冒泡排序法
    验证码 随机生成器 详解
    生成器 种子
    生日
    在字符串里寻找某字符出现的个数
    课堂随笔
  • 原文地址:https://www.cnblogs.com/ruiy/p/6525591.html
Copyright © 2011-2022 走看看