一. 简介

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. HashSet的remove方法(一道面试题)

    1 public class CollectionTest { 2 3 @Test 4 public void test3(){ 5 HashSet set = new HashSet(); 6 Pe ...

  2. 攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup

    攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup 题目介绍 题目考点 隐写术 摩斯密码 Writeup 下载附件是PDF文件打开,研究一 ...

  3. git stash 存储命令

    应用场景 一.当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除.但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可 ...

  4. uni-app 提示 v-for 暂不支持循环数据

    这个问题由于目前博主只在APP端遇到过,解决办法是把v-for key值全部取循环的索引,如果解决了你的问题请给博主点个赞 <block v-for="(item,index) in ...

  5. mysql 禁止外键检查

    SET FOREIGN_KEY_CHECKS=0; SET FOREIGN_KEY_CHECKS=1; from: https://stackoverflow.com/a/15501754/80250 ...

  6. 为什么建议使用你 LocalDateTime ,而不是 Date?

    在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.Loca ...

  7. 天冷了,任务栏养只猫吧「GitHub 热点速览 v.21.46」

    作者:HelloGitHub-小鱼干 运动能带来热量,盘猫也是,RunCat_for_windows 是一只奔跑在任务栏的猫,一定能给你的电脑带来一丝冬日的温暖.当然送温暖的除了任务栏小猫咪之外,还有 ...

  8. 线性规划之单纯形算法矩阵描述与python实现

    声明 本文为本人原创,转载请注明出处.本文仅发表在博客园,作者LightningStar. 问题描述 所有的线性规划问题都可以归约到标准型的问题,规约过程比较简单且已经超出本文范围,不再描述,可以参考 ...

  9. [loj6051]PATH

    (不妨将下标改为从1开始) 参考loj2265中关于杨表的相关知识 构造一个$n$行且第$i$行有$a_{i}$个格子的杨表,依次记录其每一次增加的时间(范围为$[1,\sum_{i=1}^{n}a_ ...

  10. 十.Go并发编程--channel使用

    一.设计原理 Go 语言中最常见的.也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共 ...