006 python接口 json
/* 时间:2018/09/22 功能:session 目录: 一: 转换
1 作用 2 对应表 3 举例 4 结论 二: 相互转换 1 python - json 2 json - python 三: 三者关系: dict json str 1 dict <-> json 2 dict <-> str 3 str <-> json 四: 应用: 1 登录禅道 2 提取数据 - 自解析 3 提取数据 - requests解析 五: Error: 1 2 */
一: 转换
1 作用
1 python某种数据格式的数据 -> Json格式 -> Java或其他语言的某种数据格式的数据 2 A语言数据的数据 -> Json格式 -> B语言数据的数据 3 这时候就可以使用java或B语言,对数据进行操作。
2 对应表
JSON Python object dict array list string str number(int) int number(real) float true True false False null None dict object(str) list/tuple array str/unicode string int/long/float number
3 举例
python int -> Json number(int)
# coding:utf-8 import json pyNum = 123 print(pyNum) print(type(pyNum)) jsnNum = json.dumps(pyNum) # 数据转换 : python - json print(jsnNum) print(type(jsnNum))
123 <class 'int'> 123 <class 'str'>
python None -> Json null
# coding:utf-8 import json pyNone = None print(pyNone) print(type(pyNone)) jsNull = json.dumps(pyNone) print(jsNull) print(type(jsNull))
None <class 'NoneType'> null <class 'str'>
python False -> Json false
# coding:utf-8 import json pyFalse = False print(pyFalse) print(type(pyFalse)) jsFalse = json.dumps(pyFalse) print(jsFalse) print(type(jsFalse))
False <class 'bool'> false <class 'str'>
python str -> Json string
# coding:utf-8 import json pyString = "String" print(pyString) print(type(pyString)) jsString = json.dumps(pyString) print(jsString) print(type(jsString))
String <class 'str'> "String" <class 'str'>
python list -> Json array
# coding:utf-8 import json pyList = [None, 123, "asd", False] print(pyList) print(type(pyList)) jsList = json.dumps(pyList) print(jsList) print(type(jsList))
[None, 123, 'asd', False] <class 'list'> [null, 123, "asd", false] <class 'str'>
python dict -> Json object
# coding:utf-8 import json pyDict = { 123: 123, True: True, None: None, "string": 'string', "tuple": (1, "tuple"), "list": [1, 1.1, "str"] } print(pyDict) print(type(pyDict)) jsDict = json.dumps(pyDict) print(jsDict) print(type(jsDict))
{123: 123, True: True, None: None, 'string': 'string', 'tuple': (1, 'tuple'), 'list': [1, 1.1, 'str']} <class 'dict'> {"123": 123, "true": true, "null": null, "string": "string", "tuple": [1, "tuple"], "list": [1, 1.1, "str"]} <class 'str'>
4 结论:
所有json格式都是字符串
二: 相互转换
1 python - json
# coding:utf-8 import json pDict = { 123: 123, True: True, None: None, "string": 'string', "tuple": (1, "tuple"), "list": [1, 1.1, "str"] } print(pDict) print(type(pDict)) jDict = json.dumps(pDict) print(jDict) print(type(jDict))
{123: 123, True: True, None: None, 'string': 'string', 'tuple': (1, 'tuple'), 'list': [1, 1.1, 'str']} <class 'dict'> {"123": 123, "true": true, "null": null, "string": "string", "tuple": [1, "tuple"], "list": [1, 1.1, "str"]} <class 'str'>
2 json - python
# coding:utf-8 import json jsDict = '{"123": 123, "true": true, "null": null, "string": "string", "tuple": [1, "tuple"], "list": [1, 1.1, "str"]}' print(jsDict) print(type(jsDict)) pyDict = json.loads(jsDict) print(pyDict) print(type(pyDict))
{"123": 123, "true": true, "null": null, "string": "string", "tuple": [1, "tuple"], "list": [1, 1.1, "str"]} <class 'str'> {'123': 123, 'true': True, 'null': None, 'string': 'string', 'tuple': [1, 'tuple'], 'list': [1, 1.1, 'str']} <class 'dict'>
三: 三者关系 dict json str
1 dict <-> json
# dict <-> json dict -> json: json.dumps dict <- json: json.loads
2 dict <-> str
# dict <-> str dict -> str: str() dict <- str: eval()
dict -> str
# coding:utf-8 import json a = {"a": True, "b": None} print(a) print(type(a)) str = str(a) print(str) print(type(str))
{'a': True, 'b': None} <class 'dict'> {'a': True, 'b': None} <class 'str'>
dict <- str
# coding:utf-8 import json b = "{'a': True, 'b': None}" # python标准dict格式字符串 print(b) print(type(b)) c = eval(b) print(c) print(type(c))
{'a': True, 'b': None} <class 'str'> {'a': True, 'b': None} <class 'dict'>
3 str <-> json
# str <-> json str -> json: 格式是字符串、内容是字典、类型是json str <- json: 等价于
str -> json
# coding:utf-8 import json b = '{"a": null, "b": true}' # 格式是<class 'str'>, 内容是<class 'dict'>,类型是json; json就是特定格式的字符串 py_Dict = json.loads(b) print(py_Dict) print(type(py_Dict))
{'a': None, 'b': True} <class 'dict'>
error
# coding:utf-8 b = '{"a": Null, "b": true}' # 改变: null - Null. json只有null。 py_Dict = json.loads(b) print(py_Dict) print(type(py_Dict))
NameError: name 'json' is not defined
四: 应用:
1
# coding:utf-8 import requests import json import urllib3 urllib3.disable_warnings() # 忽略警告 # 禅道登录 url = "http://127.0.0.1/zentao/user-login.html" body = { "account": "admin", "password": "123456", "keepLogin[]": "on", "referer": "/zentao/my.html" } r = requests.post(url, data = body) print(r.status_code) print(r.content.decode("utf-8"))
200 <!DOCTYPE html> <html lang='zh-cn'> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name="renderer" content="webkit"> <title>用户登录 - 禅道</title> ...
2 提取数据 - 自解析
# coding:utf-8 import requests import json url = "http://japi.juhe.cn/qqevaluate/qq" par = { "key": "xxxxxxxxxx", # appkey需要注册申请 "qq": "xxxxxxxxxx" # qq号码 } r = requests.get(url, params=par) print(r.text) # 类型转换: 方法一 pyDictResult = eval(r.text) # 类型转换 : 字符串 -> 字典 print(type(pyDictResult)) # 类型转换: 方法二 # pyDictResult = json.loads(r.text) # 类型转换 : json -> 字典 # print(type(pyDictResult)) print(pyDictResult["reason"]) print(pyDictResult["result"]["data"]["conclusion"])
{"error_code":0,"reason":"success","result":{"data":{"conclusion":"[凶]虽倾全力,难望成功,此数大凶,最好改名","analysis":"即使全力以赴,却没有取得成功。导致失败的原因是现时的待人处事方式有问题,要改变这个现状,要自我反省,改变一些令人厌恶的恶习,方可取得成功。"}}} <class 'dict'> success [凶]虽倾全力,难望成功,此数大凶,最好改名
3 提取数据 - requests解析
# coding:utf-8 import requests url = "http://japi.juhe.cn/qqevaluate/qq" par = { "key": "xxxxxxxxxx", # appkey需要注册申请 "qq": "xxxxxxxxxx" # qq号码 } r = requests.get(url, params=par) print(r.text) pyDictResult = r.json() # requests自带json解析器 print(pyDictResult["reason"]) print(pyDictResult["result"]["data"]["conclusion"])
{"error_code":0,"reason":"success","result":{"data":{"conclusion":"[凶]虽倾全力,难望成功,此数大凶,最好改名","analysis":"即使全力以赴,却没有取得成功。导致失败的原因是现时的待人处事方式有问题,要改变这个现状,要自我反省,改变一些令人厌恶的恶习,方可取得成功。"}}} success [凶]虽倾全力,难望成功,此数大凶,最好改名
五: Error:
1
AttributeError: module 'json' has no attribute 'dumps' 原因: 文件夹或者文件的名字叫json, 和模块json名称冲突
2
# coding:utf-8 import json js_list = "[{'a': true, 'b': null}]" py_list = json.loads(js_list) print(py_list)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
修改: js_list = '[{"a": true, "b": null}]'