返回顶部
首页 > 资讯 > 后端开发 > Python >Python怎么把不同类型数据的json序列化
  • 377
分享到

Python怎么把不同类型数据的json序列化

2023-06-14 23:06:21 377人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python怎么把不同类型数据的JSON序列化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整

这篇文章将为大家详细讲解有关python怎么把不同类型数据的JSON序列化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Python的数据类型有哪些?

python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点型)。2.字符串,分别是str类型和unicode类型。3.布尔型,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)。4.列表,列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型。5. 元组,元组用”()”标识,内部元素用逗号隔开。6. 字典,字典是一种键值对的集合。7. 集合,集合是一个无序的、不重复的数据组合。

现代网络应用WEB APP或大型网站的后台一般只有一个,然后客户端却是各种各样的(iOS, Android, 浏览器), 而且客户端的开发语言很可能与后台的开发语言不一样。这时我们需要后台能够提供可以跨平台跨语言的一种标准的数据交换格式供前后端沟通(这就是Web api的作用)。如今大家最常用的跨平台跨语言数据交换格式就是jsON(javascript Object Notation)了。JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),人们很容易进行阅读和编写。python自带的dumps方法很有用,能很容易将字典dict类型数据转化为json格式,然后还有很多类型的数据(如日期,集合, 自定义的类和Django的QuerySet类型),我们需要自定义序列化方法才能将它们转化为json格式。今天小编我就来对python的json模块做下总结,并详细介绍如何把不同类型的数据json序列化。

何谓序列化(serialization)

每种编程语言都有各自的数据类型, 将属于自己语言的数据类型或对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化(seralization);反之则称为反序列化。

Python的JSON模块

python自带的json库(无需额外安装), 主要包含了dumps, loads, dump和load四种方法其作用分别如下所示。

  • json.loads() - 将json字符串转换为python数据类型

  • json.dumps() - 将python数据类型转化为json字符串

  • json.dump() - 将python输入转化为json格式存入磁盘文件

  • json.load() - 将磁盘文件中json格式数据转换为python数据类型

python数据格式与json数据格式对应转换关系如下:

PythonJSON
dictObject
list, tuplearray
strstring
int, float, numbers
Truetrue
Falsefalse
Nonenull

你注意到了吗? 还有很多python数据类型(set, datetime)不在上表中哦。

json的模块dumps方法介绍 - python数据的序列化

json模块的dumps方法可以将python常用数据格式转化为json格式。该方法还提供了很多可选参数如ident, separators, ensure_ascii, sort_keys和default参数。这些参数都非常有用,我们会稍后逐一介绍。

dumps(obj, skipkeys=False, ensure_ascii=True,       check_circular=True, allow_nan=True,       cls=None, indent=None, separators=None,      default=None, sort_keys=False, **kw)

我们先来看看一个最简单的例子。你注意到了吗? 生成的json格式数据外面都加了单引号,这说明dict类型数据已经转化成了json字符串。

>>> import json>>> json.dumps({"name":"John", "score": 112})'{"name": "John", "score": 112}'

如果一个dict很长,生成的json字符串会非常长,这时我们可以设置indent参数使生成的json格式数据更优美,更容易人们阅读。代码如下所示:

>>> import json>>> json.dumps({"name":"John", "score": 112}, indent=4)'{\n    "name": "John",\n    "score": 112\n}'>>> print(json.dumps({"name":"John", "score": 112}, indent=4)){    "name": "John",    "score": 112}

然而使用indent参数的代价是json字符串里增加了额外的空白,机器阅读根本不需要它们,

即使不用indent参数,你会发现dumps生成的json字符串中的','号和':'号分隔符后都会附加一个默认空白字符,我们可以通过separators参数重新指定分隔符,从而去除无用的空白字符,如下所示。这样可以减少无用数据的的传输,节省带宽增加数据传输速度。

>>> import json>>> json.dumps({"name":"John", "score": 112})'{"name": "John", "score": 112}'# 使用separators选项>>> json.dumps({"name":"John", "score": 112}, separators=(',',':'))'{"name":"John","score":112}'

