Python成为专业人士笔记–JSON 模块

专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​

 

存储json至文件

下面的代码片段将存储在d中的JSON格式数据存储在一个新建的”text.txt”文件中

import json

d = {

    'foo': 'bar',

    'alice': 1,

    'wonderland': [1, 2, 3]
}

with open('test.txt', 'w') as f:
    json.dump(d, f)   #该函数将json转换成字符串格式并写入文件

#文件内容:{"foo": "bar", "alice": 1, "wonderland": [1, 2, 3]}

从文件载入json

下面的代码片段打开一个JSON格式的文件并返回存储在文件中的对象 :

import json

#test.txt是上段代码中已经写入过的,这里直接读取
with open('test.txt', 'r') as f:
 d = json.load(f)  #通过json解析对象

print(d)  
# {'foo': 'bar', 'alice': 1, 'wonderland': [1, 2, 3]}  其值和之前写入的一致

print(type(d))
#<class 'dict'>  可以看到,通过json解析后是一个字典对象

格式化json输出

1、 设置缩进以获得更漂亮的输出

import json


data = {"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

print(json.dumps(data))
# "cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

print(json.dumps(data, indent=2))
# {
   "cats": [
     {
       "name": "Tubbs",
       "color": "white"
     },
     {
       "name": "Pepper",
       "color": "black"
     }
   ]
 }

2、 按字母顺序对键进行排序,以获得一致的输出 :

默认情况下,输出中键的顺序是未定义的。我们可以按字母顺序排列,以确保我们总是得到相同的输出 :

import json


data = {"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

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

# {"cats": [{"color": "white", "name": "Tubbs"}, {"color": "black", "name": "Pepper"}]}

3、 去掉空格以获得紧凑的输出 :

我们可能希望去掉不必要的空格,这是通过设置分隔符字符串来实现的:

import json

data = {"cats": [{"name": "Tubbs", "color": "white"}, {"name": "Pepper", "color": "black"}]}

#仔细观察两个输出不同的地方,输出2去除了多余的空格,显得更紧凑了:

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

# {"cats": [{"color": "white", "name": "Tubbs"}, {"color": "black", "name": "Pepper"}]}

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

# {"cats":[{"name":"Tubbs","color":"white"},{"name":"Pepper","color":"black"}]}

load 和 loads以及dump 和 dumps

json模块包含用于对unicode字符串进行读写操作以及对文件进行读写操作的函数。这些由函数名以后缀是否带“s”区分。在下面的示例中,我们使用StringIO对象,但同样的函数也适用于任何类似于文件的对象 :

import json
data = {u"foo": u"bar", u"baz": []}
json_string = json.dumps(data)
print(json_string)
# {"foo": "bar", "baz": []} 字符串格式

print(json.loads(json_string))
# {'foo': 'bar', 'baz': []}  字典对象

接下来,使用StringIO模拟文件读取操作完善代码,注意下面的load和dump函数均变成了不带“s”的函数了

PS: StringIO经常被用来作字符串的缓存,因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作

import json
from io import StringIO

json_file = StringIO()
data = {u"foo": u"bar", u"baz": []}
json.dump(data, json_file)


# 在读取之前,将读取指针返回文件的开头
json_file.seek(0)
a = json_file.read()
print(a)  # {"foo": "bar", "baz": []}
print(type(a))  # <class 'str'>



# 在读取之前,再次将读取指针返回文件的开头
json_file.seek(0)
b=json.load(json_file)
print(b) # {'foo': 'bar', 'baz': []}
print(type(b))# <class 'dict'>

区别总结:

loads  将json格式的数据转化为dict

dumps  将字典、列表t等类型的数据转化成json格式

load  读取json格式文件,并返回dict

dump  将字典、列表等格式的数据转化为json字符串并写入文件

 

json编码的自定义对象

如果我们尝试运行下面的代码:

import json
from datetime import datetime
data = {'datetime': datetime(2016, 9, 26, 4, 44, 0)}
print(json.dumps(data))

我们会得到报错:TypeError: Object of type datetime is not JSON serializable

为了能够正确地序列化datetime对象,我们需要编写转换它的定制代码 :

import json
from datetime import datetime
data = {'datetime': datetime(2019, 9, 26, 4, 44, 0)}

class DatetimeJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        try:

            return obj.isoformat()

        except AttributeError:

            # obj没有isoformat方法;让内置JSON编码器处理它 
            return super().default(obj)

encoder = DatetimeJSONEncoder()
print(encoder.encode(data))

# {"datetime": "2019-09-26T04:44:00"}

从字典转换成json串

import json

d = {

    'foo': 'bar',

    'alice': 1,

    'wonderland': [1, 2, 3]
}
print(json.dumps(d))
# {"foo": "bar", "alice": 1, "wonderland": [1, 2, 3]}

print(type(json.dumps(d)))
# <class 'str'> 可以看到,转换后变成字符类型了

从json串解析成字典

import json
s = '{"wonderland": [1, 2, 3], "foo": "bar", "alice": 1}'

print(json.loads(s))
# {'wonderland': [1, 2, 3], 'foo': 'bar', 'alice': 1}

print(type(json.loads(s)))
# <class 'dict'>

以上代码均已在python3云环境调试通过,请勿转载,谢谢

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值