栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python(进阶篇)-json标准库大总结

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python(进阶篇)-json标准库大总结

​
​

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;

虽然永远无法预料明天是晴还是雨,

也无法预知你在乎的人是否还在身旁,

以及你一直以来的坚持究竟能否换来什么。

但你能决定的是,

今天有没有备好雨伞,

有没有好好爱自己,

以及是否为自己追求的理想而拼尽全力。

目录
  • json标准库大总结
    • 一、什么是json?
    • 二、json语法规则
    • 三、json模块
      • json.dumps()
      • json.dump()
      • json.load()
    • 四、XML文件和JSON文件互转
    • 五、解析json文件
    • json与js对象的关系

json标准库大总结 一、什么是json?

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格式
二、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格式,在数据类型上会由变化,如下表:
pythonjson
dictobject
list,tuplearray
strstrig
int,float,int-&float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

反过来,将json格式转化为python内置类型,如下表所示:

jsonpython
objectdict
arraylist
stringstr
umber(int)int
number(real)float
trueTrue
falseFalse
nullNone

使用方法

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()

语法格式

  • 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.load()

使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文件互转

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 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
如

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034448.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号