一、JSON基础知识
1、json解释
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前使用特别广泛。
采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得JSON成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、json语法
格式:{“key1”:“value1”,“key2”:“value2”} 键值对形式存储
简单案例:
{ "name": "天天", "age": 18 }
复杂案例:
{ "name": "天天", "age": 18, "score": [ { "math": 95 }, { "chinese": 88 } ] }
3、数据类型转换
Python转Json对应表
Json转Python对应表
4、使用方法
1)Json字符串生成Python对象用load方法
2)Python字符串生成Json对象用dump方法
5、json.dump()和json.dumps()使用
1)json.dumps()
语法格式:dict->str转化
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)
obj:转化成json的对象。 sort_keys
=True:是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序。
indent:参数根据数据格式缩进显示,读起来更加清晰。
separators:是分隔符的意思,参数意思分别为不同dict项之间的分隔符和dict项内key和value之间的分隔符,把:和,后面的空格都除去了。
skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key。
ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。
check_circular:如果check_circular为false,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误(或更糟的情况)。 allow_nan:如果allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)。
default:default(obj)是一个函数,它应该返回一个可序列化的obj版本或引发类型错误。默认值只会引发类型错误。
import json student = { "name": "刘刚", "age": 10, "score": [{"math": 95}, {"chinese": 88}] } print(student) #原始输出 print(type(student)) print('=' * 100) stu_dump = json.dumps(student) print(stu_dump) #默认输出 print('=' * 100) #key-value之间的分隔符":",每个key-value之间的分割用"," separators里面用的是单引号 stu_dumps = json.dumps(student, indent=4, separators=('-', '::')) print(type(stu_dumps)) print(stu_dumps)
2)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)
- obj 是一个Python可序列化对象,你希望将其转换为JSON格式。
- fp是一个文件指针,用于将 JSON 格式的数据写入文件。Python json 模块总是产生字符串对象,而不是字节对象,因此,fp.write()必须支持字符串输入。
- 如果skipkeys为真(默认值:假),则不属于基本类型的字典键 (str, int, float, bool, None) 将被跳过而不是引发一个 TypeError。例如,如果你的字典键之一是自定义 Python 对象,则在将字典转换为 JSON 时将省略该键。
- 如果ensure_ascii为 true(默认值),则保证输出所有传入的非 ASCII 字符都已转义。如果ensure_ascii为 false,这些字符将按原样输出。
- allow_nan默认情况下为 True,因此将使用它们的 JavaScript 等效项(NaN、Infinity、-Infinity)。如果为 False,则序列化超出范围的浮点值(nan、inf、-inf)将是一个 ValueError。
- indent参数用于漂亮地打印 JSON 以使其更具可读性。默认值为(', ', ‘: ‘). 要获得最紧凑的 JSON 表示,你应该使用(’,’, ‘:’) 消除空格。
- 如果sort_keys为真(默认:假),则字典的输出将按键排序。
3)json.dump()和json.dumps()区别
json.dumps() 是把python对象转换成json对象的一个过程,生成的是字符串。
json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关。
把字典存到文件dump();把字典存储到数据库或Excel文档需要dumps()把字典转换成字符串,在写入
import json student = { "name": "刘刚", "age": 10, "score": [{"math": 95}, {"chinese": 88}] } json.dump(student,open('./student.json','w')) print('=' * 100) with open('./students.json','w') as fp: fp.write(json.dumps(student))
6、json.load()和json.loads()
1)json.loads()
语法:str->dict转化
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- fp 用于读取包含 JSON 文档的文本文件、二进制文件或 JSON 文件的文件指针。
- object_hook 是可选函数,将使用任何对象文字解码的结果调用。Python 内置的 json 模块只能处理具有直接 JSON 等效项的原语类型(例如,字典、列表、字符串、数字、无等)。但是当你想将 JSON 数据转换成自定义的 Python 类型时,我们需要实现自定义解码器并将其作为对象传递object_hook给一个load()方法,这样我们就可以获得自定义的 Python 类型而不是字典。
- object_pairs_hook 是一个可选函数,它将使用任何对象字面量的结果调用,该结果是用有序的对列表解码的。object_pairs_hook 将使用的返回值 代替 Python 字典。此功能还可用于实现自定义解码器。如果 object_hook 也定义了, object_pairs_hook 则优先。
- parse_float 是可选参数,但如果指定,将使用要解码的每个 JSON 浮点数和整数的字符串调用。默认情况下,这等效于float(num_str)。
- parse_int 如果指定,它将使用要解码的每个 JSON int 的字符串调用。默认情况下,这等效于int(num_str).
解析写法一
import json student = """{ "name": "刘刚", "age": 10, "score": [{"math": 95}, {"chinese": 88}] } """ jsonloads = json.loads(student) print(jsonloads["name"]) print(jsonloads["age"]) print(jsonloads["score"])
解析写法二 可以解析json文件的值
import json student = { "name": "刘刚", "age": 10, "score": [{"math": 95}, {"chinese": 88}] } jsondumps = json.dumps(student) jsonloads = json.loads(jsondumps) print(jsonloads["name"]) print(jsonloads["age"]) print(jsonloads["score"])
读取文件:
with open('data.json') as f: print(json.loads(f.read()))
2)json.load()
语法:参数参照json.loads()
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
读取文件:
import json python_obj = json.load(open('data.json','r')) print(python_obj)
3)json.load()和json.loads()区别
json.load:表示读取文件,返回python对象
json.loads:将json字符串转换为字典类型,返回python对象 [str→dict]
总结:
json.load:表示读取文件,返回python对象
json.dump:表示写入文件,文件为json字符串格式,无返回
json.dumps:将python中的字典类型转换为字符串类型,返回json字符串 [dict→str]
json.loads:将json字符串转换为字典类型,返回python对象 [str→dict]
load和dump处理的主要是 文件
loads和dumps处理的是 字符串
json.load()从json文件中读取数据
json.loads()将str类型的数据转换为dict类型
json.dumps()将dict类型的数据转成str
json.dump()将数据以json的数据类型写入文件中
二、XML的使用
pip install xmltodict
遇到报pip升级错误看这篇文章:WARNING: You are using pip version 21.2.3
https://editor.csdn.net/md/?articleId=126156593
原始xml文件:
<site> <name>xxx</name> <url>https://www.xxx.com</url> <logo>xxx.png</logo> <desc>编程学习网站</desc> </site>
1、xml解析成json代码:
import xmltodict import json def xml_json(xml_str): xml_parse = xmltodict.parse(xml_str) json_str = json.dumps(xml_parse, indent=4) return json_str XML_PATH = 'test.xml' with open(XML_PATH, 'r') as f: xmlfile = f.read() with open(XML_PATH[:-3] + 'json', 'w', encoding='utf-8') as newfile: newfile.write(xml_json(xmlfile))
解析成json结果:
{ "site": { "name": "xxx", "url": "https://www.xxx.com", "logo": "xxx.png", "desc": "\u7f02\u682b\u25bc\u701b\ufe3f\u7bc4\u7f03\u6220\u73ef" } }
2、把json解析成xml:
import xmltodict import json def json_xml(python_dict): xml_str = xmltodict.unparse(python_dict) return xml_str JSON_PATH = 'test.json' with open(JSON_PATH, 'r') as f: jsonfile = f.read() python_dict = json.loads(jsonfile) with open(JSON_PATH[:-4] + 'xml', 'w') as newfile: newfile.write(json_xml(python_dict))