python基础库json学习

在写爬虫时遇到很多的json格式的内容,搞懂json就成了必须的任务,本来想自己写一下,但看到大神已经写了,写的很详细。就转载大神的文章了。

原文链接地址 作者:tyson Lee

https://blog.csdn.net/chinaltx/article/details/86587435

一、序列化的一些简单概念

我们平常使用的python对象所进行的操作是在内存中,当程序关闭就会被清空,所以我们需要用一种合适的方法将这些数据保存下来。
为了将我们的数据进行永久存储,需要引入序列化(pickling/serialization)的概念。
序列化的定义:将复杂的python数据结果转换成一个二进制数据集合(数据流)。反序列化:从数据流(字符串形式)重新构造复杂的python数据结构。
序列化的好处:我们可以通过网络或本地存储介质讲这些数据流保存或传输。
序列化的方法:引入json、pickling、marshal、shelve,其中最常用的是json。

二、JSON标准库

2.1 基本用法

  • json模块的序列化和反序列化方法分别是dumps和loads,json.dumps()和json.dump()将一个python对象转换成json串,json.loads()和json.load()将一个json串还原成python对象。
  • json.dump()和json.dumps()的区别
    json.dump()处理的是文件对象,而json.dumps()处理的是字符串对象。
  • json.load()和json.loads()的区别
    json.load()处理的是文件对象,而json.loads()处理的是字符串对象。

2.2 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)

>>> import json
>>> json.dumps([])
'[]'
>>> json.dumps("string")
'"string"'
>>> json.dumps(1)       
'1'
>>> json.dumps({"name":"tyson","age":23})
'{"age": 23, "name": "tyson"}'

使用参数能让JSON字串格式化输出:

>>> print json.dumps({'a': 'Runoob', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': '))
{
    "a": "Runoob",
    "b": 7
}

较重要的参数:
sort_keys:是否排序
indent:定义缩进大小
separators:是一个元组,定义分隔符的类型
skipkeys:是否允许JSON字串编码字典对象时,字典的key不是字符串类型(默认是不允许)

a = ['foo', {'bar': ('baz', None, 1.0, 2)}]
s = json.dumps(a, sort_keys=True, indent=4, separators=('!', '?')) #分隔符这里只是测试,一般保持默认逗号和分号即可
print s

result:
[
    "foo"!
    {
        "bar"?[
            "baz"!
            null!
            1.0!
            2
        ]
    }
]

try:
    data = {'a':1, 'b':2, (1,):3}
    json.dumps(data)  
except TypeError,e:
    print e                                #keys must be a string
print json.dumps(data,skipkeys=True)       #{"a": 1, "b": 2}
data = {'a':1, 'b':2, 1:3}
print json.dumps(data)  

result:
keys must be a string
{"a": 1, "b": 2}
{"a": 1, "1": 3, "b": 2} 

python原始类型向json类型的转化对照表
在这里插入图片描述

2.3 json.loads()

将json字串转换成python的数据类型。也就是反序列化。
语法格式:json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

json.loads('{"a":"Runoob","b":7}')     
{u'a': u'Runoob', u'b': 7}

在这里插入图片描述

2.4 json.dump()

将序列化之后形成的JSON字串保存到文件。
语法格式: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):

#encoding:UTF-8
import json
a={"name":"tyson","age":21,"sex":"boy"}

#第一种方法将JSON字串写入文件中
#该方法不需要close
with open("json.txt","a") as f:
    f.write(json.dumps(a,indent=4))

#第二种方法将JSON字串写入文件中
f=open("json.txt","a")
json.dump(a,f,indent=4)
f.close()

#json.txt
{
    "age": 21, 
    "name": "tyson", 
    "sex": "boy"
}{
    "age": 21, 
    "name": "tyson", 
    "sex": "boy"
}

2.5 json.load()

从文件接受JSON字串,并反序列化成为Python的数据类型。
语法格式:load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

#encoding:UTF-8
import json
a={"name":"tyson","age":21,"sex":"boy"}

#第一种方法将JSON字串写入文件中
#该方法不需要close
with open("json","a") as f:
    f.write(json.dumps(a))

#第一种方法将文件中的JSON字串转反序列化成Python的数据类型
with open("json","r") as f:
    print json.loads(f.read())

#json
{"age": 21, "name": "tyson", "sex": "boy"}

三、类的序列化

python的JSON想办法能将各种数据对象都转换为JSON,其中可选参数default就是用来提供给用户自行定义转换函数的

class student(object):
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age

tyson=student("tyson","boy",21)
print json.dumps(tyson,default=lambda obj:obj.__dict__)

#python的JSON想办法能将各种数据对象都转换为JSON,其中可选参数default就是用来提供给用户自行定义转换函数的
#所以上面的方法与下面这个是等同的
def stuclass2json(classObject):
    return{
        'name':classObject.name,
        'sex': classObject.sex,
        'age':classObject.age
    }
print json.dumps(tyson,default=stuclass2json)

发布了44 篇原创文章 · 获赞 16 · 访问量 2385

猜你喜欢

转载自blog.csdn.net/qq_46292926/article/details/105340750