首页 > 代码库 > json&pickle序列化

json&pickle序列化

一、用途

  我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。

二、json序列化

1、dumps序列化和loads反序列化

dumps把数据类型转换成字符串

import json

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘
}

data = http://www.mamicode.com/json.dumps(info)"name": "The Count of Monte Cristo", "type": "Movie"}
<class ‘str‘>

loads把字符串转换成数据类型 

import json

get_info = json.loads(data)
print(get_info[‘name‘])
print(get_info)
print(type(get_info))

#输出
The Count of Monte Cristo
{‘name‘: ‘The Count of Monte Cristo‘, ‘type‘: ‘Movie‘}
<class ‘dict‘> 

2.dump序列化和load反序列化

dump把数据类型转换成字符串并存储在文件中

import json

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘
}

with open("test.txt", "w", encoding="utf-8") as f:
    json.dump(info, f)  # 第一个参数是内存中的数据对象,第二个参数是文件句柄

#写入文件中的内容
{"name": "The Count of Monte Cristo", "type": "Movie"}

load把文件打开从字符串转换成数据类型

import json


with open("test.txt", "r", encoding="utf-8") as f:
    data_from_file = json.load(f)

print(data_from_file[‘name‘])
print(data_from_file)
print(type(data_from_file))

#输出
The Count of Monte Cristo
{‘name‘: ‘The Count of Monte Cristo‘, ‘type‘: ‘Movie‘}
<class ‘dict‘>

  

3.json序列化一个函数

import json

def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

data = http://www.mamicode.com/json.dumps(info)"G:/python/untitled/study6/json&pickle模块.py", line 22, in <module>
    data = http://www.mamicode.com/json.dumps(info)"G:\python\install\lib\json\__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "G:\python\install\lib\json\encoder.py", line 198, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "G:\python\install\lib\json\encoder.py", line 256, in iterencode
    return _iterencode(o, 0)
  File "G:\python\install\lib\json\encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable

 

1、json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。

2、json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式

 

三、pickle序列化

pickle的用法和上面的相同,但是pickle序列化后的数据类型是二进制的,并且pickle只能在python中是使用。

1.dumps && loads

import pickle


def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

data = http://www.mamicode.com/pickle.dumps(info)>

 

import pickle

get_data = http://www.mamicode.com/pickle.loads(data)>

  

2. dump && load

import pickle


def test(name):
    print("hello,{}".format(name))

info = {
    ‘name‘: ‘The Count of Monte Cristo‘,
    ‘type‘: ‘Movie‘,
    ‘func‘: test
}

with open(‘test.txt‘, ‘wb‘) as f:
    pickle.dump(info, f)

# 写入test.txt文件中的内容

?}q (X   typeqX   MovieqX   funcqc__main__
test
qX   nameqX   The Count of Monte Cristoqu.

  

import pickle

with open(‘test.txt‘, ‘rb‘) as f:
    get_data = http://www.mamicode.com/pickle.load(f)>

  

总结:

  • json值支持简单的数据类型,pickle支持所有的数据类型。
  • pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  • pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。

 

json&pickle序列化