Python中的json模块

在Python内置函数中,有一个eval()函数可以将字符串内容转换成Python对象,比如我现在将一个字典 dic = {"name":"pengfy"}写到一个叫hello的文件中,再读取出来的结果就变成字符串了,在json中,json.loads也有一样的作用,但是在一些特殊情况下,eval就不适用了,这时候还是要专业的json模块进行转换。

# 写入文件
dic='{"name":"pengfy"}'
f=open("hello","w")
f.write(dic)

# eval()方法
f_read=open("hello","r")
data=f_read.read()
print(type(data))    #  <class 'str'>
data=eval(data)
print(data["name"]) # pengfy

# json方法
f_read=open("hello","r")
data = json.loads(f_read.read())
print(data)   #{'name': 'pengfy'}
print(data['name'])   # pengfy

JSON

对web开发有兴趣的同学都知道,如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

 序列化

       序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

下面使用json演示序列化过程:

import json

# 序列化
dic={'name':'alex'}
f=open("new_hello","w")

dic_str=json.dumps(dic)
f.write(dic_str)    #这里和json.dump(dic,f)作用一样

以上需要强调几点:

   dic中的内容都是单引号,但是写入文件后,都会变成双引号,不信可以试试。这里面变化就是:

{'name':'pengfy'}---->{"name":"pengfy"}---->'{"name":"pengfy"}'
上面光说的字典,其他数据也是一样的,比如:
 i=8                 ---->'8'
s='hello' ---->"hello"----->'"hello"'
l=[11,22] ---->"[11,22]"
下面看一下json怎么反序列化的:
f_read=open("new_hello","r")
data=json.loads(f_read.read())      # data=json.load(f)

print(data["name"])  # pengfy
print(data)          #{'name': 'pengfy'}
print(type(data))    #<class 'dict'>

我们看到上面的dumps和loads,dump和load都是成双成都出现的,但是只要满足json格式要求,都可以直接用loads或load导出来,比如:

dic_str = "{'name':'pengfy'}"
data = json.loads(dic_str)
print(data)   #直接报错

dic_str = '{"name":"pengfy"}'
data = json.loads(dic_str)
print(data)  #{'name': 'pengfy'}

这么看来,json模块也可以简单的掌握。



原文地址:https://www.cnblogs.com/pengfy/p/10551093.html