zoukankan      html  css  js  c++  java
  • JSON类型解析

     

    序列化和反序列化

    程序中的对象,如Python中的字典、列表、函数、类等,都是存在内存中的,一旦断电就会消失,不方便传递或存储,所以我们需要将内存中的对象转化为文本或者文件格式,来满足传输和持久化(存储)需求

    • 序列化: 内存对象 -> 文本/文件
    • 反序列化: 文本 -> 内存对象

    对象在HTTP中的传输过程
    HTTP协议是超文本传输协议,是通过文本或二进制进行传输的,所以我们发送的请求要转化成文本进行传输,收到的响应也是文本格式,如果是JSON,一般还需要将文本格式重新转化为对象

    JSON对象(Python字典) -> 转为文本请求 -> 发送请求
    -> 服务器收到文本请求 -> 将文本请求转化为对象,获取其中的参数,处理业务
    -> 返回文本格式的响应 -> 客户端转为对象格式来从响应中取值

    JSON对象与Python字典的区别

    JSON对象是javascript object即javascript中的对象,是一种通用的格式,格式严格,不支持备注。

    JSON文本和JSON对象的区别:

    • JSON文本是符合JSON格式的文本,实际上是一个字符串
    • JSON对象是内存中一个对象,拥有属性和方法,可以通过对象获取其中的参数信息

    Python中我们一般提到JSON对象指的是字典

    Python的字典的格式和JSON格式,稍有不同:

    • 字典中的引号支持单引号和双引号,JSON格式只支持双引号
    • 字典中的True/False首字母大写,JSON格式为true/false
    • 字典中的空值为None, JSON格式为null

    JSON格式操作方法

    • 序列化(字典 -> 文本/文件句柄): json.dumps()/json.dump()
    • 反序列化(文本/文件句柄 -> 字典) : json.loads()/json.load()
    import json # 需要导入JSON包
    
    data = {'name': '张三', 'password': '123456', "male": True, "money": None} # 字典格式
    str_data = json.dumps(data) # 序列化,转化为合法的JSON文本(方便HTTP传输)
    print(str_data)
    

    输出:{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}

    json.dumps()支持将json文本格式化输出

    import requests 
    import json
    
    res = requests.post("http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=怎么又是你") 
    print(res.text) # 输出为一行文本
    res_dict = res.json() # 将响应转为json对象(字典)等同于`json.loads(res.text)`
    print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False)) # 重新转为文本
    

    看一下输出结果对比:

    {"code":100000,"text":"我才要说怎么又是你"}  # res.text,有些接口中文会返回为\u..
    {
      "code": 100000,
      "text": "我才要说怎么又是你"  # 树状格式,比较清晰,显示中文
    }
    
    • indent: 缩进空格数,indent=0输出为一行
    • sork_keys=True: 将json结果的key按ascii码排序
    • ensure_ascii=Fasle: 不确保ascii码,如果返回格式为utf-8包含中文,不转化为\u...

    反序列化

    import json
    
    res_text = {"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}  # JSON文本格式的响应信息
    res_dict = json.loads(res_text) # 转化为字典 
    print(res_dict['name'])  # 方便获取其中的参数值
    

    输出:张三

    文件的序列化与反序列化

    1. 序列化:字典 -> 文件句柄
    import json
    
    res_dict = {'name': '张三', 'password': '123456', "male": True, "money": None} # 字典格式
    f = open("demo1.json","w")
    json.dump(res_dict, f)
    

    查看同级目录,增加了一个demo1.json文件,内容为:

    {"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}
    
    1. 序列化: 文件句柄 -> 字典

    在项目中(和下面脚本文件同一路径下)新建demo2.json文件,内容如下,保存

    {
      "name": "张三",
      "password": "123456",
      "male": true,
      "money": null
    }
    

    新建Python文件

    import json
    
    f = open("demo.JSON","r", encoding="utf-8")  # 文件中有中文需要指定编码
    f_dict = json.load(f) # 反序列化将文件句柄转化为字典
    print(f['name']) # 读取其中参数
    f.close()
    

    什么时候使用JSON对象(字典)什么时候使用JSON文本?
    一般在组装data参数时,建议使用字典格式,发送请求时用json.dumps(data)转化为文本发送,收到请求后使用json.loads(res.text)转化为字典,方便我们获取其中的参数信息
    练习:

    1. 解析以下json格式文件,发送请求并打印响应

    注: method支持get和post,如果没有method,有data默认发post请求,没有data默认发get请求,type支持:form或json,没有默认发form格式
    demo1.json

    {
      "url": "http://www.tuling123.com/openapi/api",
      "method": "get",
      "params": {
        "key": "ec961279f453459b9248f0aeb6600bbe",
        "info": "你好"
      }
    }
    

    demo2.json

    {
      "url": "http://openapi.tuling123.com/openapi/api/v2",
      "method": "post",
      "type": "json",
      "data": {
        "reqType": 0,
        "perception": {
          "inputText": {
            "text": "附近的酒店"
          },
          "inputImage": {
            "url": "imageUrl"
          },
          "selfInfo": {
            "location": {
              "city": "北京",
              "province": "北京",
              "street": "信息路"
            }
          }
        },
        "userInfo": {
          "apiKey": "ec961279f453459b9248f0aeb6600bbe",
          "userId": "206379"
        }
      }
    }



    作者:韩志超
    链接:https://www.jianshu.com/p/e94a18950a53
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    edgecore
    十问 Linux 虚拟内存管理 (glibc)
    Covered Path
    Journey Planning
    K for the Price of One
    Candies!
    2种方式解决nginx负载下的Web API站点里swagger无法使用
    分布式环境下的数据一致性问题的方案讨论
    static,你还敢用吗?
    分离EF connectionString里的db连接串
  • 原文地址:https://www.cnblogs.com/liuyanhang/p/10471378.html
Copyright © 2011-2022 走看看