c python json_python json

json 模块

Javascript Object Notation(标记)

java脚本对象标记语言,将所有东西都变成字符串形式

python中的set 集合无法用json表示出来

线性数据:

流式数据 "磁盘上的文件" 一大堆0101010排列起来的

数据之间没有引用关系

13251923.html

结构化数据:

内存中:

'abc'.upper() 字符串

13251923.html

先把数据拆分出门 再把零件组装

13251923.html

serialization deserialization

序列化: 将内存中的数据转换成字节串,用以保存在文件或通过网络传输,称为序列化过程

反序列化 将文件中或者网络中获取的数据转换成内存中原来的数据类型称为反序列化的过程

13251923.html

从内存中 到内存中叫dumps 从内存中到文件中叫dump

这里有个生动形象的例子:

with open("a.txt", mode="wt", encoding="utf-8") as f:

f.write(10)

wt: write text

wb: write binary # t和b 表示数据的单位

a: append

w: write 覆盖写模式 # w和r 表示数据的方向 是读取还是写入

r: read

+: 加个

默认是 rt格式

如果这么写代码,会报错,显示wirte必须为str数据类型

也就意味着 如果我们没有字符串类型的数据,json也就用不了,没有意义.序列化的根本是字节,json是一种不彻底的序列化方式

Serialization_demo.py

s = json.dumps([1, 2, 3]) 把指定的对象转换为json格式的字符串

print(type(s))

print(s) # '[1, 2, 3]'

print(s.split(','))

(venv) C:\work\day16>python Serialization_demo.py

[1, 2, 3]

['[1', ' 2', ' 3]']

看上去好像没什么区别,但实际上是字符串

也就是 '[1, 2, 3]'

在强调一遍,并不是所有的数据类型都能转化为json的字符串

2. 元组

s = json.dumps((1, 2, 3))

print(s)

(venv) C:\work\day16>python Serialization_demo.py

[1, 2, 3]

json也能识别元组数据类型,将元组序列化后变成列表类型的字符串

将列表转换为元组

a = [1, 2, 3]

b = tuple(a)

print(type(a))

(venv) C:\work\day16>python Serialization_demo.py

3. 字典

s = json.dumps({'name': 'Andy', 'age': 10})

print(s)

print(type(s))

(venv) C:\work\day16>python Serialization_demo.py

{"name": "Andy", "age": 10}

4. 集合

s = json.dumps(set('abc'))

TypeError: Object of type set is not JSON serializable

(venv) C:\work\day16>

集合不可JSON序列化的类型

5.写入到文件dump

# 将json结果写到文件中

with open('a.txt', mode='at', encoding="utf-8") as f:

json.dump([1, 2, 3], f)

13251923.html

发现当前目录下自动写入了一个txt文件

2. 反序列化

2.1 List

# 反序列化

res = json.dumps([1, 2, 3]) # List序列化反序列化都是List

lst = json.loads(res)

print(type(lst))

print(lst)

a = '[1, 2, 3]'

b = str(a[1:])

c = str(b[:-1])

d = c.strip()

e = d.split(',')

print(e)

(venv) C:\work\day16>python Serialization_demo.py

[1, 2, 3]

2.2 元组

# 反序列化

res = json.dumps((1, 2, 3))

lst = json.loads(res)

print(type(lst))

print(lst)

(venv) C:\work\day16>python Serialization_demo.py

[1, 2, 3]

元组序列化后变成List样的字符串,反序列化后又变成List.无法回到元组类型

2.3 从文件中反序列化

从内存中到内存中 loads

从文件到内存 load

总结

# json

# json.dumps(obj) # 内存到内存中

# json.dump(obj, f) # 内存到文件中

# json.loads() # 内存中有一个数据转为内存中

# json.load(f) # 将f文件中的格式回复到原本的格式

# 把需要序列化的对象, 通过多次序列化的方式,用文件的write方法把多次序列化后的字符串写到文件中

with open('json.txt', mode='at', encoding='utf-8') as f:

f.write(json.dumps([1, 2, 3]) + '\n')

f.write(json.dumps([4, 5, 6]) + '\n')

# 为什么要加 '\n'

如果不加的话将来读取不回来了, 因为两个中括号在一起了

# 把分次序列化的json字符串, 反序列化回来

with open('json.txt', mode='rt', encoding='utf-8') as f:

res = json.loads(f.readline().strip())

res2 = json.loads(f.readline().strip())

print(type(res))

print(res)

print(type(res2))

print(res2)

做法二:

with open('json.txt', mode='rt', encoding='utf-8') as f:

for x in f:

print(json.loads(x.strip()))

13251923.html

反序列化过程

13251923.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值