吞茶嚼花 发表于 2020-4-7 00:10

python调用接口的时候返回两种类型的值

小白一枚 最近用 git 上的一个接口   requests.post弄了个学习通自动签到的 但是接口返回的数据有时候不一样 好像是随机的
[{"name":"test","date":"04-06 10:10","status":"success"}]

{'name': 'test', 'date': '2020-04-06 20:59:51', 'status': '学生端-签到成功'}

试过 json.loads 和 r.json 都没办法将 r[‘status’]的内容提取出来 总是报错 求教

xiaoaiai2468 发表于 2020-4-7 00:21

那就换个方法,用取文本中间来取出来

52loli 发表于 2020-4-7 01:40

实在不行你就正则

xyx0826 发表于 2020-4-7 05:08


import json
from json import JSONDecodeError

# 列表 JSON
JSON_LIST = "[{\"name\":\"test\",\"date\":\"04-06 10:10\",\"status\":\"success\"}]"
# 对象 JSON
JSON_OBJ= "{'name': 'test', 'date': '2020-04-06 20:59:51', 'status': '学生端-签到成功'}"

def parse(s):
    try:
      # 加载JSON
      j = json.loads(s)
    except JSONDecodeError:
      # JSON格式非法,把单引号换成双引号
      j = json.loads(s.replace("\'", "\""))
   
    if isinstance(j, list):
      # JSON是列表
      for obj in j:
            print(f"status = {obj['status']}")
    else:
      # JSON是单个对象
      print(f"status = {j['status']}")

parse(JSON_LIST)
parse(JSON_OBJ)


输出:

status = success
status = 学生端-签到成功


这两个JSON的区别:
- 第一个JSON里的对象被包在一对方括号里,意味着这是一个列表,里面可能有不止一个对象。
- 第二个JSON没有方括号,是单个对象。
- 不同于第一个JSON,第二个JSON用了单引号而不是双引号,所以它的格式其实是非法的。这就是为什么 json.loads() 会抛 JSONDecodeError 错误。

解法:
- 先加载JSON,如果单引号报错就把单引号全换成双引号。
- 判断加载返回的对象类型,如果是 list 列表就遍历,如果是单个对象就直接返回。

吞茶嚼花 发表于 2020-4-7 09:11

xiaoaiai2468 发表于 2020-4-7 00:21
那就换个方法,用取文本中间来取出来

返回类型有两种…我不懂咋转换

吞茶嚼花 发表于 2020-4-7 09:12

52loli 发表于 2020-4-7 01:40
实在不行你就正则

request返回的两种类型 类型转换不会…我试过这样不行

吞茶嚼花 发表于 2020-4-7 09:13

xyx0826 发表于 2020-4-7 05:08

import json
from json import JSONDecodeError


感谢!我试试看

吞茶嚼花 发表于 2020-4-7 09:53

xyx0826 发表于 2020-4-7 05:08

import json
from json import JSONDecodeError


成功了!折磨我好久的问题终于解决了 但是今天评分没有了 明天再给你!{:301_978:}
页: [1]
查看完整版本: python调用接口的时候返回两种类型的值