一. 简介

JSON,全称为JavaScript Object Notation(JavaScript对象标记),它通过对象和数组的组合来表示数据,是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

二. json语法

1. json语法规则

在js语言中,一切都是对象。因此,任何支持的类型都可以通过json来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型

(1)对象表示为键值对

(2)数据由逗号分隔

(3)花括号保存对象

(4)方括号保存数组

2 json键值对

JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值

注意:(1)python中的key:value必须都是双引号(不能用单引号)

     (2) 末尾不能写逗号

     (3)整个文件内容只能是被一个大括号{}或中括号[]包裹

3.对象和数组

(1)对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。

  (2)数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

三. json常用操作

loads,dumps;load,dump

1. 字符串和dict,list转换(loads,dumps)

(1)字符串向dict,list转换

str_list = '[{"name":"张三", "age":"20"}, {"name":"李四", "age":18}]'
str_dict = '{"name":"张三", "age":"20"}'
list_data = json.loads(str_list)
dict_data = json.loads(str_dict)
print(type(list_data))
print(list_data)
print(type(dict_data))
print(dict_data)

打印结果

<class 'list'>
[{'name': '张三', 'age': '20'}, {'name': '李四', 'age': 18}]
<class 'dict'>
{'name': '张三', 'age': '20'}

(2)dict,lis向字符串转换  

data_list = [{"name":"张三", "age":"20"}, {"name":"李四", "age":18}]
data_dict = {"name":"张三", "age":"20"}
list_str = json.dumps(data_list)
dict_str = json.dumps(data_dict)
print(type(list_str))
print(list_str)
print(type(dict_str))
print(dict_str)

 打印结果

<class 'str'>
[{"name": "\u5f20\u4e09", "age": "20"}, {"name": "\u674e\u56db", "age": 18}]
<class 'str'>
{"name": "\u5f20\u4e09", "age": "20"}

 

2. dict,list和文件对象(只包含一个json的文件)间的转换(load,dump)

(1)dict、list写入文件

list2 = [{"name": "张三", "age": 20}, {"name": "李四", "age": 18}]
with open('new.json', 'w') as f:
json.dump(list2, f)

结果能得到new.json文件(其内容为list2中的内容)

(2)读取文件=====>list、dict

with open('new.json', 'r') as f:
result = json.load(f)
print(result)

 打印结果如下:

[{'name': '张三', 'age': 20}, {'name': '李四', 'age': 18}]

3. json中的数据转换成csv文件(比较常用的是表格形式,便于数据分析) 

import json
import csv # 需求 json 中的数据 转换 成 csv文件 # 1.分别 读 , 创建文件
json_fp = open('02new.json', 'r')
csv_fp = open('03csv.csv', 'w')
with open('02new.json', 'r') as f:
# 读取出json内容,并转换为dict格式
data_list = json.load(f)
# 提取出表头
sheet_title = data_list[0].keys() # 提取出表内容
sheet_data = []
for data in data_list:
sheet_data.append(data.values())
# csv 写入器,初始化写入对象
writer = csv.writer(csv_fp)
# 写入表头
writer.writerow(sheet_title)
# 写入内容
writer.writerows(sheet_data)
# 6. 关闭两个文件
json_fp.close()
csv_fp.close()

结果得到03csv.csv文件,内容如下:

四. 案例------爬取http://www.allitebooks.org/   ,获取书名、作者、简介

商业爬虫学习笔记day8-------json的使用的更多相关文章

  1. 商业爬虫学习笔记day1

    day1 一. HTTP 1.介绍: https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html http://blog.csdn.ne ...

  2. 商业爬虫学习笔记day4

    一.获取登录后页面信息的两种方法 1.第一种方法: 人为把有效cookies加到请求头中,代码如下 import urllib.request # 确定url url = "https:// ...

  3. 商业爬虫学习笔记day2

    1. get传参 (1)url中包含中文报错解决方法 urllib.request.quote("包含中文的url", safe = "string.printtable ...

  4. 商业爬虫学习笔记day6

    一. 正则解析数据 解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正 ...

  5. 商业爬虫学习笔记day3

    一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...

  6. 商业爬虫学习笔记day7-------解析方法之bs4

    一.Beautiful Soup 1.简介 Beautiful Soup 是python的一个库,最主要的功能是从网页抓取数据.其特点如下(这三个特点正是bs强大的原因,来自官方手册) a. Beau ...

  7. 商业爬虫学习笔记day5

    一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...

  8. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  9. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

随机推荐

  1. linux 内核源代码情景分析——用户堆栈的扩展

    上一节中,我们浏览了一次因越界访问而造成映射失败从而引起进程流产的过程,不过有时候,越界访问时正常的.现在我们就来看看当用户堆栈过小,但是因越界访问而"因祸得福"得以伸展的情景. ...

  2. Linux初学者:从不同角度理解Linux系统

    在我初学Linux系统时,虽然已经掌握了一些命令,但总觉得还是很混乱.大家新买的笔记本如果是Windows系统,那么第一件事往往就是分区,目的就是将系统和软件分开.然而Linux却没有类似于Windo ...

  3. linux下c语言实现简单----线程池

    这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...

  4. jenkins 生成HTML报表,邮件推送

    1.登录jenkins,系统管理=>插件管理 =>可选插件安装 安装成功: 2.打开任务,进入配置 3.添加构建后操作 4.配置页面 5.构建后report输出配置完成后点击立即构建,构建 ...

  5. Java测试开发--HttpClient常规用法(九)

    1.HttpClient可以读取网页(HTTP/HTTPS)内容 2.对url发送get/post请求(带不带参数都可以),进行测试 一.maven项目pom.xml需要引入包 <depende ...

  6. The 'stream().forEach()' chain can be replaced with 'forEach()' (may change semantics)

    对集合操作时,因不同的写法Idea经常会提示:The 'stream().forEach()' chain can be replaced with 'forEach()' (may change s ...

  7. 2019年java大型项目技术选型

    学习一下 1,公司使用的架构是:SpringCloud + K8S 这一套主流技术,但是还是入门级别的. 还包含apollo  ,xxlJob ,SkyWalking,Cat,GrayLog等 2,G ...

  8. VM的三种连接方式(转载)

    概述: VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模 ...

  9. java自定义序列化

    自定义序列化 1.问题引出 在某些情况下,我们可能不想对于一个对象的所有field进行序列化,例如我们银行信息中的设计账户信息的field,我们不需要进行序列化,或者有些field本省就没有实现Ser ...

  10. Java JDBC 理论笔记

    一.JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connect ...