第2关:JSON篇:使用json库

任务描述

本关任务:编写一个能读取并修改 JSON 数据的程序。

相关知识

json库是 Python 内置的一个用于操作 JSON 数据的库,提供了几个函数用于解析生成(或者说反序列化序列化)JSON 格式的数据。

解析 JSON 数据

json库提供了一个函数loads,用于从 Python 的字符串中解析 JSON 数据。使用它的方法很简单,只需将含有 JSON 数据的字符串当做参数传递给它,它的返回值就是由 Python 中的基础数据类型组成的对象。

  1. import json
  2. data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
  3. text = json.loads(data)
  4. print(text)

得到的结果是:

  1. {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

JSON 的对象类型转换成了 Python 的dict类型。

JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:

JSONPython
object(对象)dict
array(数组)list
string(字符串)unicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone

JSON 数据类型转化成 Python 数据类型后,就可以按照 Python 的方式来使用了:

  1. import json
  2. data = '[1,2,3]';
  3. text = json.loads(data)
  4. text.append(4) #调用list的append函数
  5. print(text)

得到的结果是:

  1. [1, 2, 3, 4]

如果需要以不同的字符编码来解析,可以指定 encoding 参数,比如:

  1. import json
  2. data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
  3. text = json.loads(data,encoding = "utf-8")
  4. print(text)

上面的代码以 utf-8 的字符编码,解析 data 字符串的数据。

注意:如果字符编码指定错误,有可能会导致解析失败,引发异常。

json 库的另一个函数 load 也是用于解析 JSON 数据的,它与 loads 函数唯一不同的地方在于,它是从文件中解析,比如:

  1. import json
  2. data = open("test.txt","r",encoding = "utf-8")
  3. text = json.load(data) #将文件对象传递给load函数
  4. print(text)
  5. fp.close()

这样 test.txt 文件内的内容,就会被当做 JSON 格式的数据来解析。

注意:load 函数没有可选参数 encoding ,只要文件对象使用了正确的字符编码打开文件,load 函数就可以正确的解析数据。

生成 JSON 数据

与解析的那两个函数相对应,json 库也提供了两个函数:dumpsdump ,来将由 Python 基础数据类型组成的对象转化成 JSON 数据,使用方法也类似:

  1. import json
  2. data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
  3. json = json.dumps(data) #转化成JSON格式的字符串
  4. print(json)

得到的结果是:

  1. [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]

注意:这是一个字符串

同样,在转化的时候,也有一个 Python 基础数据类型到 JSON 数据类型的对应表格:

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

注意:dumps 没有可选参数 encoding ,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数 ensure_asciiFalse 。否则非 ASCII 的字符将会被显示成 \uXXXX 的形式。

  1. data = {"name":"小明"}
  2. print(json.dumps(data)) #ensure_ascii默认值为True
  3. print(json.dumps(data,ensure_ascii= False)) #指定ensure_ascii为False

上面的代码的结果:

  1. {"name": "\u5c0f\u660e"}
  2. {"name": "小明"}

使用 dump 函数直接输出到文件也很简单,只需多传递一个文件对象作为参数。

  1. import json
  2. fp = open("test.txt","w")
  3. data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
  4. json.dump(data,fp) #转化成JSON格式的字符串后输出到文件
  5. fp.close()

test.txt文件的内容:

  1. [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]

dump 函数同样也没有可选参数 encoding ,如果数据中有中文字符等非 ASCII 字符时,建议指定可选参数 ensure_asciiFalse

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,实现以下功能:

有一个字符编码为 utf-8 的数据文件 step2/2017.txt

  1. {"count":3 ,
  2. "infos":
  3. [
  4. {"name":"赵昊" , "age":15 ,"height": 1.83, "sex" : "男性" },
  5. {"name":"龙傲天" , "age":16 ,"height": 2.00, "sex" : "男性"},
  6. {"name":"玛丽苏" , "age":15 ,"height": 1.78, "sex" : "女性"}
  7. ]
  8. }

将其按 JSON 格式解析后,将 infos 数组内的三个对象的年龄 age 增加一岁,然后增加一条记录:

  • 名称:叶良辰,年龄:17,身高:1.87,男性

同时,将 count 的值从3改为4

注意:所有打开的文件,请在打开文件的函数内及时关闭,以免影响测试代码读取数据。

测试说明

测试代码会以 JSON 格式解析 step2/2018.txt 的内容,并将其中的数据打印出来。 如果内容成功解析,并且数据填写正确,将会有如下结果输出: 学生数:4 名称:赵昊,年龄:16,身高:1.83,男性 名称:龙傲天,年龄:17,身高:2.00,男性 名称:玛丽苏,年龄:16,身高:1.78,女性 名称:叶良辰,年龄:17,身高:1.87,男性

代码: 

import json

def Func():
    data = open("step2/2017.txt","r",encoding = "utf-8")

    obj = json.load(data)

    data.close()
    
    #********** Begin *********#
    infos = obj['infos']
    for stu in range(len(infos)):
        infos[stu]['age']+=1
    infos.append({'name':'叶良辰','age':17,'height':1.87,'sex':'男性'}
    )
    obj = {
        'count':4,
        'infos':infos
    }



    #********** End **********#
    output = open("step2/2018.txt","w",encoding = "utf-8")
    json.dump(obj,output) #输出到文件
    output.close()

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值