文档章节

Python:json库中的编码问题

樂天
 樂天
发布于 2014/05/30 10:07
字数 507
阅读 87
收藏 0
https://docs.python.org/2/library/json.html下有一个默认的转换表:


#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d)
print j


输出为:

{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "\u4f60\u597d,world", "isChecked": true}

第一行输出字典变量d时,"你好"显示为utf-8编码,第二行输出中"你好"显示为unicode编码。第二行输出是一个字符串,所以肯定是希望其输出“正常点”,于是可以这样做:

#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d, ensure_ascii=False)
print j
运行后输出如下:
{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "你好,world", "isChecked": true}
好了,正常了。

然后试一下将json字符串转换为python对象:
#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True}
print d
j = json.dumps(d, ensure_ascii=False)
print j

d2 = json.loads(j) ##或者d2 = json.loads(j, encoding='utf-8') 
print d2
注意,如果字符串j编码不是utf-8或者unicode,用在loads函数中encoding指定j的编码。
输出如下:
{'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', 'isChecked': True}
{"info": "你好,world", "isChecked": true}
{u'info': u'\u4f60\u597d,world', u'isChecked': True}


d2是转换后的字典,可以看到"你好"被转换成了unicode形式,而非utf-8,同时连“键”也被转换为了unicode。

由json字符串转换为python对象,处理python对象时候要注意编码问题,比如:

#-*-encoding:utf-8-*-
import json

d = {'info':'你好,world', 'isChecked':True, '姓名':'樂天'}
print d
j = json.dumps(d, ensure_ascii=False)
print j

d2 = json.loads(unicode(j))     
print d2
print d2['info'] # 正常
print d2[u'info']  # 正常
print d2['姓名']  # 报错
print d2[u'姓名']  # 正常




如果要把"你好"转换为utf-8,可以这样做:
d2['info'] = d2['info'].encode('utf-8')
print d2


输出结果是:
{u'info': '\xe4\xbd\xa0\xe5\xa5\xbd,world', u'isChecked': True}


可惜还和最初的样子不一样。

其中一个解决方法是自己写一个递归函数将这个完全unicode化的dict转换为utf8形式。
另外一种就是将就着用,键不推荐使用非ASCII字符。





© 著作权归作者所有

共有 人打赏支持
樂天
粉丝 136
博文 673
码字总数 147433
作品 3
深圳
程序员
python处理json数据中文

(python http://www.jbxue.com/jb/python)处理json数据中的中文问题。 python中自带了处理python的模块,使用时候直接import json即可。 使用loads方法即可将json字符串转换成python对象,对...

mysoftsky
2014/03/06
0
0
用了这个几个Python内置小工具,可以让你的工作效率提升一倍

我们将会介绍4个Python解释器自身提供的小工具。 这些小工具在笔者的日常工作中经常用到, 减少了各种时间的浪费, 然而,却很容易被大家忽略。 每当有新来的同事看到我这么使用时, 都忍不住...

Python新世界
07/24
0
0
python序列化数据本地存放

深入# 序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重 用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的...

临峰不畏
2015/01/18
0
0
《Head First Python》笔记 第八章 移动应用开发

感觉做的笔记得经常看经常改,否则一会就忘了,记忆力真差啊...,代码直接下源码查看 比较神奇的是,运行这两章的程序都没遇到什么问题,感觉初学一个东西的时候总会遇到这样那样的问题... 8...

豆仔
2013/04/06
0
0
应该学习最新版本的 Python 3 还是旧版本的 Python 2?

应该学习最新版本的 Python 3 还是旧版本的 Python 2? 看到最新Python版本是3.4,但是网上的资料,包括出版的书籍,都是最晚到13年左右,很多细节都不同,语法也过时了。 那此时应该直接学习...

Airship
2015/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-apprm -rf package-lock.jsonrm -rf node_modules #主要是为了避免报错npm installnpm start......

lilugirl
今天
3
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
今天
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
7
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
5
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部