【json.tool】关于python -m json.tool中文乱码问题的处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【json.tool】关于python -m json.tool中文乱码问题的处理相关的知识,希望对你有一定的参考价值。

参考技术A python一行式解析json怎么避免中文转化为unicode编码?

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

curl   http://xx.xx.xx.xx/some-restful-api

对于返回的 json 字符串,一般在服务端不加处理的情况下,都是没有任何 '\t' 和 '\n' 的。

为了方便查看,在 bash 上可以简单地对它进行格式化:

curl http://xx.xx.xx.xx/some-restful-api | python -m  json.tool

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

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

# vim /usr/lib64/python2.7/json/tool.py

# curl -s -X POST https://run.mocky.io/v3/e95f6c35-b3c8-43d9-b9ab-f5ce8c1054cf -H 'cache-control: no-cache' | python -m json.tool

python -m json.tool中文乱码问题

https://blog.csdn.net/twingao/article/details/105169997

python -m json.tool 中文乱码 Format JSON with python

https://www.cnblogs.com/ruiy/p/6525591.html

python -m json.tool to output Chinese

python -m json.tool to output Chinese

Saving utf-8 texts with json.dumps as UTF8, not as \u escape sequence

https://stackoverflow.com/questions/18337407/saving-utf-8-texts-with-json-dumps-as-utf8-not-as-u-escape-sequence

如何有效地漂亮打印 JSON 对象列表? [复制]

【中文标题】如何有效地漂亮打印 JSON 对象列表? [复制]【英文标题】:How do I efficiently pretty-print a list of JSON objects? [duplicate] 【发布时间】:2013-08-25 15:35:06 【问题描述】:

我在一个文本文件中有一个丑陋的 JSON 对象列表,每行一个。我想让它们打印得很好,并将结果发送到一个文件中。

我尝试使用 json.tool 的命令行 python 版本:

parallel python -mjson.tool < jsonList

但是,在解析这个 json 时似乎出了点问题,因为 python 的 json.tool 试图将它作为多个参数打开并因此抛出:

IOError: [Errno 2] No such file or directory: 行内容,包含单引号、空格、双引号

如何强制将每个行分隔的对象视为模块的单个参数?直接在 python 中打开文件并连续处理它是一个低效的解决方案,因为文件很大。尝试这样做会占用 CPU。

【问题讨论】:

是的。一个数 GB 的文本文件。 【参考方案1】:

默认情况下,GNU Parallel 会将输入作为参数放在命令行上。所以你要做的是:

python -mjson.tool \[\"cheese\",\ \\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\\]

但你想要的是:

echo \[\"cheese\",\ \\"cake\":\[\"coke\",\ null,\ 160,\ 2\]\\] | python -mjson.tool

GNU Parallel 可以通过 --pipe -N1 做到这一点:

parallel -N1 --pipe python -mjson.tool < jsonList

10秒安装:

wget -O - pi.dk/3 | bash

观看介绍视频以快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 或在

浏览教程(man parallel_tutorial)。你命令行 爱你。

【讨论】:

这是我认为我想要的东西,尽管它比我想象的要慢!【参考方案2】:

嗯,json 模块已经有一些与您的想法相似的东西。

>>> import json
>>>
>>> my_json = '["cheese", "cake":["coke", null, 160, 2]]'
>>> parsed = json.loads(my_json)
>>> print json.dumps(parsed, indent=4, sort_keys=True)
[
    "cheese", 
    
        "cake": [
            "coke", 
            null, 
            160, 
            2
        ]
    
]

您可以在r 模式下使用open 从文本文件中输入my_json

【讨论】:

我避免在 python 脚本中直接使用 open 命令,因为我不知道 python 会对 2 GB 的文本文件做什么。 看看@这个:***.com/questions/7134338/… @airza:“打开”文件并不意味着“将整个文件加载到内存中”。只需逐行迭代 (for line in file) 并按所示进行转换。无论文件有多大,它都可以工作。 这个答案有效,但它与 CPU 挂钩,这就是为什么我试图在机器的 16 个内核上并行化进程。也许它不会比简单的答案更快,但我想知道 - 因此提出我提出的问题。 @airza:嗯,它是一个 2 GB 的文件,不管你用什么,都需要时间。如果您需要快速实现,那么为什么不使用 pypy?它比普通的 Python 快得多。但是,我怀疑会有太大的变化,因为 open() 是直接用 C 编写的,所以我真的认为它不会比这更快。【参考方案3】:

我的方法有两个问题,我最终解决了:

默认的并行化将为每个线程生成一个新的 python VM,这很……慢。好慢。

默认的 json.tool 执行简单的实现,但不知何故混淆了传入参数的数量。

这是我写的:

import sys
import json
for i in sys.argv[1:]:
    o = json.loads(i)
    json.dump(o, sys.stdout, indent=4, separators=(',',': '))

然后这样称呼它:

parallel -n 500 python fastProcess.py prettyfileout

我不太确定 n 的最佳值,但由于能够使用多核,该脚本的挂钟时间比简单实现快 4-5 倍。

【讨论】:

以上是关于【json.tool】关于python -m json.tool中文乱码问题的处理的主要内容,如果未能解决你的问题,请参考以下文章

Vim系列 - 使用 filter 与外部软件交互

Python-关于豆瓣发布“说句话”,添加网页等的js行为分析

Python学习第76天(js语法基础和基本数据类型)

Python学习第76天(js语法基础和基本数据类型)

关于python的webbrowser

selenium+python关于页面滚动条滑动到底的问题总结