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

291

我看到过关于 JSON 的 "deserialize" 和 "serialize" 这两个术语。它们是什么意思呢?


1
这个回答解决了你的问题吗?[什么是序列化?](https://dev59.com/8HRB5IYBdhLWcg3wZmhz) - codeforester
1
@codeforester 不完全是。那里没有提到JSON。而且我们已经晚了10年。 - Pablo
4个回答

428

JSON是一种将对象编码为字符串的格式。 序列化 是指将一个对象转换成该字符串,而反序列化则是它的逆操作(将字符串转换为对象)

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

假设你有一个对象:

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

将对象序列化为 JSON 将把它转换为字符串:

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

该字符串可以被存储或发送到任何地方。接收者可以反序列化此字符串以获取原始对象。{foo: [1, 4, 7, 10], bar: "baz"}


9
无论是使用二进制编码、JSON、XML还是ProtoBuf,发送数据时都必须将其转换为字节流。这意味着你需要理解如何在网络上传输二进制数据。 - Nirmal
2
@Nirmal 是的。 - kennytm
2
我用来记住二者区别的助记设备是,“序列化将对象转换为串行号码”。 - Janac Meena
5
那么为什么我们不直接使用 "{foo: [1, 4, 7, 10], bar: "baz"}" - panoet
4
JSON属性必须加引号,这是必要的-请查看维基百科上的第一个示例:https://en.wikipedia.org/wiki/JSON - Cloud
显示剩余2条评论

57

序列化和反序列化

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

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

wikipedia.org

JSON

JSON(JavaScript Object Notation)是一种开放的标准文件格式和数据交换格式,使用人类可读的文本来存储和传输由属性-值对和数组(或其他可序列化值)组成的数据对象。它是一种通用的数据格式,在电子数据交换中有各种用途,包括与服务器配合使用的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
代码示例

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

2
这应该是答案。 - Juozas
简单而非常清晰的答案。还解释了Python字典和JSON对象类型之间微妙的区别。 - Banty
如果你执行print(type(json_data)),它会显示str。所以字典对象被转换成了字符串。 - undefined

3

分享我对这个主题的学习心得。

什么是序列化

序列化是将数据对象转换为字节流的过程。

什么是字节流

字节流只是一串二进制数据流。因为只有二进制数据才能被存储或传输。

字节字符串与字节流的区别

有时你会看到人们也使用字节字符串这个词。字节的字符串编码称为字节字符串。然后它可以解释下面的JSON是什么。

JSON和序列化之间的关系是什么

JSON是表示字节数据的字符串格式。JSON以UTF-8编码。因此,虽然我们看到的是可读的字符串,但在幕后,字符串以UTF-8中的字节编码。


3

Python中序列化和反序列化的解释

在Python中,使用pickle模块进行序列化。因此,在Python中,序列化过程称为pickling。该模块可在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'}


8
用户问到的是JSON而不是pickle,这有点跑题。 - smci
3
JSON中的序列化和反序列化是什么?我将使用Python的pickle模块来演示这个概念。我已经使用了一个工具来解释这个概念,但你似乎关注于这个工具而不是这个概念本身。 - Asif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接