flask中jsonify和json.dumps的区别「建议收藏」

flask中jsonify和json.dumps的区别「建议收藏」flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而…

大家好,又见面了,我是你们的朋友全栈君。

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kun1280437633/article/details/80377734

flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象,那么在flask的视图函数中return它们会有什么不同之处呢?想必开始很多人和我一样搞不清楚,只知道既然框架提供了方法就用,肯定不会错。但作为开发人员,我们需要弄清楚开发过程中各种实现方式的特点和区别,这样在我们面对不同的需求时才能做出相对合理的选择,而不是千篇一律地使用自己熟悉的。下面我就jsonify和json.dumps的区别这一问题简单探讨一下。

demo:

python的flask框架为用户提供了直接返回包含json格式数据响应的方法,即jsonify,在开发中会经常用到。如下一段简单的flask后端代码,服务端视图函数根据请求参数返回json格式的数据到客户端。

code:

[python] 
view plain  
copy

  1. from flask import Flask  
  2. from flask import jsonify  
  3. from flask import Response  
  4.   
  5.   
  6. app = Flask(__name__)  
  7.  
  8.  
  9. @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])  
  10. def hello(name,words):  
  11.     return jsonify({
    ‘name’:name,‘words’:words})#也可以传入key=value形式的参数,如jsonify(name=name,words=words)  
  12.   
  13.   
  14. if __name__ == ‘__main__’:  
  15.     app.run()  


用chrome浏览器访问得到的页面如下图:

flask中jsonify和json.dumps的区别「建议收藏」

flask中jsonify和json.dumps的区别「建议收藏」flask中jsonify和json.dumps的区别「建议收藏」

flask中jsonify和json.dumps的区别「建议收藏」

现在我们改为使用python自带的json库json.dumps作为视图函数的直接返回值,代码如下:

code:

[python] 
view plain  
copy

  1. from flask import Flask  
  2. from flask import jsonify  
  3. from flask import Response  
  4.   
  5.   
  6. app = Flask(__name__)  
  7.  
  8.  
  9. @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])  
  10. def hello(name,words):  
  11.     return json.dumps({
    ‘name’:name,‘words’:words})  
  12.   
  13.   
  14. if __name__ == ‘__main__’:  
  15.     app.run()  




PS:直接返回json.dumps的结果是可行的,因为flask会判断并使用make_response方法自动构造出响应,只不过响应头各个字段是默认的。若要自定义响应字段,则可以使用make_response或Response自行构造响应。用chrome访问的响应页面如下图。

flask中jsonify和json.dumps的区别「建议收藏」

flask中jsonify和json.dumps的区别「建议收藏」

flask中jsonify和json.dumps的区别「建议收藏」flask中jsonify和json.dumps的区别「建议收藏」

结论

1.Content-Type有区别

jsonify的作用实际上就是将我们传入的json形式数据序列化成为json字符串,作为响应的body,并且设置响应的Content-Type为application/json,构造出响应返回至客户端。jsonify的部分源码如下:

[python] 
view plain  
copy

  1. def jsonify(*args, **kwargs):  
  2.     if __debug__:  
  3.         _assert_have_json()  
  4.     return current_app.response_class(json.dumps(dict(*args, **kwargs),  
  5.         indent=None if request.is_xhr else 2), mimetype=‘application/json’)  




可以看出jsonify实际上也是使用了json.dumps来序列化json形式的数据,作为响应正文返回。indent表示json格式化的缩进,若是Ajax请求则不缩进(因为一般Ajax数据没必要直接展示),否则缩进2格。但想必从第一部分的实验结果我们已经看出来了,使用jsonify时响应的Content-Type字段值为application/json,而使用json.dumps时该字段值为text/html。Content-Type决定了接收数据的一方如何看待数据,如何处理数据,如果是application/json,则可以直接当做json对象处理,若是text/html,则还要将文本对象转化为json对象再做处理(个人理解,有误请指正)。

2.接受参数有区别

jsonify可以接受和python中的dict构造器同样的参数,如下图。

