Python JSON和XML使用总结

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Python JSON和XML使用总结

一、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对应表

b33490904384fa02bd0c5fa559c945b.png

Json转Python对应表

1901afe6db77205eff0f00a9eb4a167.png


4、使用方法

1)Json字符串生成Python对象用load方法

2)Python字符串生成Json对象用dump方法

01f4e773be84555710cb0e4dd6cb24a.png


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版本或引发类型错误。默认值只会引发类型错误。

39120366a4bb3c66cb0ffecb9ec2e64.png

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()把字典转换成字符串,在写入

bd907ca6f9d4872addf6a2a32c0a295.png

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

c1fe2f8a1b6774c1acfc527d1514007.png

解析写法一

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)

读取文件:

335b413464b113129039c819ba7ddac.png

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))
相关文章
|
7天前
|
JSON 算法 算法框架/工具
【python】python指南(十二):Json与dict、list互相转换
【python】python指南(十二):Json与dict、list互相转换
8 0
|
14天前
|
JSON 数据格式 Python
【2023最新】Matlab 保存JSON数据集文件,并用Python读取
本文介绍了如何使用MATLAB生成包含数据和标签的JSON格式数据集文件,并展示了用Python读取该JSON文件作为训练集的方法。
36 1
|
5天前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
15 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
18天前
|
JSON 数据格式 Python
【python】解决json.dump(字典)时报错Object of type ‘float32‘ is not JSON serializable
在使用json.dump时遇到的“Object of type ‘float32’ is not JSON serializable”错误的方法,通过自定义一个JSON编码器类来处理NumPy类型的数据。
19 1
|
22天前
|
存储 JSON 数据格式
Python教程:json中load和loads的区别
【7月更文挑战第17天】在Python的`json`模块中, `load`与`loads`函数均用于JSON至Python对象的转换, 区别在于: - **`loads`**处理JSON格式的**字符串** 其中`data.json`文件内容为`{&quot;name&quot;: &quot;Bob&quot;, &quot;age&quot;: 30}`。 简而言之, `loads`用于字符串, 而`load`用于文件对象。根据数据来源选择合适的方法。
|
7天前
|
XML 监控 数据格式
ROS 2 - Python、XML 和 YAML 编写 Launch 文件
ROS 2 - Python、XML 和 YAML 编写 Launch 文件
20 0
|
9天前
|
JSON 数据格式 Python
Python 将省、市 json 替换 成拼音
Python 将省、市 json 替换 成拼音
31 0
|
13天前
|
JSON 数据格式 Python
python处理类似json的文件
python处理类似json的文件
|
1月前
|
XML 数据格式 Python
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
30 0
|
1月前
|
XML JavaScript 数据格式
【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’
【Python】已解决:(Python xml库 import xml.dom.minidom导包报错)‘No module named dom’
32 0