活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;
虽然永远无法预料明天是晴还是雨,
也无法预知你在乎的人是否还在身旁,
以及你一直以来的坚持究竟能否换来什么。
但你能决定的是,
今天有没有备好雨伞,
有没有好好爱自己,
以及是否为自己追求的理想而拼尽全力。
- json标准库大总结
- 一、什么是json?
- 二、json语法规则
- 三、json模块
- json.dumps()
- json.dump()
- json.load()
- 四、XML文件和JSON文件互转
- 五、解析json文件
- json与js对象的关系
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
简要历史
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换 [5] 。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
总结
- json独立于语言
- json具有自我描述性,更易理解
- json比XML更小、更快、更易解析
- 在我们使用爬虫获取的接口数据就是json格式
语法格式:{key1:value1,key2:value2}键值对形式(冒号分开),对间用逗号连接
范例:简单的json对象
{
"name":"样子的木偶",
"age":18
}
在实际运用中常常这样表示一个对象
{"name":"样子的木偶","age":18}//同一个对象信息编写在同一行节省空间
复杂范例:
{
"中国省份":[//使用数组包含两个对象,每个对象用逗号分隔
{"name":"台湾","位置":"东方"},//对象内每个键值对通过逗号分隔
{"name":"河南","位置":"中原"}
]
}
注意事项
- json的键值对key部分必须要使用“包裹起来,单引号都不行,这样key中二点值都成为了符号,在js中就没有这样的强制要求,但是js中要求key中不能包含关键字
- json中的键值对value部分,不允许出现函数function、undefined、NaN,但是可以有null,js中对象的值中可以出现
- json数据结束后、不允许出现没有用的逗号如:{key:value,key2:value2,},注意看结尾部分value2的后面的逗号,不允许出现
json格式总结
值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:
{"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}
JSON中的对象可以包含多个键值对,并且有数组结构,该语言正是一次实现过程内容的描述。
数组是由方括号括起来的一组值构成,如:[3, 1, 4, 1, 5, 9, 2, 6]
字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
json的正确使用方法
#格式1:json对象
{"name":"样子的木偶","age":18}//同一个对象信息编写在同一行节省空间
#格式2:json数组
{
"中国省份":[//使用数组包含两个对象,每个对象用逗号分隔
{"name":"台湾","位置":"东方"},//对象内每个键值对通过逗号分隔
{"name":"河南","位置":"中原"}
]
}
三、json模块
作用
- 使用json字符串生成python对象(load)
- 由python对象格式化成为json字符串(dump)
python到json数据类型转换
将数据从python转换到json格式,在数据类型上会由变化,如下表:
| python | json |
|---|---|
| dict | object |
| list,tuple | array |
| str | strig |
| int,float,int-&float-derived Enums | number |
| True | true |
| False | false |
| None | null |
反过来,将json格式转化为python内置类型,如下表所示:
| json | python |
|---|---|
| object | dict |
| array | list |
| string | str |
| umber(int) | int |
| number(real) | float |
| true | True |
| false | False |
| null | None |
使用方法
json模块我们主要学会使用这四种方法就好
json.dumps(obj)//将python数据类型转换为json格式的字符串。
josn.dump(obj,fp)//将python数据类型转换并保存到son格式的文件内。
json.loads(s)//将json格式的字符串转换为python的类型。
json.load(fp)//从json格式的文件中读取数据并转换为python的类型。
接下来我们分别介绍使用方法
json.dumps()将python数据类型转化为json格式的字符串
语法格式
- json.dumps(obj, *,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=Mone,indent=HNone,separators=None,default=None,sort_keys=False,**kw)
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典转换为json字符串
jsonStr = json.dumps(person)
print(jsonStr )
print(type(jsonStr))
从上面可以看出json格式和python格式的区别:python格式打印输出是单引号,类型为dict。而json格式输出是双引号,类型为:str。True的开头大小写的区别
使用dumps()的一些参数可以将json字符串进行格式化输出:
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典转换为json字符串
jsonStr = json.dumps(person,sort_keys=True, indent=4, separators=(',', ': '))
print(jsonStr )
print(type(jsonStr))
参数介绍
- sort_key:是否进行排序
- indent:定义缩进距离
- separators:是一个元组,定义分隔符类型
- skipkeys:是否允许json字符串编码字典对象时,字典的key不是字符串类型(默认是不允许)
修改分隔符
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
print(person)
print(type(person))
# Python字典转换为json字符串
jsonStr = json.dumps(person, sort_keys=True, indent=4, separators=('!', ': '))
print(jsonStr)
print(type(jsonStr))
文件操作
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典转换为json字符串
jsonStr = json.dumps(person)
print(jsonStr)
print(type(jsonStr))
with open('test.json', 'w', encoding='utf-8') as f: # 文件名/写入/编码类型
f.write(jsonStr) # 在文件里写入转成的json串
创建了text.json文件并写入内容
语法格式
- json.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)
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典转换为json字符串
jsonStr = json.dumps(person)
json.dump(person, open('text.json', 'w'))
使用参数能让json字串格式化输出:
import json
# Python字典
person = {"name": "样子的木偶", "age": 18, "tel": ["10086996", "1351111111"], "isonly": True}
# Python字典转换为json字符串
jsonStr = json.dumps(person)
json.dump(person, open('text.json', 'w'), sort_keys=True, indent=4, separators=(',', ': '))
json.dumps和json.dumps写入文件的区别:
- dump()不需要使用.write()方法,只需要写那个字典,那个文件即可;而dumps()需要使用.wnite()方法写
- 如果把字典写到文件里面的时候,dump()好用;但是如果不需要操作文件,或需要把内容存储到数据库何excel,则需要使用dumps()先把字典转换成字符串,再写入
使json格式的文件中的数据类型转换为python中的类型
- 语法格式: json.load(fp," , cls=Mone, object_hook=None,parse_float=NMone, parse_int=None, parse_constant=None,object_pairs_hook=None,**kw)
import json
python= json.load(open('text.json','r'))
print(python)
print(type(python))
json.load()和json.loads()区别
- loads()传的是json字符串,而load()传的是文件对象
- 使用loads()时需要先读取文件再使用,而load()则不用
总结
我们可以发现不管dumps还是load,带s的都是和字符串相关的,不带s的都是和文件相关的
XML文件转为JSON文件
新建一个text.xml文件:
tom mary love
import json
import xmltodict
def xml_to_json(xml_str):
"""parse是的xml解析器,参数需要
:param xml_str: xml字符串
:return: json字符串
"""
xml_parse = xmltodict.parse(xml_str)
# json库dumps()是将dict转化成json格式,loads()是将json转化成dict格式。
# dumps()方法的ident=1,格式化json
json_str = json.dumps(xml_parse, indent=1)
return json_str
XML_PATH = './text.xml' # xml文件的路径
with open(XML_PATH, 'r') as f:
xmlfile = f.read()
with open(XML_PATH[:-3] + 'json', 'w') as newfile:
newfile.write(xml_to_json(xmlfile))
成功写入json文件
json文件转换为xml文件
新建text.json文件:
{
"student": {
"course": {
"name": "math",
"score": "90"
},
"info": {
"sex": "male",
"name": "name"
},
"stid": "10213"
}
}
转换代码
import xmltodict
import json
def json_to_xml(python_dict):
"""xmltodict库的unparse()json转xml
:param python_dict: python的字典对象
:return: xml字符串
"""
xml_str = xmltodict.unparse(python_dict)
return xml_str
JSON_PATH = './text.json' # json文件的路径
with open(JSON_PATH, 'r') as f:
jsonfile = f.read()
python_dict = json.loads(jsonfile) # 将json字符串转换为python字典对象
with open(JSON_PATH[:-4] + 'xml', 'w') as newfile:
newfile.write(json_to_xml(python_dict))
生成xml文件
json和xml的区别
1、可读性
JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。
可扩展性
XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。
2、编码难度
XML有丰富的编码工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。
3、解码难度
XML的解析方式有两种:
一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName(“tagName”),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。
另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。
凡是这样可扩展的结构数据解析起来一定都很困难。
JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。
而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然对于不是经常使用这个字符串的人,这样做仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。
以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。
除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。
五、解析json文件解析json文件其实就是定位到所需数据的键即可
代码实现
import json
json_str = '{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}'
print(json_str)
print(type(json_str))
print('-' * 20)
# 1、JSON文件转换为Python对象
python_obj = json.loads(json_str)
print(python_obj)
print(type(python_obj))
print('-' * 20)
# 2、定位具体的数据节点
print(python_obj.keys())
print(python_obj.values())
print(python_obj["name"])
print(python_obj["type"]["name"])
print(python_obj["type"]["parameter"][0])
print(python_obj["type"]["parameter"][1])
输出结果
解析json文件
新建text.json文件
{
"student": {
"course": {
"name": "math",
"score": "90"
},
"info": {
"sex": "male",
"name": "name"
},
"stid": "10213"
}
}
解析代码实现
import json
# 1、JSON文件转换为Python对象
python_obj = json.load(open('test.json', 'r'))
print(python_obj)
print(type(python_obj))
print("-" * 20)
# 2、解析json文件
# 输出cours节点e下的数据
print(python_obj['student']['course']['name']) # 输出name
print(python_obj['student']['course']['score']) # 输出score
# 输出info节点下的数据
print(python_obj['student']['info']['sex']) # 输出sex
print(python_obj['student']['info']['name']) # 输出name
# 输出stid节点下的数据
print(python_obj['student']['stid']) # 输出stid
解析结果
很多人搞不清楚 JSON 和 JS 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
如
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串



