5. Json

2020/02/21 posted in  爬虫

数据分类

非结构化数据:html

处理方法: re,Xpath,bs4等

结构化数据:json

处理方法: 将json格式的数据转化成Python的数据类型

JSON

JSON是一种轻量级的数据交换格式,它使得人们很容易进行阅读和编写。同时也方便了机器进行解析和生成,适用  于进行数据交互的场景,比如网站前台与后台之间的数据交互。

clip_image001.jpg

JSON语法规则

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

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

JSON模块

通过Python的json模块,可以将字符串形式的json数据转化为字典,也可以将Python中的字典数据转化为字符串形式  的json数据。

Json 模块提供了四个方法: dumps(重点)、dump、loads(重点)、load。

dumps 和 dump

dumps(重点掌握)和dump 序列化方法

dumps只完成了序列化为str

dump必须传文件描述符,将序列化的str保存到文件中

# dumps 将“obj” 数据类型 转换为 JSON格式的字符串
dict1 = {
    'Code': 200,
    'Count': 657,
    'Posts': [
                {
                    'Id': 0,
                    'PostId': "1123178321664806912",
                    'RecruitPostId': 49691
                },
                {
                    'Id': 0,
                    'PostId': "1123178321664806912",
                    'RecruitPostId': 49691
                }
            ]
        }

json_dict = json.dumps(dict1) 
print(json_dict) 
print(type(json_dict))

 # dump 两个动作,一个动作是将”obj“转换为JSON格式的字符串,还有一个动作是将字符串写入到文件中,也就是说文件描述符fp是必须要的参数

with open('./a.json','w') as f:
    json_dict1 = json.dump(dict1,fp=f) 
    print(json_dict1)
    print(type(json_dict1))

loads 和 load

loads(重点掌握)和load 反序列化方法

load 只接收文件描述符,完成了读取文件和反序列化

loads 只完成了反序列化

# loads 将包含str类型的JSON文档反序列化为一个python对象
dic = json.loads('{"name":"Tom", "age":23}') 
print(dic)
print(type(dic))

# load 将一个包含JSON格式数据的可读文件饭序列化为一个python对象
with open("./a.json", "r",encoding='utf-8') as f:
    aa = json.load(f)
    print(aa) 
    print(type(aa))

参数介绍

对应于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排序。