Menu Close

Python JSON:编码,解码,json数据

什么是JSON?

JSON是一种数据交换的标准格式,它受JavaScript的启发。通常,JSON是字符串或文本格式。

JSON的语法:键值对。

{
        "Key":  "Value",
        "Key":  "Value",
}

JSON与 Python字典非常相似。Python支持JSON,并且具有内置库作为JSON。

Python中的JSON库

Python的“ marshal ”和“ pickle”模块维护一个JSON库版本。要在Python中执行与JSON相关的操作(如编码和解码),您首先需要导入JSON库,然后将其导入.py文件中,

import json

JSON模块中提供以下方法

方法 描述
dumps() 编码为JSON对象
dump() 编码的字符串写入文件
loads() 解码JSON字符串
load() 读取JSON文件时进行解码

Python到JSON(编码)

默认情况下,Python的JSON库将以下Python对象转换为JSON对象

Python JSON
dict Object
list Array
unicode String
number – int, long number – int
float number – real
True True
False False
None Null

将Python数据转换为JSON称为编码操作。借助JSON库方法– dumps()进行编码

dumps()方法将python的字典对象转换为JSON字符串数据格式。

现在让我们使用Python执行第一个编码示例。

import json

x = {
  "name": "Ken",
  "age": 45
}
sorted_string = json.dumps(x)
print(sorted_string)

Output:

{"name": "Ken", "age": 45}

让我们使用相同的函数dump()创建字典的JSON文件

import json
with open('json_file.json', "w") as file_write:
    person_data = {
        "name": "jack",
        "age": 50
    }
    json.dump(person_data, file_write)

输出:

%title插图%num

JSON(解码)

JSON字符串解码是借助Python中JSON库的内置方法load()load()来完成的。这里的转换表显示了将JSON对象转换为Python对象的示例,这有助于在JSON字符串的Python中执行解码。

 

JSON Python
Object dict
Array list
String unicode
number – int number – int, long
number – real float
True True
False False
Null None

import json#导入的json库让我们来看一个借助json.loads()函数在Python中进行解码的基本示例,

import json
person_data = '{  "person":  { "name":  "Kenn",  "sex":  "male",  "age":  28}}'
dict_obj = json.loads(person_data)
print(dict_obj)
print("Type of dict_obj", type(dict_obj))
print("Person......",  dict_obj.get('person'))

Output:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}

在Python中解码JSON文件或解析JSON文件

注意:解码JSON文件是与文件I/O相关的操作。JSON文件必须保存在指定位置。

Example,

import json
with open('json_file.json') as file_object:
        data = json.load(file_object)
print(data)

这里的数据是Python的字典对象。

Output:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}

Python中的紧凑编码

当需要减少JSON文件大小时,可以在Python中使用紧凑编码。

Example,

import json
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)

Output:

'["a", "b", "c", {"4": 5, "6": 7}]'

格式化JSON代码

  • 目的是编写格式正确的代码以供人类理解。借助漂亮的打印,任何人都可以轻松理解代码。
  • 例子,
import json
dic = { 'a': 4, 'b': 5 }
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)

Output:

{
   "a" : 4,
   "b" : 5
}

JSON排序:

dumps()函数的参数中的sort_keys属性将按升序对JSON中的键进行排序。sort_keys参数是布尔属性。正确时允许排序,否则不允许

Example,

import json
x = {
  "aaa": 1,
  "ddd": 4,
  "bbb": 2,
  "ccc": 3,
}
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Output:

{
"aaa": 1,
"bbb": 2,
"ccc": 3,
"ddd": 4
}

JSON序列化类JSONEncoder

JSONEncoder类用于在执行编码时对任何Python对象进行序列化。它包含三种不同的编码方法,分别是

  • default(o) –在子类中实现,并为o对象返回序列化对象。
  • encode(o) –与json.dumps()方法相同,返回Python数据结构的JSON字符串。
  • iterencode(o) –一对一表示字符串并编码对象o。

借助JSONEncoder类的encode()方法,我们还可以对任何Python对象进行编码。

from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
JSONEncoder().encode(colour_dict)

Output:

'{"colour": ["red", "yellow", "green"]}'

JSON反序列化类JSONDecoder概述

JSONDecoder类用于在执行解码时反序列化任何Python对象。它包含三种不同的解码方法,分别是

  • default(o) –在子类中实现,并返回反序列化的对象o object。
  • encode (o) –与json.loads()方法相同,返回JSON字符串或数据的Python数据结构。
  • raw_decode(o) –一对一表示Python字典并解码对象o。

借助于JSONDecoder类的decode()方法,我们还可以解码JSON字符串。

import json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
JSONDecoder().decode(colour_string)

Output:

{'colour': ['red', 'yellow']}

JSON 异常:

  • json.JSONDecoderError处理与JSON有关的异常。这是ValueError的子类
  • 异常-json.JSONDecoderError(msg,doc)
  • Exception的参数是
    • msg –未格式化的错误消息
    • doc-解析的JSON文档
    • pos –失败时启动文档的索引
    • lineno –行号显示对应位置
    • colon–列号对应位置

演示异常情况,先准备如下json文件{“name”: “jack”, “age”: 50,}

import json
data = {} #Define Empty Dictionary Object
try:
        with open('json_file.json') as file_object:
                data = json.load(file_object)
except ValueError as e:
     print(e)

output:

Expecting property name enclosed in double quotes: line 1 column 28 (char 27)

JSON在Python中的优势

  • 易于在容器和值之间移动(从JSON到Python和从Python到JSON)
  • 可读JSON对象
  • 广泛用于数据处理。
  • 单个文件中的数据结构不同。
Posted in Python

发表评论

相关链接