JSON中的反序列化和序列化是啥?

Posted

技术标签:

【中文标题】JSON中的反序列化和序列化是啥?【英文标题】:What is deserialize and serialize in JSON?JSON中的反序列化和序列化是什么? 【发布时间】:2011-03-20 00:11:34 【问题描述】:

我已经看到了 JSON 的“反序列化”和“序列化”这两个术语。它们是什么意思?

【问题讨论】:

这能回答你的问题吗? What is serialization? 【参考方案1】:

JSON 是一种将对象编码为字符串的格式。 Serialization表示将一个对象转换成那个字符串,而反序列化是它的逆操作(转换字符串->对象)

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

说,你有一个对象:

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

序列化成 JSON 会转成字符串:

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

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

【讨论】:

@kennytm - 我正试图通过网络发送东西。无论我使用二进制编码还是使用 json、xml 或 proto buf - 数据总是必须以字节为单位,然后才能通过网络发送。这是真的吗? @Nirmal 是的。 ___ 我用来记住区别的助记符是“序列化将对象变成序列号” 那么我们为什么不直接"foo: [1, 4, 7, 10], bar: "baz"" @EnricoMariaDeAngelis JSON 属性必须用引号引起来。这是必要的 - 查看 wiki 上的第一个示例:en.wikipedia.org/wiki/JSON【参考方案2】:

序列化和反序列化

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

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

来源:wikipedia.org

用 Python 解释

在 Python 中,序列化 只是将给定的数据结构转换为其有效的 JSON 挂件(例如,Python 的 True 将转换为 JSON 的 true 并且字典本身将被转换到一个字符串),反之亦然反序列化

您可以轻松发现 Python 和 JSON 表示之间的区别,例如,通过它们的布尔值。查看下表,了解两种上下文中使用的基本类型:

Python JSON
True true
False false
None null
int, float number
str (with single ', double " and tripple """ quotes) string (only double " quotes)
dict object
list, tuple array

代码示例

Python 内置模块json 是执行serialization 和deserialization 的标准方法:

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.com,geeksforgeeks.org

【讨论】:

这应该是答案。【参考方案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'

【讨论】:

不过,用户询问的是 JSON 而不是 pickle。这有点跑题了。 这是原始问题:什么是 JSON 中的反序列化和序列化?我使用 Python 的 pickle 模块来演示这个想法。我使用了一个工具来解释一个想法。您更关注工具而不是想法。

以上是关于JSON中的反序列化和序列化是啥?的主要内容,如果未能解决你的问题,请参考以下文章

.net 3.5 中的反序列化对象

MVC3 (Razor) Json 获取Controller中的反序列化数据

Newtonsoft.Json 处理多态类型的反序列化

为啥JSON字符串当中会出现反斜杠?

json 字符串中一个 value 多种类型的反序列化

MVC4 操作中的反序列化对象导致空值