Python常用模块之json模块

常用模块:
一个Python文件就是一个模块
import xxx
1. 标准模块,Python自带的,如time/random
2. 第三方模块,如连接mysql,需要安装
3. 自己写的Python文件
校验json格式是否正确:www.bejson.com  

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,其最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。json类似于xml,但比 XML 更小、更快,更易解析。

一、json字符串转为字典

json.load / json.loads

两个方法功能类似,可选参数也相同,最大的区别在于,json.load方法接受的输入,即第一个参数,是包含json数据的文件对象,如open方法的返回对象,

json.loads接受的输入是json字符串,而非文件对象。从输入类型的区别也可以看出两者的使用场合。

查看源码:
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):
    # Serialize ``obj`` to a JSON formatted ``str``.
    # 序列号 “obj” 数据类型 转换为 JSON格式的字符串 
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):
    """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
    ``.write()``-supporting file-like object).
     我理解为两个动作,一个动作是将”obj“转换为JSON格式的字符串,还有一个动作是将字符串写入到文件中,也就是说文件描述符fp是必须要的参数 """

 

1. json.loads : 将json编码的字符串转换为python的数据结构

import json
json_str = ''' {"name":"xiaohei","age":18,"sex":"男","age":18} ''' res = json.loads(json_str) #把字符串(json串)转成字典 print(res) print(type(json_str)) print(type(res)) #以上输出如下: # {'name': 'xiaohei', 'age': 18, 'sex': '男'} # <class 'str'> # <class 'dict'>

2. json.load : 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构,load可以自己读文件

import json
with open('text.json','r',encoding='utf-8') as fr:
    aa = json.loads(fr.read())
    fr.seek(0)
    bb = json.load(fr)# json.load(fr)和json.loads(fr.read()) 返回结果一样,load可以自己去读文件
    print(aa)
    print(bb)

#输出
# {'name': '小黑', 'age': 18, 'sex': '男'}
# {'name': '小黑', 'age': 18, 'sex': '男'}

 

 

二、字典转换为json

json.dump / json.dumps

对应于load和loads,dump的第一个参数是对象字典,第二个参数是文件对象,可以直接将转换后的json数据写入文件,dumps的第一个参数是对象字典,其余都是可选参数。dump和dumps的可选参数相同,这些参数都相当实用,现将用到的参数记录如下:

ensure_ascii 默认为True,保证转换后的json字符串中全部是ascii字符,非ascii字符都会被转义。如果数据中存在中文或其他非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常

indent 缩进,默认为None,没有缩进,设置为正整数时,输出的格式将按照indent指定的半角空格数缩进,相当实用。

separators 设置分隔符,默认的分隔符是(',', ': '),如果需要自定义json中的分隔符,例如调整冒号前后的空格数,可以按照(item_separator, key_separator)的形式设置。

sort_keys 默认为False,设为True时,输出结果将按照字典中的key排序。

查看源码:

def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object.
       将包含str类型的JSON文档反序列化为一个python对象"""
def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object.
        将一个包含JSON格式数据的可读文件饭序列化为一个python对象"""

 1. json.dumps: 将数据通过特殊的形式转换为所有程序语言都认识的字符串

import json
dic = {
    "xiaohei":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
    "马春波":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
    "王东泽":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
}
res = json.dumps(dic,ensure_ascii=False,indent=4)#把字典变成字符串
print(res)
f = open('user.json','w',encoding='utf-8')
f.write(res) #写入文件

#输出:
{
    "xiaohei": {
        "age": 18,
        "password": 12345,
        "sex": "",
        "addr": "北京"
    },
    "马春波": {
        "age": 18,
        "password": 12345,
        "sex": "",
        "addr": "北京"
    },
    "王东泽": {
        "age": 18,
        "password": 12345,
        "sex": "",
        "addr": "北京"
    }
}

 

2. json.dump:将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件

import json

dic = {
    "xiaohei":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
    "小白":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
    "小王":{
        "age":18,
        "password":12345,
        "sex":"",
        "addr":"北京"
    },
}

fw = open('newuser.json','w',encoding='utf-8')#打开一个新的文件
aa = json.dump(dic,fw,indent=4,ensure_ascii=False)#将字典写到该文件中
print(aa)

 

三、 总结

1. json序列化方法:

          dumps:无文件操作            dump:序列化+写入文件

  2. json反序列化方法:

          loads:无文件操作              load: 读文件+反序列化

 

3.

python 原始类型向 json 类型的转化对照表:

PythonJSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

4. json 类型转换到 python 的类型对照表:

JSONPython
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

 

posted @ 2018-12-04 15:08  denise1108  阅读(241)  评论(0编辑  收藏  举报