python json解析如何修改JSON里的内容?

python 该如何处理 json 中的中文 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
推荐学习书目
Python Sites
值得关注的项目
Python 编程
Sponsored by
国内领先的实时后端云野狗 API 可用于开发即时聊天、网络游戏、实时定位等实时场景传输快!响应快!入门快!
Promoted by
python 该如何处理 json 中的中文
12:10:11 +08:00 · 4784 次点击
我是一个python小白,最近在模拟微信的web协议,无聊练练,然后碰到中文乱码的问题,看文档问谷歌,弄了一天了也无果,所以请教大家。
我借助的是requests来作get、post请求,创建了一个session全程使用,我这次请求返回的是一个json,
当我打印原文(response.text)的时候中文显示如下:
36ae°?()ae???,-?? 1/2 é?????????§?ae??ae?°???? 1/2 ?? 1/4 ?ae???>>?ae??é??ae??ae?°??????è??? 1/2 ??§?ae??ae?°é?>>?>>????ae??ae??ae 1/2 ??????????è??? 1/2 ?????,?? 1/4 ??,????
进行json解析后(response.json())貌似已经变成unicode编码的ascii,打印的结果中文是这样的:
u'36\xe6\xb0\)\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa2\x86\xe5\x85\x88\xe7\x9a\x84\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe5\xaa\x92\xe4\xbd\x93\xef\xbc\x8c\xe6\x88\x91\xe4\xbb\xac\xe6\x8a\xa5\xe9\x81\x93\xe6\x9c\x80\xe6\x96\xb0\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe9\x97\xbb\xe4\xbb\xa5\xe5\x8f\x8a\xe6\x9c\x80\xe6\x9c\x89\xe6\xbd\x9c\xe5\x8a\x9b\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe5\x88\x9b\xe4\xb8\x9a\xe4\xbc\x81\xe4\xb8\x9a\xe3\x80\x82'
json解析后是一个dict,当我单独打印键值的时候中文显示是:
36ae°?()ae???,-?? 1/2 é?????????§?ae??ae?°???? 1/2 ?? 1/4 ?ae???>>?ae??é??ae??ae?°??????è??? 1/2 ??§?ae??ae?°é?>>?>>????ae??ae??ae 1/2 ??????????è??? 1/2 ?????,?? 1/4 ??,????
我获取的返回头部可知就是个纯文本
{'connection': 'close', 'content-type': 'text/plain', 'content-length': '14315', 'content-encoding': 'deflate'}
手动得中文内容
我该如何正确的打印这个中文内容或者该如何与已知中文字符串比较,我的环境是
ubuntu14.04,
python2.7.6(系统自带的,需要换上python3吗??),
sys.getdefaultencoding()是‘ascii’,换成‘utf-8’后也是如上所述
为了解决这个问题,我特地看了微信的web前端js关于那一段的请求处理,表示水平有限没发现什么。
请大家帮忙解释一下上述原因,或者给个处理中文的思路!!
38 回复 &| &直到
19:27:44 +08:00
& & 12:14:39 +08:00
print userinfo['NickName'].encode('iso8859-1')
用PHP之类的语言的话就不需要考虑编码问题,人生苦短,不要用Python。
& & 12:18:46 +08:00
方法一: python3 解除编码烦恼。
方法二:
def unicode_init(obj, encoding = 'utf-8'):
if isinstance(obj, basestring):
if not isinstance(obj, unicode):
obj = unicode(obj, encodeing)
return obj
& & 12:24:02 +08:00 via Android
dict里面的中文用unicode形式存储,传输之前用json.dumps导出标准json,各个套件跟着规范走不会有问题
& & 12:28:49 +08:00
@ 可行。。谢谢。。
哈哈,春节用python练手。。
& & 12:32:52 +08:00
试试
```
response = session.get('http://xxxx')
print(response.encoding)
response.encoding = 'utf-8'
print(response.json())
```
& & 12:33:12 +08:00
@ 好的,我尝试python3,
方法二昨天已试过不行。。
& & 12:34:57 +08:00
@ 我是从微信那边获取的数据,很显然我无法事先处理。。仍然谢谢你。。
& & 12:39:41 +08:00
@ 太棒了!!可行。。
& & 13:00:29 +08:00 via iPhone
这种情况是因为数据源的编码声明不规范,导致 reuqests 无法判断出返回数据的正确编码,从而使用了它的默认编码 iso8859-1 来将数据转换为 unicode,没使用正确的编码 utf-8,于是就出现乱码了。
解决办法一就是手动设置返回数据的正确编码:response.encoding = 'utf-8'。这样结果就是正确的 unicode 类型字符串。
或者将错误的 unicode 用同样的 iso8859-1 编码转换回去原本的 utf-8 编码的 str 类型字符串:data.encode('iso8859-1')。
& & 13:02:30 +08:00
前几天刚入这个坑:
Python内部数据结构标准内码是unicode
json.loads, json.dumps之类的只能接受unicode字符串,有些没有特殊字符的utf8之类可以侥幸通过
requests.text会自动把网页解码unicode,输入到json模块的时候不用.encode(),那样画蛇添足
你显示,保存的时候再用encode转换成其他格式比如utf8
& & 13:13:26 +08:00
```python
data_ugly = response.json()
Signature = data_ugly['Signature'].encode('iso8859-1').decode('utf-8')`
```
估计换 python 3 是没用的,可以查查响应头的 Content-Type 里的 charset 是不是 utf-8. 如果不是,那就是你访问的网站没有处理好编码问题;如果是,那就是 requests 对编码的处理 有问题。
& & 13:31:49 +08:00
学python必经之路
& & 13:37:18 +08:00 via iPhone
& & 13:42:15 +08:00 via iPhone
@ 你的解释可能是对的,但是我有试过打印的时候encode('utf-8'),不行的。。
& & 13:52:39 +08:00
@ 恩恩,你的解决方式跟一楼类似。
碰到这个问题,我第一时间就是看头部,我在描述里也贴出了是'content-type': 'text/plain',编码未知,然后我就不知道该怎么处理了。。
& & 14:30:11 +08:00
Python中实际上有两种字符串,分别是str类型和unicode类型,这两者都是basestring的派生类。str实际上相当于string, 而unicode则是标准的字符串,相当于wstring。
其中I/O读入的基本都是str类型,也就是说Python不关心这些字节代表什么含义。但是如果需要做真正的字符串操作的时候,建议使用unicode类型,这样确保不存在编码问题。
JSON理论上应该可用ASCII完全表示,其中的宽字符用类似\u1111的形式表达。但是现在有很多不规范的JSON出现,例如s=&&&{&标题&: &Hello, world&}&&&。此时就需要你自己确定这部分内容用字节表达时,究竟用了什么编码,如果是UTF-8,那么就首先s_u = s.decode(&UTF-8&)变成unicode字符串。
另一方面,只要保证这段字符串的编码和Python运行时环境的编码保持一致,也是可以直接loads(str类型变量)的。例如Linux下如果LANG是UTF-8,那么python屁颠屁颠跑着的时候就可以直接把UTF-8编码的JSON串塞进去。
& & 14:31:29 +08:00
貌似偏题了,sorry,请无视
& & 15:11:48 +08:00 via iPad
python编码着实坑
& & 18:16:35 +08:00
不要尝试在交互式解析器或者命行环境中直接输出文本,一个比一个坑
最可靠的做法是把文本保存成一个文件然后再查看。
如果进行比较,先把输入的字节码转成UTF8(解析成UTF8)字符串,然后再进行对比
& & 20:31:53 +08:00
@ 谢谢指导,我昨天试过保存在文本中也是乱码。
我试过把如下unicode编码的字节码
```
u'36\xe6\xb0\)\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa2\x86\xe5\x85\x88\xe7\x9a\x84\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe5\xaa\x92\xe4\xbd\x93\xef\xbc\x8c\xe6\x88\x91\xe4\xbb\xac\xe6\x8a\xa5\xe9\x81\x93\xe6\x9c\x80\xe6\x96\xb0\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe9\x97\xbb\xe4\xbb\xa5\xe5\x8f\x8a\xe6\x9c\x80\xe6\x9c\x89\xe6\xbd\x9c\xe5\x8a\x9b\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe5\x88\x9b\xe4\xb8\x9a\xe4\xbc\x81\xe4\xb8\x9a\xe3\x80\x82'
```
转成utf-8得到如下不想要的结果(貌似是简单的把单字节加上‘\xc2’变成双字节)
```
'36\xc3\xa6\xc2\xb0\xc2\)\xc3\xa6\xc2\x98\xc2\xaf\xc3\xa4\xc2\xb8\xc2\xad\xc3\xa5\xc2\x9b\xc2\xbd\xc3\xa9\xc2\xa2\xc2\x86\xc3\xa5\xc2\x85\xc2\x88\xc3\xa7\xc2\x9a\xc2\x84\xc3\xa7\xc2\xa7\xc2\x91\xc3\xa6\xc2\x8a\xc2\x80\xc3\xa6\xc2\x96\xc2\xb0\xc3\xa5\xc2\xaa\xc2\x92\xc3\xa4\xc2\xbd\xc2\x93\xc3\xaf\xc2\xbc\xc2\x8c\xc3\xa6\xc2\x88\xc2\x91\xc3\xa4\xc2\xbb\xc2\xac\xc3\xa6\xc2\x8a\xc2\xa5\xc3\xa9\xc2\x81\xc2\x93\xc3\xa6\xc2\x9c\xc2\x80\xc3\xa6\xc2\x96\xc2\xb0\xc3\xa7\xc2\x9a\xc2\x84\xc3\xa4\xc2\xba\xc2\x92\xc3\xa8\xc2\x81\xc2\x94\xc3\xa7\xc2\xbd\xc2\x91\xc3\xa7\xc2\xa7\xc2\x91\xc3\xa6\xc2\x8a\xc2\x80\xc3\xa6\xc2\x96\xc2\xb0\xc3\xa9\xc2\x97\xc2\xbb\xc3\xa4\xc2\xbb\xc2\xa5\xc3\xa5\xc2\x8f\xc2\x8a\xc3\xa6\xc2\x9c\xc2\x80\xc3\xa6\xc2\x9c\xc2\x89\xc3\xa6\xc2\xbd\xc2\x9c\xc3\xa5\xc2\x8a\xc2\x9b\xc3\xa7\xc2\x9a\xc2\x84\xc3\xa4\xc2\xba\xc2\x92\xc3\xa8\xc2\x81\xc2\x94\xc3\xa7\xc2\xbd\xc2\x91\xc3\xa5\xc2\x88\xc2\x9b\xc3\xa4\xc2\xb8\xc2\x9a\xc3\xa4\xc2\xbc\xc2\x81\xc3\xa4\xc2\xb8\xc2\x9a\xc3\xa3\xc2\x80\xc2\x82'
```
********
当然,对于与已知字符串比较的话,实际上可以构造出已知字符串的unicode编码的字节码,然后进行比较,其实我想知道的是更人性化的比较方式。
谢谢你的回答。
& & 20:55:32 +08:00
我一般做法都是decode后再encode,对于显示成16进制的编码字串,可能还需要多次转换成真正的二进制内码
第一次decode是原始字节码以一个特定字符集解析,然后变成内部unicode编码
第二次encode是内部unicode编码变成最终对比时候的一个确定的字符集与编码以保证对比时候的准确性。
对于内部写死在源码的字符串,一般直接encode成目标字符集进行对比(即便字符集一致)以保证跨平台时候的结果准确性。。
以上是我的个人做法,欢迎拍砖
& & 20:58:24 +08:00
因为这个已经是 utf8 编码的字节码
所以你应该通过 decode 拿到原始 unicode 字符串
b'36\xe6\xb0\)\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa2\x86\xe5\x85\x88\xe7\x9a\x84\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe5\xaa\x92\xe4\xbd\x93\xef\xbc\x8c\xe6\x88\x91\xe4\xbb\xac\xe6\x8a\xa5\xe9\x81\x93\xe6\x9c\x80\xe6\x96\xb0\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe7\xa7\x91\xe6\x8a\x80\xe6\x96\xb0\xe9\x97\xbb\xe4\xbb\xa5\xe5\x8f\x8a\xe6\x9c\x80\xe6\x9c\x89\xe6\xbd\x9c\xe5\x8a\x9b\xe7\x9a\x84\xe4\xba\x92\xe8\x81\x94\xe7\xbd\x91\xe5\x88\x9b\xe4\xb8\x9a\xe4\xbc\x81\xe4\xb8\x9a\xe3\x80\x82'.decode('utf8')
注意开头那个 b
2.x 可省略
源编码未知的情况下
建议直接二进制写入文本文件
然后使用文本编辑器确认是哪种编码
& & 21:34:32 +08:00
@ 哈哈,谢谢你的建议,这也是我喜欢的方式。。
这次遇坑主要是微信返回的源数据没有编码说明,导致我不知如何解码,经过9楼的回答算是明白原因。
谢谢你的回答。。
& & 21:40:15 +08:00
@ 提起9楼的信息我倒是想起来了。。。
requests返回的数据建议手工使用chardet判定编码后解码,原因就是可能会有服务器返回不正确的编码声明
& & 21:50:46 +08:00
@ 是的,返回的头部里'content-type': 'text/plain',未有编码信息。
昨天谷歌的时候有看到chardet,倒是没试过用它来检测。这次掉坑算是长了心眼。。
& & 21:53:17 +08:00
@ 那货很不错,对中文来说文本相对较长的情况下检测精确度极高
& & 21:57:49 +08:00
@ 好的,谢谢推荐,先收藏了,明天来试。
& & 22:55:02 +08:00
不知道下面的用法可不可行。
将 utf-8 转化为 unicode
response = unicode( response, 'utf-8' )
将 unicode 转化为 utf-8 输出
print response.encode('utf-8')
& & 21:33:02 +08:00
@ 你好,我不知道如何弄你说的那个 decode 拿到原始 unicode 字符串,所以没试,而对于你所说的接二进制写入文本文件我之前试过,
```
f = open('./html','wb')
f.write(response.text)
f.close()
```
还是需要设置sys.setdefaultencoding('utf8'),不然会出现
```
UnicodeEncodeError: 'ascii' codec can't encode characters in position 131-148: ordinal not in range(128)
```
@ 我试了那个chardet,确实很强大,还给出了置信度,谢谢你,算是又多了一个工具。
{'confidence': 0.99, 'encoding': 'utf-8'}
@ 我试了,貌似不行。
```
t = unicode(response.text, 'utf-8')
print t.encode('utf-8')
```
出现 TypeError: decoding Unicode is not supported
好了,这个帖子应该可以结了。后来者翻到的话,可以参考1、5、9楼。谢谢大家!!
& & 21:48:53 +08:00
@ 文本太短的话置信度不可靠
& & 22:18:54 +08:00
那是对 20 楼的回复
&& 我试过把如下unicode编码的字节码
&& 转成utf-8得到如下不想要的结果
你给的其实是 utf8 编码的字节码
而不是 unicode 字符串
把一个 utf8 编码的字节码当作 unicode 字符串再次进行 utf8 编码当然得不到你所期望的结果
至于把网页内容直接写入文本
Response.text
Content of the response, in unicode.
Response.content
Content of the response, in bytes.
所以你得
f = open('./html','wb')
f.write(response.content)
f.close()
或者显式地
f = open('./html','wb')
f.write(response.text.encode('??'))
# 这个该填什么编码由具体情况决定
f.close()
我个人不建议折腾 sys.setdefaultencoding
@
requests 自己就是用 chardet 来自动检测的
& & 03:49:32 +08:00
@ 你写文件出现 UnicodeEncodeError 的原因是:
response.text 是 unicode 类型的字符串,Python 需要将其转换为 str 类型的字符串后才能写入文件,而 Python2 的默认编码是 'ascii',因此写入时其实等同执行了:f.write(response.text.encode('ascii')),而中文是无法用 ascii 来编码的,所以就出现了 UnicodeEncodeError。
虽然可以用 sys.setdefaultencoding('utf8') 来将 Python 默认编码更改为 utf-8 来解决这个问题,但这个方法从来不是解决 Python2 编码相关问题的正确方法,是有后遗症的,原因见

正确的方法是写入文件时显式地将 unicode 字符串用正确编码转换为 str 字符串:f.write(response.text.encode('utf-8'))。这样就不会出错了。
& & 09:07:22 +08:00
& & 22:47:30 +08:00
是的,chardet的检测确实有问题,但又好像是requests的问题,我
print response.encoding 得到是 ‘ISO-8859-1’(好像真像9楼Sylv说的那样)
而用 chardet.detect(response.text) 得到是 ‘utf-8’
但看了源码requests 确实是用 chardet 来检测得到encoding的值,按理说应该是一样的值不。
真心谢谢 @ 的提醒,让我看了下源码,又get了些知识。
@ 谢谢你的总结,分析好透彻,读了两遍,已打印下来再读,大牛啊!!方法2是个好习惯,像我这样的入门小白应该培养。
@ 不好意思,因为时间问题,你的资料我明天再读,有想法再请教。。
& & 23:23:00 +08:00
同样可以通过读源码来理解
response.encoding 在这里赋值
get_encoding_from_headers 的定义在这里
所以 response.encoding 为 'ISO-8859-1'
当且仅当 response.encoding 为 None 时才会 fallback 去使用 chardet 自动检测 response.content
也不会把检测结果保存到 response.encoding
& & 22:26:07 +08:00
@ 谢谢,仔细的读了那篇文章,通篇得出python的一个使用好习惯来避免编码问题,就是 @ 总结的第2个解决方法
& make your code into a Unicode-only clean room
& put ‘airlocks’ at the entry points to your code which will ensure that any byte sequence attempting to enter your code is properly clothed in a protective Unicode bunny suit before being allowed inside.
& 将输入的 bytes 马上解码成 unicode,而在程序内部中均使用 unicode,而当在进行输出的时候,尽早将之编码成 bytes
@ 大牛厉害啊!! 我确实该花些时间来对着文档阅读一下requests的源码。
谢谢你们!!还未入门的小白碰上你们这群大牛真幸运!!送出感谢!!
& & 00:06:41 +08:00 via iPhone
& & 19:27:44 +08:00
反正我都是不管啥格式先decode成unicode,所有的处理都在unicode下进行,最后需要输出或者打印的时候,再转成utf8
& · & 1810 人在线 & 最高记录 1893 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.3 · 61ms · UTC 02:32 · PVG 10:32 · LAX 19:32 · JFK 22:32? Do have faith in what you're doing.推荐这篇日记的豆列
······[实践OK]通过命令行能不能打印易读的Json数据怎么办?接合windows使用curl命令输出json并格式化的方法。及升级CentOS下的python到3.3版本的步骤,升级后yum except KeyboardInterrupt, e: 错误。
引用地址:
注意: 该地址仅在今日23:59:59之前有效
背景:我很喜欢在命令行调试API,返回数据都是JSON格式的。打印出来的内容太痛苦了,如:{&status&:200,&data&:[{&id&:1000,&name&:&John&}{&id&:1004,&name&:&Tom&}]},有木有工具打印个易读的样式,这样的
&&&status&:200,
&&&&{
&&&&&& &id&:1000,
&&&&&& &name&:&John&
&&&&},
&&&&{
&&&&&& &id&:1004,
&&&&&& &name&:&Tom&
&&&&}
实践一:答:可以使用python的json.tool!cat json|python -mjson.toolcat json|python -mjson.toolpython: module json.tool not foundjson是python3内置模块,在包libpython3.3-stdlib中提供。centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~&&AddTime:echo '{&status&:200,&data&:[{&id&:1000,&name&:&John&},{&id&:1004,&name&:&Tom&}]}'|python -mjson.toolVim中格式化json数据:命令模式下#!python -m json.tool可以映射快捷键,如Ctrl+F6,编辑vimrc:“ Format JSON data using python module json.toolmap &C-F6& :#!python -m json.tool&CR&vim调用python格式化json数据:实践二,根据1接合windows使用curl命令输出json并格式化的方法:windows中使用curl命令需要下载curl工具下载地址:http://curl.haxx.se/download.html请选择不带SSL的版本,否则还需要安装SSL的支持包我下载的版本 /open_source/?CURL_7.28.1下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用我使用linux下成功的相同命令去发现报错如下:网上查发现是引号的原因,例如linux下成功命令格式如下:
curl -X POST -d&&'{&auth&: {&tenantName&: &admin&, &passwordCredentials&:{&username&: &admin&, &password&: &xxx&}}}' -H &Content-type: application/json& http://192.168.xx.xx:3/tokens | python -mjson.tool&&
windows下就应该如下:
curl -X POST -d&&&{\&auth\&: {\&tenantName\&: \&admin\&, \&passwordCredentials\&:{\&username\&: \&admin\&, \&password\&: \&xxx\&}}}& -H &Content-type: application/json& http://192.168.xx.xx:3/tokens | python -mjson.tool&&
来自:http://blog.csdn.net/lipei1220/article/details/8536520.tw/2012/12/cli-python-json-formatter-2012/http://blog.csdn.net/yuechuzhao/article/details/http://openwares.net/linux/vim_call_python_format_json.html————————————————————linux(CentOS)下升级python3.3———————————————————————————CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。 1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz 2。解压安装包:tar -zxvf Python-3.3.0.tgz    3。进入解压后目录:cd Python-3.3.0 4。创建安装目录:mkdir /usr/local/python3.3    5。编译安装:./configure --prefix=/usr/local/python3.3 6。执行:make && make install 7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python 8。查询python版本,执行:python 显示如下: Python 3.3.0 (default, Jan 16 :44) [GCC 4.1.2
(Red Hat 4.1.2-42)] on linux Type &help&, &copyright&, &credits& or &license& for more information. &&& 已安装成功了。恭喜你。实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:/usr/bin/python2.4mv /usr/bin/python2.4&&/usr/bin/python2.4_bakln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4 /usr/local/bin/python2.7mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bakln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7实践来源:/blog/1770476最后,json显示结构化Ok了:[root@test Python-3.3.0]# echo '{&status&:200,&data&:[{&id&:1000,&name&:&John&},{&id&:1004,&name&:&Tom&}]}'|python -mjson.tool{&&&&&data&: [&&&&&&&&{&&&&&&&&&&&&&id&: 1000, &&&&&&&&&&&&&name&: &John&&&&&&&&&}, &&&&&&&&{&&&&&&&&&&&&&id&: 1004, &&&&&&&&&&&&&name&: &Tom&&&&&&&&&}&&&&], &&&&&status&: 200}再结合Curl这个命令行显示一把,实践如下:cat json.php
echo &&&EOF
&&&&{&&&status&:200,&&&data&:&&[&&{&&&id&:1000,&&&name&:&John&&&},&&{&&&id&:1004,&&&name&:&Tom&&&}&&]&&}&&
shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:[root@test ]# curl -H&Host:& &http://192.168.109.8/json.php& &&&&{&&&status&:200,&&&data&:&&[&&{&&&id&:1000,&&&name&:&John&&&},&&{&&&id&:1004,&&&name&:&Tom&&&}&&]&&}&&[root@test ]# curl -H&Host:& &http://192.168.109.8/json.php&&&&&&&&&&&&&&&&&&&&&&&&&&&&&vi json.php [root@test ]# curl -H&Host:& &http://192.168.109.8/json.php& | python -mjson.tool&&&&% Total&&&&% Received % Xferd&&Average Speed&& Time&&&&Time&&&& Time&&Current&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Dload&&Upload&& Total&& Spent&&&&Left&&Speed100&& 106&&&&0&& 106&&&&0&&&& 0&&51381&&&&&&0 --:--:-- --:--:-- --:--:--&&&& 0{&&&&&data&: [&&&&&&&&{&&&&&&&&&&&&&id&: 1000, &&&&&&&&&&&&&name&: &John&&&&&&&&&}, &&&&&&&&{&&&&&&&&&&&&&id&: 1004, &&&&&&&&&&&&&name&: &Tom&&&&&&&&&}&&&&], &&&&&status&: 200}最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:问题:——————————————————————————————————[root@name user]# yumFile &/usr/bin/yum&, line 30except KeyboardInterrupt, e:^原因:这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。解决办法:很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)升级yum的作法就不详述了;修改yum的解释器为旧版本python2.4:&&&& vi /usr/bin/yum&&&& 将第一行&#!/usr/bin/python& 改为 &#!/usr/bin/python2.4&即可,我自己是修改:&&&&&&/usr/bin/python2.4_bak&&//前面挪动到这儿了,实践是OK的~摘自:.cn/s/blog_67d6a2650100jiaw.html作者:@地址:版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: justwinit 编辑于 17:57
[9/9]北京市海淀区中关村理想国际大厦18层 Address:Sina 18th floor Ideal plaza Zhongguancun Haidain
Beijing 100080, P.R.China
[1/9]深圳南山腾讯大厦8楼 Address:Tencent Plaza High-tech One Road, Middle Zone, High-new Science & Technology Park, Nanshan Distrcit, Shenzhen City, Guangdong Province 518057, P.R. China
[2/9]深圳南山腾讯大厦旁大族激光大厦三楼 Address:Han's Building,Kejizhongyi Avenue, Hi-tech Pack,Nanshan District, Shenzhen City, Guangdong Province 518057, P.R.China
[2012/10-Now]北京海淀区西三环中路10号望海楼B座7层央视国际网络有限公司 Address:Seaview floor, Haidian District No.10,West Sanhuan Road,Beijing 100142, P.R.China}

我要回帖

更多关于 python json dumps 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信