设为首页 收藏本站
查看: 1001|回复: 0

[经验分享] python simplejson模块浅谈

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-2-9 09:48:22 | 显示全部楼层 |阅读模式
一、背景知识
  • JSON:
    引用百科描述如下,具体请自行搜索相关介绍:

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)。
    表示方法:


    • 数据在名称/值对中
    • 数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组


    示例:
1
2
3
4
5
6
7
8
9
10
{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
]}





  • HOWTO-UNICODE:


    unicode标准描述了字符如何对应编码点(code point),使用16进制表示 00 00.
    PYTHON中,basestring派生了unicode类型和str类型
    unicode字符串是一个编码点序列,该序列在内存中会被表示成一组字节(0-255),str是指8字节流。
    unicode字符串可以通过encode函数转换为str;str可以通过decode转换为unicode。编解码类型一般是utf-8
    示例:
1
2
3
4
>>> u"中国".encode('utf-8')
'\xe4\xb8\xad\xe5\x9b\xbd'    #将unicode字符串编码为str
>>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf-8')
u'\u4e2d\u56fd'               #将str解码为unicode字符串



    从文件中读和写入文件的操作都应该是操作的8位字节流,如果将unicode字符串写入文件,需要进行编码操作;如果从文件中读unicode字符串,首先读取出来的是8位字节流需要进行解码操作。
    一般功能代码中都直接操作unicode字符串,而只在写数据或读数据时添加对应的编解码操作。

  • 序列化和反序列化
    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二

进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
    把对象转换为字节序列的过程称为对象的序列化,比如把一个字典对象以某种格式(JSON)写到文件中;把字节序列恢复为对象的过程称为对象的反序列化,比如读取某种格式化(JSON)的文件,构造一个字典对象。
    根据HOWTO-UNICODE的知识,把网络可以看做是一个文件,发送方写数据到网络时需要进行编码,接收方读取数据时需要进行解码。也就是说序列化的同时会进行编码,反序列化的同时会进行解码。

二、simplejson
    simplejson是json标准模块的扩展(基础功能相同),是pypi提供的拓展模块,需要另行安装。不过可以使用python自带的json库,基本是相同的使用方法(提供的接口功能基本一致)。在python的library文档中将JSON归为网络数据控制类,很好的说明了他们的用途,主要用于网络数据控制,编解码等。但是也具有其他的用途,比如可以用来作为配置文件的读写模块,简单的文件操作等。
    它提供的接口很少,容易掌握,而且大多数情况下会使用默认的参数。官方文档中阐明,默认的接口参数和不进行子类化会有更好的性能体现。下面我们对提供的接口进行讨论,并且仅展示必须参数,其他关键字参数将以**kwargs表示;
  • simplejson.dump(obj, fp, **kwargs):将python对象写到文件中(以JSON格式)
  • simplejson.dumps(obj, **kwargs):将python对象表示成字符串(JSON的格式)
  • simplejson.load(fp, **kwargs):从文件中(包含JSON结构)读取为python对象
  • simplejson.loads(s, **kwargs):从字符串中(包含JSON结构)读取为python对象
  • class simplejson.JSONDecoder:load/loads的时候调用,将JSON格式序列解码为python对象
  • class simplejson.JSONEncoder:dump/dumps的时候调用,将python对象编码为JSON格式序列

    联系到上面的基础知识,我们可以知道,dump的过程其实就是向文件句柄中写数据,即对象序列化的过程,需要进行编码,只是编码的格式不只是unicode和str的转换,而是更重要的python对象类型和JSON对象类型之间的转换。同理,load的过程其实就是从文件句柄中读数据,即反序列化生成对象的过程,需要进行解码,只是解码的格式不只是str和unicode的转换,而是更重要的JSON对象类型和python对象类型之间的转换。
    下面是JSON对象类型和Python对象类型之间的对应关系:

JSONPython 2Python 3
objectdictdict
arraylistlist
stringunicodestr
number (int)int, longint
number (real)floatfloat
trueTrueTrue
falseFalseFalse
nullNoneNone
    下面以一个例子来结束本文,例子中附带注释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#coding:utf-8
import simplejson as json

#simplejson.dump(**kwargs)
fp = open('./text.json', 'w+')
json.dump([1,2], fp)         ##将python数组进行序列化,保存到文件中
fp.seek(0)
print "----dump----\n", u'使用dump将python数组对象保存在一个包含JSON格式的文件中,文件内容为:\n', fp.read()
print
fp.close()         

#simplejson.dumps(**kwargs)
r_dumps = json.dumps({"中国obj":[1,2], "obj2":[3,4]})  #将python字典进行序列化,保存到字符串中
print "----dumps----\n", u'使用dumps将python字典对象转换为一个包含JSON格式的字符串,字符串结果为:\n', r_dumps
print

#simplejson.load(**kwargs)
#如果json文档格式有错误,将会抛出JSONDecoderError异常
fp = open('./text.json', 'r')
r_load = json.load(fp)           #将文件中的内容转换为python对象
print "----load----\n", u"使用load读取一个包含JSON数组格式的文件后,得到一个python对象,类型是:", type(r_load)
print
#simplejson.loads(**kwargs)
#如果json文档格式有错误,将会抛出JSONDecoderError异常

#将字符串中的内容转换为一个python对象
r_loads = json.loads('''{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
]}''')
print "----loads----\n", u"使用loads读取一个包含JSON字典格式的字符串后,得到一个python对象,类型是:", type(r_loads)
print



运行之后的结果显示:
1
2
3
4
5
6
7
8
9
10
----dump----
使用dump将python数组对象保存在一个包含JSON格式的文件中,文件内容为:
[1, 2]
----dumps----
使用dumps将python字典对象转换为一个包含JSON格式的字符串,字符串结果为:
{"obj2": [3, 4], "\u4e2d\u56fdobj": [1, 2]}
----load----
使用load读取一个包含JSON数组格式的文件后,得到一个python对象,类型是: <type 'list'>
----loads----
使用loads读取一个包含JSON字典格式的字符串后,得到一个python对象,类型是: <type 'dict'>






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42242-1-1.html 上篇帖子: 基于python的新浪微博模拟登陆 下篇帖子: http 检测是否正常脚本 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表