欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python -- json 模块学习

程序员文章站 2024-02-03 10:14:10
...

JavaScript Object Notation,是一种  轻量级、跨平台、跨语言  的数据交换格式。广泛运用在各种语言的数据交换中。

JSON主要有两种数据结构:

   1、由key--value对组成的数据结构。这种数据结构在不同的语言中有不同的实现,在python 中就是对应的字典。

   2、有序集合、这种数据结构在不同语言中可能有list、vertor、数组和序列等实现。

 

JSON语法创建对象更像一种Map结构,它是一种由key-value对组成数据结构。

语法格式如下:

Student = {

      Name:’redarmy_chen’,
      ……
      Sex:’男’      --------- 注意:最后一个不加逗号,加了则报错。

           }

备注:使用JSON语法创建对象时,属性不仅可是普通的字符,而且可以是任何基本数据类型,还可以是函数,数组,甚至是另外一个用JSON语法创建的对象.

Teacher = {

       Name:’redarmy’,
       Student:{
             Name:’m_j’,
             Sex:’男’ 
               }


      //使用JSON为teacher对象分配一个方法
      toString:function(){
        alert(“方法的测试…….”);
                         }
          }

 用于创建数组的语法:类似于 list 。

var a=new Array();    --- 使用创建数组对象的方法: 先创建一个对象
a[0]="chenc"
a[1]="hahah"


var a=new Array("chenc","hahah");  --- 创建对象的时候直接赋值

var a=["chenc","hahah"];  ---- 使用 json 语法来创建数组
JSON 类型转换 Python 类型的对应关系
JSON 对象 Python 类型
对象(object) 字典
数组(array) list
字符串(string) 字符串(str)
整数(number(int)) 整数(int)
实数(number(real)) 浮点数(float)
true True
false False
null None
import json
print(dir(json))
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder' 'decoder',  'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']

看看参数: 了解一下。

dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):

load(fp, *, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):



dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):    ---  与 dump 参数一致。 

loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): -- 与 load 参数一致。

看看简单的应用场景:

import json
dic={'name':'alvin','age':23,'sex':'male'}
data=json.dumps(dic,sort_keys=True,indent=4)   # 对 key 进行排序,并缩进
print(data,type(data))

# {
#     "age": 23,
#     "name": "alvin",
#     "sex": "male"
# } <class 'str'>

print(json.loads(data),type(json.loads(data)))   # {'name': 'alvin', 'age': 23, 'sex': 'male'} <class 'dict'>
data=json.JSONEncoder().encode(dic)
print(data)   # {"name": "alvin", "age": 23, "sex": "male"}

实际上,dump 和 dumps 函数的功能和支持的选项都一致,只是后者直接返回 JSON 字符串,前者将字符串直接输出到文件中

其实,程序的 dump 和 dumps 都是调用 json.JSONEncoder 对象的 encode()方法。只是前者更简单高级,但是可说明我们可以对 JSONEncoder 类进行扩展,因为 python 有很多的数据类型 JSON 是不支持的,比如:复数,矩阵等。

import json
class ComplexEncoder(json.JSONEncoder):  # 定义 JSONEncoder 的子类
    def default(self, o):
        if isinstance(o,complex):  # 如果转换的类型是复数类型,由他负责的。
            return {"__complex__":'true','real':o.real,'imag':o.imag}  # 返回复数的 JSON 对象
        return json.JSONEncoder.default(self,o)
        
s1=json.dumps(2+3j,cls=ComplexEncoder)  # 通过 cls 属性指定使用 JSONEncoder 的自定义子类
s2=ComplexEncoder().encode(2+3j)
print(s1)
print(s2)
# {"__complex__": "true", "real": 2.0, "imag": 3.0}
# {"__complex__": "true", "real": 2.0, "imag": 3.0}