在JSON中什么是反序列化和序列化?

我曾经用JSON见过术语“反序列化”和“序列化”。它们是什么意思?

345764 次浏览

JSON是一种在字符串中编码对象的格式。Serialization表示将一个对象转换为该字符串反序列化是它的逆操作(convert string -> object)

在传输数据或将数据存储在文件中时,要求数据为字节字符串,但复杂对象很少采用这种格式。序列化可以将这些复杂的对象转换为字节字符串以供使用。在字节串传输之后,接收方必须从字节串中恢复原始对象。这就是所谓的反序列化。

比如说,你有一个对象:

{foo: [1, 4, 7, 10], bar: "baz"}

序列化成JSON会把它转换成一个字符串:

'{"foo":[1,4,7,10],"bar":"baz"}'

可以存储或通过电线发送到任何地方。然后,接收方可以反序列化此字符串以获得原始对象。{foo: [1, 4, 7, 10], bar: "baz"}

序列化和反序列化

在数据存储上下文中,序列化(或序列化)是将数据结构或对象状态转换为可以存储(例如在文件或内存缓冲区中)或传输(例如通过网络连接链接)并稍后重建的格式的过程。[…]

相反的操作,从一系列字节中提取数据结构,是反序列化

——wikipedia.org

JSON

JSON (JavaScript对象表示法)是一种开放的标准文件格式和数据交换格式,它使用人类可读的文本来存储和传输由属性值对和数组(或其他可序列化值)组成的数据对象。它是一种通用的数据格式,在电子数据交换中有多种用途,包括与服务器的web应用程序的交换。

JSON是一种独立于语言的数据格式。它起源于JavaScript,但许多现代编程语言都包含生成和解析json格式数据的代码。JSON文件名使用扩展名. JSON。

——wikipedia.org

使用Python解释

在Python中,序列化只是将给定的数据结构转换为有效的JSON挂坠(例如,Python的True将转换为JSON的true,字典本身将转换为字符串),对于反序列化则相反。

Python vs. JSON

您可以在并排比较中轻松发现Python和JSON表示之间的差异。例如,通过检查它们的布尔值。看看下面这两种情况下使用的基本类型:

Python JSON
True true
False false
None null
int, float number
str(包含一个',两个"和三个"""引号) string(只有双"引号)
dict object
list, tuple array
< / div >

代码示例

Python内置模块json是执行序列化反序列化的标准方式:

import json


data = {
'president': {
"name": """Mr. Presidente""",
"male": True,
'age': 60,
'wife': None,
'cars': ('BMW', "Audi")
}
}


# serialize
json_data = json.dumps(data, indent=2)


print(json_data)
# {
#   "president": {
#     "name": "Mr. Presidente",
#     "male": true,
#     "age": 60,
#     "wife": null,
#     "cars": [
#       "BMW",
#       "Audi"
#     ]
#   }
# }


# deserialize
restored_data = json.loads(json_data) # deserialize

来源:realpython.comgeeksforgeeks.org

使用Python进行序列化和反序列化的说明

在python中,pickle模块用于序列化。因此,序列化过程在Python中称为酸洗。这个模块在Python标准库中可用

使用pickle序列化

import pickle


#the object to serialize
example_dic={1:"6",2:"2",3:"f"}


#where the bytes after serializing end up at, wb stands for write byte
pickle_out=open("dict.pickle","wb")
#Time to dump
pickle.dump(example_dic,pickle_out)
#whatever you open, you must close
pickle_out.close()

PICKLE文件(可以用记事本等文本编辑器打开)包含以下(序列化数据):

$}q (KX 6qKX 2qKX fqu;

使用pickle进行反序列化

import pickle


pickle_in=open("dict.pickle","rb")
get_deserialized_data_back=pickle.load(pickle_in)


print(get_deserialized_data_back)

输出:

{1: '6', 2: '2', 3: 'f'}