文章目录
前言
之前在学习python时,接触过json模块,但是对此是一知半解,因此我决定复习json并记下笔记。
提示:以下是本篇文章正文内容,下面案例可供参考
1、JSON基础
1.1、JSON是什么?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
1.2、JSON的两种结构
1、“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2、值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array),值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。
1.3、JSON的合法实例
{"key1":"value1","key2":'value2'}#名称值对的集合
[1,2,3]#值的有序序列
[{"1":1.01},{"2":2}]#值的有序序列,里面可以嵌套的字典
'str'
对于末行json的合法实例,基于我现在知识的理解是:python中一切皆对象,如字符串这种基本数据类型的实例其实就是对象,那么它的结构就是“名称/值”对的集合
2、JSON在python中的使用
2.1、JSON格式与字典的区别
问题引入:通过1.3的实例,我们可以发现python中的字典不就是就是json格式吗,可实际上真的是这样吗?
1、字典是数据类型而json是数据格式
2、字典是python中内置的一个数据结构,由多个键值构成,键和值用冒号分割,每个键值对之间用(,)号分割并包含在({})中,键是唯一的,值可以取任何类型,但是键必须是不可变类型,如字符串,数字或元组
3、描述虽然和json很相似,但别忘了,json中key必须用双引号(在转化字典为json格式时会有点坑,在下文将会验证),并且字典不能嵌套,而且二者之间没有可比性
4、基于以上几点列出几例,不满足json,但是可以为字典
{1:'key'}
{(1,2):1}
2.2、序列化与反序列化——json模块
简单说明:python中对象转化json格式可以使用两个模块,一种是只在python中使用的pickle模块,第二种是可在python外广泛使用的json模块,下面主要写json模块的简单操作
2.2.1、dump与load方法
dump(object,fp):将 obj 序列化为 JSON 格式化流形式的 fp (支持 .write()
的 文件对象)。
load(fp):将 fp (一个支持 .read()
并包含一个 JSON 文档的 text file 或者 binary file) 反序列化为一个 Python 对象。
实验代码:
import sys
print(sys.getdefaultencoding())#获取环境下的编码
data={'key1':'value1','key2':'value2'}
with open('./test.txt','w') as f:#open函数在没有指定编码时会查找使用python环境的编码
json.dump(data,f)
with open('./test.txt','r') as f:
value=json.load(f)
print(value,type(value))
实验结果:
utf-8
{'key1': 'value1', 'key2': 'value2'} <class 'dict'>
2.2.2、dumps与loads方法
dumps(object):将 obj 序列化为 JSON 格式的 str。
loads(str):将 s (一个包含 JSON 文档的 str, bytes 或 bytearray 实例) 反序列化为 Python 对象。
实验代码:
#例1
data={'key1':'value1','key2':'value2'}
string=json.dumps(data)#对象序列化json格式的str
print(string,type(string))
newdata=json.loads(string)#json格式的str序列化成对象
print(newdata,type(newdata))
#例2
data2={1:'value1',(2):'value2'}
string=json.dumps(data2)
print(string,type(string))
newdata2=json.loads(string)
print(newdata2,type(newdata2))
实验结果:
例子1结果:
{"key1": "value1", "key2": "value2"} <class 'str'>
{'key1': 'value1', 'key2': 'value2'} <class 'dict'>
例子2结果:
{"1": "value1", "2": "value2"} <class 'str'>
{'1': 'value1', '2': 'value2'} <class 'dict'>
2.2.3、问题发现与解决:
问题:在例子2中对象和json格式的转化出现了问题,原来的对象是{1:'value1',(2):'value2'}在对象转json,json转对象中发生了变化,成了:{'1': 'value1', '2': 'value2'}
原因:json中key必须是双引号的字符,所以在转换过程中原来的key类型被转化成了字符串类型
总结
本文仅仅写了些json基础与在python中的使用,其实json被广泛使用于数据传输,前后端的数据交互。
行文至此,发觉自己不过沧海一粒,但仍在此共勉,绳锯木断,水滴石穿!