如果字符串有非ASCII字符(比如中文),它们在json序列化时都会被转义成'\uXXXX'组成的ascii字符串。如果想得到更加易读的字符串,可以设置ensure_ascii=False。

>>> import json>>> json.dumps({"Name":"小明", "Age": 16})'{"Name": "\\u5c0f\\u660e", "Age": 16}'# 设置ensure_ascii=False>>> json.dumps({"Name":"小明", "Age": 16}, ensure_ascii=False)'{"Name": "小明", "Age": 16}'

一般的dict默认是无序的,你还可以设置sort_keys = True对生成的json格式数据进行排序,这里就不演示了。default参数我们后面会重点介绍。

json模块的dump,loads和load方法介绍

与dumps方法不同,json模块的dump方法用于将生成的json数据写入磁盘文件。其用法和dumps类似,唯一不同的是需要指定需要写入的文件,具体用法如下所示:

import jsonwith open("json.txt", 'w') as f:   json.dump({"Name":"小明", "Age": 16}, f, ensure_ascii=True)

json的loads方法用于将json格式数据转化为python格式,实现数据的反序列化,如下所示。千万别忘了在json符串外的单引号哦。

>>> import json>>> json.loads('{"Name": "小明", "Age": 16}'){'Name': '小明', 'Age': 16}

json的load方法与loads用法相似,不过它需要指定存有json数据的文件。

>>> import json>>> with open("json.txt", 'r') as f:    json.load(f)

很多python格式数据不能直接被dumps方法序列化

很多python数据类型(比如日期,集合和自定义的类)并不能直接被dumps方法序列化,这时会出现 xxx is not JSON serializable的错误,如下面代码所示。当出现类似错误时,我们有两种解决方案。

  • 通过数据类型转换函数实现

  • 通过继承JSONEncoder和JSONDecoder类实现

>>> import json>>> from datetime import datetime# DateTime类型>>> json.dumps({"date":datetime.now()})Traceback (most recent call last):TypeError: Object of type 'datetime' is not JSON serializable# 自定义的User类>>> class User(object):        def __init__(self, name):            self.name = name>>> json.dumps(User("John"))Traceback (most recent call last):TypeError: Object of type 'User' is not JSON serializable

解决方案一: 编写数据类型转换函数

该方法的工作原理是先编写数据类型转化函数,通过设置dumps方法里的default参数调用格式转化函数,将dumps方法不支持的数类型先转化为字符串格式,再实现json序列化。

# 将datetime格式数据json化>> > import json>> > from datetime import datetime>> > def date_to_str(obj):        if isinstance(obj, datetime):            return obj.strftime('%Y-%m-%d %H:%M:%S')        elif isinstance(obj, date):            return obj.strftime('%Y-%m-%d')        return TypeError>> > json.dumps({"date": datetime.now()}, default=date_to_str)'{"date": "2018-09-22 21:25:42"}'# 将set类型数据json化>> > import json>> > set_data = {'my_set': {1, 2, 3}}>> > def set_to_list(obj):        if isinstance(obj, set):            return list(obj)        raise TypeError>> > result = json.dumps(set_data, default=set_to_list)

对于我们自定义的类, 使用dumps方法时我们一般要先编写obj_to_dict方法,将object转化为字典dict再JSON序列化。同理,使用loads方法对json数据反序列化时,我们还需要编写dict_to_obj方法,通过default参数调用。下面这2段代码是比较通用的对象(object)与字典(dict)互转的经典代码,请用微信收藏后再看。

# 将自定义的类转化为字典,dumps方法使用def obj_to_dict(obj):    d = {}    d['__class__'] = obj.__class__.__name__    d['__module__'] = obj.__module__    d.update(obj.__dict__)    return d# 将字典转化为自定义的类,loads方法使用def dict_to_obj(d):    if '__class__' in d:        class_name = d.pop('__class__')        module_name = d.pop('__module__')        module = __import__(module_name)        class_ = getattr(module, class_name)        args = dict((key.encode('ascii'), value) for key, value in d.items())        instance = class_(**args)    else:        instance = d    return instance

解决方案二: 继承JSONEncoder类和JSONDecode类

