大家好,又见面了,我是你们的朋友全栈君。
一 JSON数据结构
要把json与字典区分开来 dumps(字典转换成Json) loads(Json转换成字典)
Python 的字典是一种数据结构,JSON 是一种数据格式。
json 就是一个根据某种约定格式编写的纯字符串,不具备任何数据结构的特征。而 python 的字典的字符串表现形式的规则看上去和 json 类似,但是字典本身是一个完整的数据结构,实现了一切自身该有的算法。
Python的字典key可以是任意可hash对象,json只能是字符串。
形式上有些相像,但JSON是纯文本的,无法直接操作。
1.python dict 字符串用单引号,json强制规定双引号。 2.python dict 里可以嵌套tuple,json里只有array。 json.dumps({1:2}) 的结果是 {”1″:2}; json.dumps((1,2)) 的结果是[1,2] 3.json key name 必须是字符串, python 是hashable, {(1,2):1} 在python里是合法的,因为tuple是hashable type;{[1,2]:1} 在python里TypeError: unhashable “list” 4.json: true false null ; python:True False None
python {“me”: “我”} 是合法的; json 必须是 {“me”: “u6211”}
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
官方文档:http://docs.python.org/library/json.html
Json在线解析网站:http://www.json.cn/#
Python中的Json模块
导入json即可开始使用:import json
json模块提供了四个功能:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。
1.json.loads()
代码语言:javascript复制Json -> Python字典
import json
strList = '[1, 2, 3, 4]'
strDict = '{"city": "北京", "name": "大猫"}'
json.loads(strList)
# [1, 2, 3, 4]
json.loads(strDict) # json数据自动按Unicode存储
# {u'city': u'u5317u4eac', u'name': u'u5927u732b'}
2.json.dumps()
代码语言:javascript复制Python字典 -> Json
import json
import chardet
listStr = [1, 2, 3, 4]
tupleStr = (1, 2, 3, 4)
dictStr = {"city": "北京", "name": "大猫"}
json.dumps(listStr)
# '[1, 2, 3, 4]'
json.dumps(tupleStr)
# '[1, 2, 3, 4]'
# 注意:json.dumps() 序列化时默认使用的ascii编码
# 添加参数 ensure_ascii=False 禁用ascii编码,按utf-8编码
# chardet.detect()返回字典, 其中confidence是检测精确度
json.dumps(dictStr)
# '{"city": "\u5317\u4eac", "name": "\u5927\u5218"}'
chardet.detect(str(json.dumps(dictStr)).encode())
# {'confidence': 1.0, 'encoding': 'ascii'}
print(json.dumps(dictStr, ensure_ascii=False))
# {"city": "北京", "name": "大刘"}
chardet.detect(json.dumps(dictStr, ensure_ascii=False))
# {'confidence': 0.99, 'encoding': 'utf-8'}
3.json.dump()
代码语言:javascript复制将Python内置类型序列化为json对象后写入文件
import json
listStr = [{"city": "北京"}, {"name": "大刘"}]
json.dump(listStr, open("listStr.json","w"), ensure_ascii=False)
dictStr = {"city": "北京", "name": "大刘"}
json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)
4.json.load()
代码语言:javascript复制读取文件中json形式的字符串元素 转化成python类型
import json
strList = json.load(open("listStr.json"))
print(strList)
# [{u'city': u'u5317u4eac'}, {u'name': u'u5927u5218'}]
strDict = json.load(open("dictStr.json"))
print(strDict)
# {u'city': u'u5317u4eac', u'name': u'u5927u5218'}
二 Flask jsonify函数
简单,快速是Flask自带的模块 功能类似于json.dumps(),但是会把返回的Content-Type
从text/html
转换成带json特征的 application/json
Response在Flask框架中是一个类,return 结果给Flask的时候,他会判断结果的类型,如果是string,就当字符串封装为Response放回。 如果是jsonify会被直接转化为json类型的Response对象返回,并且回复头显示application/json类型
使用演示
打印jsonify内的数据:
from flask import jsonify
from flask import Flask
app=Flask(__name__)
with app.app_context():
aaa={
"a":1,
"b":2,
"c":[3,4,5]
}
response_obj=jsonify(aaa) #
print(type(response_obj)) #flask.wrappers.Response
print(response_obj.data) #打印数据
print(response_obj.content_type) #打印内容类型
print(response_obj.status) #状态码及状态(字符串)
print(response_obj.status_code) #状态码 (int类型)
print(response_obj.is_json) #是否是json (bool类型)
demo:
python的flask框架为用户提供了直接返回包含json格式数据响应的方法,即jsonify,在开发中会经常用到。如下一段简单的flask后端代码,服务端视图函数根据请求参数返回json格式的数据到客户端。
- from flask import Flask
- from flask import jsonify
- from flask import Response
- app = Flask(__name__)
- @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])
- def hello(name,words):
- return jsonify({‘name’:name,’words’:words})#也可以传入key=value形式的参数,如jsonify(name=name,words=words)
- if __name__ == ‘__main__’:
- app.run()
用chrome浏览器访问得到的页面如下图:
现在我们改为使用python自带的json库json.dumps作为视图函数的直接返回值,代码如下:
- from flask import Flask
- from flask import jsonify
- from flask import Response
- app = Flask(__name__)
- @app.route(‘/hello/<name>/<words>’,methods=[‘GET’])
- def hello(name,words):
- return json.dumps({‘name’:name,’words’:words})
- if __name__ == ‘__main__’:
- app.run()
PS:直接返回json.dumps的结果是可行的,因为flask会判断并使用make_response方法自动构造出响应,只不过响应头各个字段是默认的。若要自定义响应字段,则可以使用make_response或Response自行构造响应。用chrome访问的响应页面如下图。
总结:从上面可以看出:两者似乎只是Content-Type发生了变化。由此可以推测出jsonify(application/json)<==>修改返回头后的json.dump(text/html)
参考:https://blog.csdn.net/kun1280437633/article/details/80377734
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142462.html原文链接:https://javaforall.cn