zoukankan      html  css  js  c++  java
  • python及Django的json序列化

    JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),人们很容易进行阅读和编写。python自带的dumps方法很有用,能很容易将字典dict类型数据转化为json格式,然后还有很多类型的数据(如日期,集合, 自定义的类和Django的QuerySet类型),我们需要自定义序列化方法才能将它们转化为json格式。

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

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

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

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

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

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

    json的loads方法用于将json格式数据转化为python格式

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

    很多python格式数据不能直接被dumps方法序列化,很多python数据类型(比如日期,集合和自定义的类)并不能直接被dumps方法序列化

    我们有两种解决方案。

    • 通过数据类型转换函数实现,我们不能直接序列化就先转化为json能接受的数据类型再序列化,obj —> str —> json.dumps —> json.loads —> str —> obj
    • 通过继承JSONEncoder和JSONDecoder类实现,在类中添加针对目标数据类型的序列化接解决方案

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

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

    Django有自己专属的数据类型比如QuerySet和ValueQuerySet类型数据,还提供了更便捷的serializers类。使用serializers类可以轻易将QuerySet格式的数据转化为json格式。

    # Django Queryset数据 to Json
    from django.core import serializers
    data = 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))
    

    ValuesQuerySet对象不能用 serializers.serialize() 方法序列化成json, 需要先转换成list再用 json.dumps()方法序列化成json格式。示例代码如下所示:

    import json
    from django.core.serializers.json import DjangoJSONEncoder
    
    queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
    data4 = json.dumps(list(queryset), cls=DjangoJSONEncoder)
    
  • 相关阅读:
    local 不能解析为127.0.0.1
    完全使用接口方式调用WCF 服务
    【人生】自己对于求职应聘的一些感受
    OO的经典例子
    剪刀、石头、布机器人比赛
    TextTree 文本资料收集轻量级工具
    两个代替重复输入的小工具
    桌面助手 Desktop Helper 自动帮你关闭指定的窗口
    磁盘可用空间平衡
    用C#制造可以继承的“枚举”
  • 原文地址:https://www.cnblogs.com/roygood/p/10152976.html
Copyright © 2011-2022 走看看