另一个解决方案是继承JSONEncoder类和JSONDecode类定义自己的编码Encoder类,然后使用cls=MyEncoder,来调用编码器。比如下例中我们定义了自己的DateTimeEncoder,将日期类型数据序列化。

from datetime import datetime, dateimport jsonclass DateTimeEncoder(json.JSONEncoder):    def default(self, obj):        if isinstance(obj, datetime):            return obj.strftime('%Y-%m-%d %H:%M:%S')        elif isinstance(obj, date):            return obj.strftime('%Y-%m-%d')        return json.JSONEncoder.default(self, obj)json_data = {'num': 1, 'date': datetime.now()}print(json.dumps(json_data, cls=DateTimeEncoder))

对于自定义的对象,我们也可以通过继承JSONEncoder类实现它的序列化,如下所示:

import jsonclass User(object):    def __init__(self, name):        self.name = nameclass MyJSONEncoder(json.JSONEncoder):    def default(self, obj):        d = {}        d['__class__'] = obj.__class__.__name__        d['__module__'] = obj.__module__        d.update(obj.__dict__)        return duser = User("John")json.dumps(user, cls=MyJSONEncoder))

对于简单的数据序列化,方案一更容易理解,代码也更少。但当需要传输的数据很大时,使用继承JSONEncoder类来实现序列化时有个很大的好处,就是可以通过iterencode()方法把一个很大的数据对象分多次进行序列化,这对于网络持续传输或写入大的文件非常有用。如下所示。

>>> for chunk in MyJSONEncoder().iterencode(big_object):...     print(chunk)

DjanGo特有数据类型序列化

Django编程就是是python编程,以上所介绍的序列化方法对django也是适用的。不同的是Django还有自己专属的数据类型比如QuerySet和ValueQuerySet类型数据,还提供了更便捷的serializers类。使用serializers类可以轻易将QuerySet格式的数据转化为json格式。

# Django Queryset数据 to Jsonfrom django.core import serializersdata = serializers.serialize("json", SomeModel.objects.all())data1 = serializers.serialize("json", SomeModel.objects.all(), fields=('name','id'))data2 = serializers.serialize("json", SomeModel.objects.filter(field = some_value))

有时候我们只需要查询结果集的部分字段,可以使用values('字段名','字段名2')来要求返回的是哪些列的数据.但是返回来的是ValuesQuerySet对象而不是QuerySet对象。ValuesQuerySet对象不能用 serializers.serialize() 方法序列化成json, 需要先转换成list再用 json.dumps()方法序列化成json格式。示例代码如下所示:

import jsonfrom django.core.serializers.json import DjangoJSONEncoderqueryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')data4 = json.dumps(list(queryset), cls=DjangoJSONEncoder)

django-rest-framework

如果你要利用django开发restful的web API, 为不同客户端提供序列化过的json格式数据,django-rest-framework才是你真正需要的序列化工具。与django自带的serializers类相比,rest framework支持用户验证,查询过滤和符合restful规范的url设计,我们后面会专门介绍。欢迎关注我的微信。

关于“Python怎么把不同类型数据的json序列化”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Python怎么把不同类型数据的json序列化