flask中jsonify和json.dumps的区别「建议收藏」flask中jsonify和json.dumps的区别「建议收藏」

而json.dumps比jsonify可以多接受list类型和一些其他类型的参数。但我试了一下,形式为key1=value1,[key2=value2,…]这样的参数是不行的,会报出“TypeError: dumps() takes exactly 1 argument (0 given)”这一错误,而jsonify不会报错并能正常返回数据。

最后,我们可以使用flask中的make_response方法或者直接通过Response类,通过设置mimetype参数来达到和使用jsonify差不多的效果,但少写点代码何乐而不为呢?况且简洁一点更不容易出错,参数越多调试和维护就越麻烦。当然,使用哪个并不是绝对的,必要时要根据前端的数据处理方式来决定。

 json 模块4个方法
    json.loads() 把 json 字符串 转成 python 数据类型
    json.load(python数据类型,文件句柄) 把 json 文件 转成 python 数据类型
    json.dumps() 把 python 数据类型 转成 json 字符串
    json.dump(文件句柄) 把 python 数据类型 写入到 json 文件中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142487.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++智能指针「建议收藏」

    C++智能指针「建议收藏」一、基础知识介绍二、不带引用计数的智能指针三、带引用计数的智能指针四、shared_ptr和weak_ptr五、多线程访问共享对象的线程安全问题六、自定义删除器

    2022年6月20日
    51
  • Codecs模块[通俗易懂]

    Codecs模块这篇文章主要介绍了python自然语言编码转换模块codecs介绍,codecs专门用作编码转换,通过它的接口是可以扩展到其他关于代码方面的转换,需要的朋友可以参考下。常用说法:decode->unicode(内部编码格式)encode->其他编码格式解码(decode)成内部编码格式unicode,编码(encode)成其他格式。python对多国

    2022年4月15日
    186
  • ADRC例程

    ADRC例程ADRC优化fhan《自抗扰控制入门》自抗扰死忠粉ADRC.H#ifndef_ADRC_H_#define_ADRC_H_typedefstruct{/*****安排过度过程*******/floatx1;//跟踪微分期状态量floatx2;//跟踪微分期状态量微分项floatr;//时间尺度floath;//ADRC系统积分时间uint16N0;/…

    2022年5月12日
    75
  • SpringBoot的序列化和反序列化

    SpringBoot的序列化和反序列化序列化与反序列化1、认识序列化与反序列化Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程。2、为什么要实现对象的序列化和反序列化?(1)我们创建的Java对象被存储在Java堆中,当程序运行结束后,这些对象会被JVM回收。但在现实的应用中,可能会要求在程序运行结束之后还能读取这些对象,并在以后检索数据,这时就需要用到序列化。(2)当Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中进行传输,因此当把对象通过网络发送

    2022年6月25日
    237
  • java 进销存源代码_java swing开发毕业设计-进销存管理系统源代码下载[通俗易懂]

    java 进销存源代码_java swing开发毕业设计-进销存管理系统源代码下载[通俗易懂]项目描述现在看来很烂,见笑了,不过人还是得面对自己的过去,呵呵运行环境jdk7+sqlserver+IntelliJIDEA项目技术(必填)javaswing+jdbc数据库文件(可选)链接:https://pan.baidu.com/s/1Zc3nOIuJap0xyPYdLMSPHQ提取码:1h39依赖包文件(可选)lib目录下…

    2022年5月6日
    53
  • 硬核总结!真二叉树、满二叉树、完全二叉树的性质与概念

    硬核总结!真二叉树、满二叉树、完全二叉树的性质与概念树形结构这是我们最熟悉的线性结构,线性结构的数据简单来说就是一条线,串起来一个个的节点。那树形结构是怎样的呢?很明显,顾名思义,它是一棵树的样子。将这棵树进行180度大翻转,就成了数据结构中的树形结构了可以初步看出,二叉树就是每个节点要么没有分枝,要么就是分两根枝,而多叉树的每个节点可以有任意的分枝。生活中的树形结构文件夹的管理就是我们生活中最常见的树形结构…

    2022年5月31日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号