python~json学习总结

本文详细介绍了Python中json模块的使用,包括json的简介、语法、名称/值对、对象、数组、编码和解码。重点讲解了json.dumps()和json.loads()方法,以及如何将类对象编码和解码为JSON。同时还提供了示例代码,展示了如何设置参数以获得不同格式的JSON字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Python操作json

json简介

json语法与语法规则

json名称/值对

json对象

json数组

json编码

代码示例:

json.dumps():

将类对象编码成json串:

第一种方式:

第二种方式:

json解码

json.loads():

从json到Python的类型转化对照表

json反序列化为类对象


Python操作json

python的json模块序列化和反序列化分别是dumps和loads

json.dumps():将一个python对象编码成json串

json.loads():将json格式字符串解码成python对象

json简介

json全称:JavaScript Object Notation(JavaScript对象表示法)

json是存储和交换文本信息的语法;类似xml

json比xml更小、更快、更易解析。

json语法与语法规则

json语法:

json语法是JavaScript语法的子集

json语法规则:

数据在名称/值对中

数据由逗号分隔

花括号保存对象

方括号保存数组

json名称/值对

json数据的书写格式为:"firstName":"John"

json值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null

json对象

写在花括号中,对象可以包含多个名称/值对。比如:{"firstName":"John","lastName":"Doe"}

json数组

是在方括号中书写的,数组可以包含多个对象

{ "employees":

    [{"firstName":"John","lastName":"Doe"},

     {"firstName":"Peter","lastName":"Jones"}]

}

json编码

使用json.dumps()方法来将一个python数据类型列表编码成json格式的字符串。不过两种语言的类型会存在一些差异,对照表如下:

python数据类型    

json字符串类型

dict

object

list,tuple     

array (数组)

str

string

int,long,float

number

True

true

False

false

None

null

代码示例:

>>> import json

>>>data=[{"a":"A","b":(2,4),"C":3.0}]

>>> print ("data",data)

data [{'a': 'A', 'b': (2, 4), 'C': 3.0}]

>>> data_json=json.dumps(data)

>>> print (data_json)

[{"a": "A", "b": [2, 4], "C": 3.0}]



>>> a=[{1:12,"a":12.3},[1,2,3],(1,2),"asd",u"ad",12,2.5]

>>> print ("python类型:\n",a)

python类型:

 [{1: 12, 'a': 12.3}, [1, 2, 3], (1, 2), 'asd', 'ad', 12, 2.5]

>>> print ("编码后的json串:\n",json.dumps(a))

编码后的json串:

 [{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "asd", "ad", 12, 2.5]

json.dumps():

函数原型如下:(cmd窗口下help(json.dumps))

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)

该方法返回编码后的一个json字符串,是一个str对象encodejson。下面说明几个常用的参数

1.参数sort_keys:

是否按字典排序(a到z)输出。因为默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。

#代码示例:
import json


data=[{"b":3.9,"a":(2,3),"c":"ad"}]


print (json.dumps(data))  #sort_keys默认为False,不进行排序

print (json.dumps(data,sort_keys=True))   #sort_keys为True,进行升序,key必须是同类型

输出结果:

2.参数indent:

设置参数缩进显示的空格数。缩进显示使读起来更加清晰些

#代码示例:
import json


data=[{"b":3.9,"a":(2,3),"c":"ad"}]


print (json.dumps(data,sort_keys=True))

print (json.dumps(data,sort_keys=True,indent=3))

输出结果为:

3.参数separators:

作用是去掉逗号和分号后面的空格,对传输的json串进行压缩,使得传输的数据更加精简;

该参数是元组形式的

#代码示例:
import json


data=[{"b":3.9,"a":(2,3),"c":"ad"}]


print (json.dumps(data))

print (len(json.dumps(data)))

#去掉编码后的json串中 ,和:后面的空格,长度发生变化

print (json.dumps(data,separators=(",",":")))

print (len(json.dumps(data,separators=(",",":"))))   