本文链接: https://lsjlt.com/news/275622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python怎么把不同类型数据的json序列化
    这篇文章将为大家详细讲解有关Python怎么把不同类型数据的json序列化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型...
    99+
    2023-06-14
  • Python如何把不同类型数据的json序列化
    现代网络应用Web APP或大型网站的后台一般只有一个,然后客户端却是各种各样的(iOS, android, 浏览器), 而且客户端的开发语言很可能与后台的开发语言不一样。这时我们需要后...
    99+
    2022-06-02
    python json序列化 python 数据序列化
  • python Json与pickle数据序列化
    在程序运行的过程中,所有的变量都是在内存中。一旦程序结束,变量所占用的内存就被操作系统全部回收。为了避免数据丢失,把变量从内存中变成可存储或传输的过程称之为序列化序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过...
    99+
    2023-01-30
    序列化 数据 python
  • Python数据类型-序列sequence
    目录1概述2基本操作2.1索引 2.2切片 2.3加 2.4乘1 概述 在前面,我们已经对Python学习做了系统的知识梳理(Python思维导图),我...
    99+
    2024-04-02
  • python序列化json数据的方法是什么
    这篇“python序列化json数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python序列化json数据...
    99+
    2023-06-27
  • python序列数据类型之序列数据的基本操作
      1. 序列的长度、最大值、最小值、求和  通过内置函数len()、max() .minO可以获取序列的长度、序列中元索的最大值、序列中元素的最小值。通过内置函数sum()可以获取列表或元组中的各元素之和:如果有非数值元索,则导致TyeE...
    99+
    2023-06-02
  • golang函数类型的序列化与反序列化
    golang 函数类型可通过 encoding/gob 包实现序列化和反序列化。序列化:注册自定义类型并使用 gob.newencoder 将函数类型编码为字节数组。反序列化:使用 go...
    99+
    2024-04-29
    golang 序列化
  • 怎么在python中序列化JSON
    今天就跟大家聊聊有关怎么在python中序列化JSON,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比...
    99+
    2023-06-14
  • 在Python中怎么将类对象序列化为JSON
    本文小编为大家详细介绍“在Python中怎么将类对象序列化为JSON”,内容详细,步骤清晰,细节处理妥当,希望这篇“在Python中怎么将类对象序列化为JSON”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. ...
    99+
    2023-06-29
  • Python语言中的数据类型-序列
    目录一、什么是序列数据类型?二、序列数据类型的基本操作1.序列的通用方法2.通过索引访问数据3.同类型的序列进行拼接4.判断序列成员5.序列的排序操作6.内置函数all()与any(...
    99+
    2024-04-02
  • python对象序列化和反序列化有什么不同
    Python对象序列化和反序列化是将Python对象转换为可存储或传输的格式,以及将存储或传输的数据重新转换为Python对象的过程...
    99+
    2023-09-13
    python
  • 详解Python之数据序列化(json、pickle、shelve)
    一、前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样。很多时候我们会有这样的需求: 把内存中的各种数据类型的...
    99+
    2022-06-04
    详解 序列化 数据
  • C#怎么打印不同的数据类型
    这篇文章主要介绍“C#怎么打印不同的数据类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#怎么打印不同的数据类型”文章能帮助大家解决问题。下面的实例演示了几个相同的函数 print()...
    99+
    2023-06-17
  • 怎么使用JSON进行Redis数据序列化
    Redis本身不支持直接使用JSON进行数据序列化,但可以通过以下方式来实现: 将数据转换为JSON格式:在写入Redis时,将...
    99+
    2024-04-29
    Redis JSON
  • C#怎么把不同值的类型转换为字符串类型
    本文小编为大家详细介绍“C#怎么把不同值的类型转换为字符串类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么把不同值的类型转换为字符串类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实例namespa...
    99+
    2023-06-17
  • JSON序列化导致Long类型被搞成Integer怎么解决
    本篇内容主要讲解“JSON序列化导致Long类型被搞成Integer怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JSON序列化导致Long类型被搞成Integer怎么解决”吧!JSON...
    99+
    2023-06-26
  • php怎么将json数据转化为数组类型
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,可以利用json_decode()函数来将json数据转为数组类型。json_decode()函数可以将JSON编码的字符串转换为适当的PHP数据类型。默认...
    99+
    2020-10-13
    php json数据 数组类型
  • HTML在有序列表中不同类型的列表项怎么标记
    本篇内容介绍了“HTML在有序列表中不同类型的列表项怎么标记”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • Python中的实时数据类型与其他数据类型有何不同?
    Python是一种强大的编程语言,它支持多种数据类型。其中,实时数据类型是Python中的一种特殊类型,与其他数据类型有着明显的不同。在本文中,我们将探讨Python中的实时数据类型和其他数据类型的区别,并演示一些实用的代码示例。 实时数...
    99+
    2023-10-23
    对象 实时 数据类型
  • python函数怎么接收不同类型的参数
    本文小编为大家详细介绍“python函数怎么接收不同类型的参数”,内容详细,步骤清晰,细节处理妥当,希望这篇“python函数怎么接收不同类型的参数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。说明在定义函数时,...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作