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}]'
原文地址:https://www.cnblogs.com/huafan/p/9693247.html