输出结果为:

4.参数skipkeys:

在编码过程中,如果dict对象中的key不是(str,unicode,int,long,float,bool,None)的类型,就会抛出TypeError的异常,skipkeys可以跳过那些非string对象的key处理,就是不处理

#代码示例:
import json


data=[{"b":3.9,12:(2,3),"c":"ad",(1,23):"D tuple"}]

print ("不设置skipkeys参数")


try:

    res=json.dumps(data)   #默认skipkeys=False

except Exception as e:

    print (e)


print ("设置skipkeys参数")

print (json.dumps(data,skipkeys=True))

输出结果为:

5.参数ensure_ascii:

表示编码使用的字符集,默认是True,表示使用ascii码进行编码;如果设置为False,就会以unicode进行编码。由于解码json字符串时返回的就是Unicode字符串,所以可以直接操作Unicode字符,然后直接编码Unicode字符串,这样会简单些

#代码示例
>>> import json

>>> print (json.dumps("中国"))

"\u4e2d\u56fd"

>>> print (json.dumps("中国",ensure_ascii=False))

"中国"

将类对象编码成json串:

类不是一个可以直接序列化的对象,但我们可以使用dumps()函数中的default参数来实现。

第一种方式:

Employee类首先被obj_json 方法转换成dict,然后再被序列化为json

#代码示例
import json


class Employee(object):

    def __init__(self,name,age,sex,tel):

        self.name=name

        self.age=age

        self.sex=sex

        self.tel=tel


    def obj_json(self,obj_instance):

        return {

            "name":obj_instance.name,

            "age":obj_instance.age,

            "sex":obj_instance.sex,

            "tel":obj_instance.tel }


emp=Employee("gang",27,"male","1873060****")

print (json.dumps(emp,default=emp.obj_json))   

#print (json.dumps(emp.obj_json(emp)))   #或者是类的实例调用实例方法

输出结果为:

第二种方式:

通过__dict__属性,通常class及其实例都 会有一个__dict__属性(除非类中添加了__slots__属性),它是一个dict类型,存储的是类或类实例中有效的属性

#代码示例:
import json


class Employee(object):

    def __init__(self,name,age,sex,tel):

        self.name=name

        self.age=age

        self.sex=sex

        self.tel=tel


emp=Employee("gang",27,"male",18730603667)

print (emp.__dict__)

print (json.dumps(emp,default=lambda emp:emp.__dict__))

print (json.dumps(emp,default=lambda Employee:Employee.__dict__))

输出结果为:

json解码

json.loads():

将json格式字符串解码成python对象

#代码示例
import json


data=[{"b":3.9,12:(2,3),"c":"ad"}]


data_json=json.dumps(data)

print ("encoding:",data_json)

print ("decoding:",json.loads(data_json))

输出结果为:

从json到Python的类型转化对照表

json字符串类型

python数据类型

object

dict

array(数组)               

list

string            

unicode

number(int)       

int

number(real)      

float

true                         

True   

false                        

False  

null                 

None     

#代码示例
import json


data=[{"b":3.9,12:(2,3),"c":"ad"},[1,2,3],True,False,None]


data_json=json.dumps(data)

print ("encoding:",data_json)

print ("decoding:",json.loads(data_json))

输出结果为:

json反序列化为类对象

json反序列化为类对象或类实例,使用的是loads()方法中的object_hook参数来实现

#代码示例:
import json


class Employee(object):

    def __init__(self,name,age,sex,tel):

        self.name=name

        self.age=age

        self.sex=sex

        self.tel=tel


emp=Employee("gang",27,"male","1873060****")


def JsonToClass(emp):

    return (Employee(emp["name"],emp["age"],emp["sex"],emp["tel"]))


json_str='{"name":"Lucy","age":32,"sex":"male","tel":13800138000}'

e=json.loads(json_str,object_hook=JsonToClass)   #object_hook等于函数名


print (e)   #类实例

print (e.name)  #实例属性

输出结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值