json 和 pickle

用于序列化的两个模块

json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换

json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load

json dumps把数据类型转换成字符串 

        dump把数据类型转换成字符串并存储在文件中 

        loads把字符串转换成数据类型  

        load把文件打开从字符串转换成数据类型

可以看到直接对文件的操作都是不带“s” 的dump和load,直接对内存操作的都是带“s”的。

pickle同理


现在有个场景在不同设备之间进行数据交换很low的方式就是传文件,dumps可以直接把服务器A中内存的东西发给其他服务器,比如B服务器、
在很多场景下如果用pickle的话那A的和B的程序都的是python程序这个是不现实的,很多时候都是不同的程序之间的内存交换怎么办?就用到了json
并且json能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用json,是这样的,json只能把常用的数据类型序列化(列表、字典、列表、字符串、数字),像日期格式、类对象 json就不行了,只有用pickle
为什么他不能序列化上面的东西呢?因为json是跨语言的!


我们看个json的小例子:

  1. import requests
  2. import json
  3. response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
  4. response.encoding = 'utf-8'
  5. dic = json.loads(response.text)
  6. print(type(dic))
  7. print(dic)
  8. print(dic['data']['city'])
输出截图:
 这是数据在内存时的处理,我们在看一个数据在文件的处理:
数据在文件内的存储格式:
  1. [
  2. {"title": ["java\u722c\u866b\u6293\u53d6qq\u7fa4\u6570\u636e"], "reply": ["4"], "author": ["zzy64421"]},
  3. {"title": ["\u6709\u5927\u795e\u6709P2P\u7684\u6570\u636e\u5417"], "reply": ["1"], "author": ["\u6709\u70b9\u5c0f\u538c\u4e16"]},
  4. {"title": ["\u60f3\u722c\u8d76\u96c6\u7f51\uff0c\u8bbf\u95ee\u592a\u5feb\u8981\u8f93\u9a8c\u8bc1\u7801\uff0c\u600e\u4e48\u7834"], "reply": ["7"], "author": ["\u94c1\u8840\u591c\u5e1d"]},
  5. {"title": ["30\u5143\u6c42\u5199\u4e00\u7f51\u9875\u722c\u866b"], "reply": ["4"], "author": ["C\u8c6ay"]},
  6. {"title": ["\u767e\u5ea6\u8d34\u5427\u4e2d\u7684\u697c\u5c42\u56de\u590d\u600e\u4e48\u83b7\u53d6\u5462"], "reply": ["21"], "author": ["\u5c0f\u50bb\u86cb\u5a03\u5a03"]},
  7. {"title": ["\u6c42\u52a9\u7f8e\u56e2\u5916\u5356\u7684\u722c\u866b\u6570\u636e"], "reply": ["0"], "author": ["\u5de6\u4ed3\u871c\u67d1"]},
  8. {"title": ["\u6709\u6ca1\u6709\u9700\u8981\u5e2e\u5fd9\u722c\u53d6\u6570\u636e\u7684\uff1f\u6216\u8005\u505a\u722c\u866b\u7c7b\u8bfe\u9898\u7684\uff1f\u57fa\u4e8eJAVA"], "reply": ["51"], "author": ["fhg1225"]},
  9. {"title": ["\u6c42\u53ef\u4ee5\u722c58\u540c\u57ce\uff0c\u8d76\u96c6\u7f51\u6570\u636e\u7684\u722c\u866b\u3002"], "reply": ["9"], "author": ["200901491"]},
  10. {"title": ["\u6709\u722c\u866b\u8f6f\u4ef6\u53ef\u4ee5\u91c7\u96c6\u5fae\u535a\u3001\u8d34\u5427\u3001\u77e5\u4e4e\u7684\u4e48\uff1f"], "reply": ["3"], "author": ["\u738b\u9053\u653b\u7565"]}
  11. ]
整体来看这是个列表,列表内每个元素都是个字典。
  1. import json
  2. f = open('items.json')
  3. a = json.load(f)
  4. print(type(a))
  5. print(a[0])
  6. print(a[0]['author'])
  7. f.close()
输出结果:

通过这两个例子我们看到了json的用法,也能体会出load和loads的区别了。 


【注】字符串内部必须使用双引号如:"reply": ["3"],不能写成:'reply': ['3']. 
因为json是跨语言的,其他语言是使用双引号表示字符串的,所以在python中一定注意这一点