Python json的操作总结

 Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。现在也常用于http请求中,所以对json的各种学习,是自然而然的事情。Python的官网网址:https://docs.python.org/2/library/json.html?highlight=json#module-json

  Json API 使用:python在版本2.6之前,是需要先下载包,安装后才能使用的,有点类似现在的RF内使用SeleniumLibrary一样。但是在2.6中,官方文档(https://docs.python.org/2.6/whatsnew/2.6.html)明显指出,“有一些重要的新的软件包添加到了标准库,比如multiprocessing 和json,但是跟python 3比,2.6的这些包不会引进更多的新功能。"于是安装python2.6以上版本的童鞋,可以不需要下载json包,直接在所需的地方就import json 即可使用,在安装目录下的Lib 下,看到这两个包(点进去仔细阅读这些源码,会有更多的收获,)如下文所示:

           

  Python2.6 以上版本支持Json的编码和解码,支持python的大部分内置类型与Json进行转换。最简单的例子如下所示:

一、JSON 函数简介

使用 JSON 函数需要导入 json 库:import json。

1、json.dumps

     json.dumps :将 Python 对象编码成 JSON 字符串

语法

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

实际上就是对函数的参数的一个理解过程,下面列出几个常用的参数:

Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key

ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示

indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',',':');这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。

encoding:默认是UTF-8,设置json数据的编码方式。

sort_keys:将数据根据keys的值进行排序。

实例

以下实例将数组编码为 JSON 格式数据:

import json

data =[ {
    "name":"rxz",
    "age":29,
    "addr":"suzhou"
}
]
data_json = json.dumps(data)
print(data_json )
"""
[{"name": "rxz", "age": 29, "addr": "suzhou"}]
"""

使用参数让 JSON 数据格式化输出:

import json

data = [ { 'a' : 1, 'e' : 2, 'b' : 3, 'd' : 4, 'c' : 5 } ]

# 打开键值排序、缩进为 4、以',', ': '为分隔
data_json = json.dumps(data,sort_keys=True,indent=4,separators=(',', ': '))
print(data_json)

"""
[
    {
        "a": 1,
        "b": 3,
        "c": 5,
        "d": 4,
        "e": 2
    }
]
"""

常用的两个函数是dumps和dump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串:

dumps函数:

import json

dic1 = {'type':'dic1','username':'rxz','age':16}
json_dic1 = json.dumps(dic1)
print(json_dic1)

json_dic2 = json.dumps(dic1,sort_keys=True,indent =4,separators=(',', ': '),ensure_ascii=True )
print(json_dic2)

"""
{"type": "dic1", "username": "rxz", "age": 16}

{
    "age": 16,
    "type": "dic1",
    "username": "rxz"
}

"""

dump函数:

import json

# json.dump()函数的使用,将json信息写进文件
json_info = "{'age': '12''}"
file = open('1.json','w',encoding='utf-8')
json.dump(json_info,file)

2、json.loads

     json.loads :将已编码的 JSON 字符串解码为 Python 对象

语法

json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

实例

以下实例展示了Python 如何解码 JSON 对象:

import json


# json.loads函数的使用,将字符串转化为字典
json_info = '{"age": "12"}'
dict1 = json.loads(json_info)
print(dict1)

"""
{'age': '12'}

"""

 load函数

import json


# json.load()函数的使用,将读取json信息
file = open('1.json','r',encoding='utf-8')
info = json.load(file)
print(info)
"""
{'age': '12''}

Process finished with exit code 0
"""

python的一些基本类型通过encode之后,tuple类型就转成了list类型了,再将其转回为python对象时,list类型也并没有转回成tuple类型,而且编码格式也发生了变化,变成了Unicode编码。具体转化时,类型变化规则如下所示: 

Python-->Json

Json-->Python

Json处理中文问题:

    关于python字符串的处理问题,如果深入的研究下去,我觉得可以写2篇文章了(实际上自己还没整很明白),在这里主要还是总结下使用python2.7.11处理json数据的问题。前期做接口测试,处理最多的事情就是,把数据组装成各种协议的报文,然后发送出去。然后对返回的报文进行解析,后面就遇到将数据封装在json内嵌入在http的body内发送到web服务器,然后服务器处理完后,返回json数据结果的问题。在这里面就需要考虑json里有中文数据,怎么进行组装和怎么进行解析,以下是基础学习的一点总结:

    第一:Python 2.7.11的默认编码格式是ascii编码,而python3的已经是unicode,在学习编解码的时,有出现乱码的问题,也有出现list或者dictionary或者tuple类型内的中文显示为unicode的问题。出现乱码的时候,应该先看下当前字符编码格式是什么,再看下当前文件编码格式是什么,或者没有设置文件格式时,查看下IDE的默认编码格式是什么。最推崇的方式当然是每次编码,都对文件编码格式进行指定,如在文件前 设置# coding= utf-8。

   第二:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

   第三:将json数据转换成python数据后,一般会得到一个dict类型的变量,此时内部的数据都是unicode编码,所以中文的显示看着很痛苦,但是对于dict得到每个key的value后,中文就能正常显示了,如下所示:

# coding= utf-8
import json
import sys

if __name__ == '__main__':
    # 将python对象test转换json对象
    test = {"username":"中国人","age":16}
    print(type(test))
    python_to_json = json.dumps(test,ensure_ascii=False)
    print(python_to_json)
    print(type(python_to_json))

    # 将json对象转换成python对象
    json_to_python = json.loads(python_to_json)
    print(type(json_to_python))
    print(json_to_python['username'])
    
"""
<class 'dict'>
{"username": "中国人", "age": 16}
<class 'str'>
<class 'dict'>
中国人
"""
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值