JSON是数据交换的标准格式,它受JavaScript启发。 通常,JSON是字符串或文本格式。 JSON代表JavaScript对象符号。
JSON的语法:JSON被写为键和值对。
{
"Key": "Value",
"Key": "Value",
}
JSON与Python字典非常相似。 Python支持JSON,并且具有内置库作为JSON。
Python的“ marshal”和“ pickle”外部模块维护JSON库的版本。 要在Python中执行与JSON相关的操作(如编码和解码),您首先需要导入JSON库,然后将其导入.py文件中,
import json
JSON模块中提供以下方法
Python的JSON库默认执行以下将Python对象转换为JSON对象的操作
将Python数据转换为JSON称为编码操作。 借助JSON库方法– dumps()进行编码
dumps()方法将python的字典对象转换为JSON字符串数据格式。
现在让我们使用Python执行第一个编码示例。
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice","Bob"),
"pets": ['Dog'],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
Output:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
让我们使用相同的函数dump()创建字典的JSON文件
# here we create new data_file.json file with write mode using file i/o operation
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)
Output:
Nothing to show…In your system json_file.json is created you can check that file.
(什么都没显示……在系统中创建json_file.json时,您可以检查该文件。)
JSON字符串解码是借助Python中JSON库的内置方法load()和load()来完成的。 这里的转换表显示了从JSON对象到Python对象的示例,这有助于在JSON字符串的Python中执行解码。
让我们来看一个借助json.loads()函数在Python中进行解码的基本示例,
import json # json library imported
# json data string
person_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}'
# Decoding or converting JSON format in dictionary using loads()
dict_obj = json.loads(person_data)
print(dict_obj)
# check type of dict_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
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
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
# store file data in object
data = json.load(file_object)
print(data)
这里的数据是Python的字典对象(Here data is a dictionary object of Python.)
Output:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Python中的紧凑编码
当需要减少JSON文件的大小时,可以在Python中使用紧凑编码。
Example,
import json
# Create a List that contains dictionary
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
# separator used for compact representation of JSON.
# Use of ',' to identify list items
# Use of ':' to identify key and value in dictionary
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)
Output:
'["a", "b", "c", {"4": 5, "6": 7}]'
** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **
格式化JSON代码(漂亮打印)
目的是编写格式正确的代码以供人类理解。 借助漂亮的打印,任何人都可以轻松理解代码。Example,
import json
dic = { 'a': 4, 'b': 5 }
''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)
Output:
{
"a" : 4,
"b" : 5
}
为了更好地理解这一点,请将缩进量更改为40并观察输出-
排序JSON code:
dumps()函数的参数中的sort_keys属性将按升序对JSON中的键进行排序。 sort_keys参数是布尔属性。 正确时允许排序,否则不允许
Example,
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": [ 'Dog' ],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
],
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
Output:
{
"age": 45,
"cars": [ {
"model": "Audi A1",
"mpg": 15.1
},
{
"model": "Zeep Compass",
"mpg": 18.1
}
],
"children": [ "Alice",
"Bob"
],
"married": true,
"name": "Ken",
"pets": [
"Dog"
]
}
您可能会看到按键的年龄,汽车,儿童等按升序排列。
复杂对象具有两个不同的部分,即
Example: 3 +2i
在执行复杂对象的编码之前,您需要检查变量是否为复杂。 您需要创建一个函数,该函数使用实例方法检查存储在变量中的值。
让我们为检查对象是复杂的或适合编码的对象创建特定的功能。
import json
# create function to check instance is complex or not
def complex_encode(object):
# check using isinstance method
if isinstance(object, complex):
return [object.real, object.imag]
# raised error using exception handling if object is not complex
raise TypeError(repr(object) + " is not JSON serialized")
# perform json encoding by passing parameter
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)
Output:
'[4.0, 5.0]'
要在JSON中解码复杂对象,请使用object_hook参数检查JSON字符串是否包含复杂对象。 例,
import json
# function check JSON string contains complex object
def is_complex(objct):
if '__complex__' in objct:
return complex(objct['real'], objct['img'])
return objct
# use of json loads method with object_hook for check object complex or not
complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
#here we not passed complex object so it's convert into dictionary
simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)
print("Complex_object......",complex_object)
print("Without_complex_object......",simple_object)
Output:
Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}
JSONEncoder类用于在执行编码时对任何Python对象进行序列化。 它包含三种不同的编码方法,分别是
借助JSONEncoder类的encode()方法,我们还可以对任何Python对象进行编码。
# import JSONEncoder class from json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)
Output:
'{"colour": ["red", "yellow", "green"]}'
JSONDecoder类用于在执行解码时反序列化任何Python对象。 它包含三种不同的解码方法,分别是
借助于JSONDecoder类的decode()方法,我们还可以解码JSON字符串。
import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().decode(colour_string)
Output:
{'colour': ['red', 'yellow']}
我们将从指定的URL(
https://feeds.citibikenyc.com/stations/stations.json)中获取CityBike NYC(自行车共享系统)的数据,并将其转换为字典格式。
例,
注意:-确保请求库已在Python中安装,如果没有,请打开Terminal或CMD并键入
(对于Python 3或更高版本)pip3安装请求
import json
import requests
# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0])
Output:
<class 'str'>
<class 'dict'>
{
'id': 487,
'stationName': 'E 20 St & FDR Drive',
'availableDocks': 24,
'totalDocks': 34,
'latitude': 40.73314259,
'longitude': -73.97573881,
'statusValue': 'In Service',
'statusKey': 1,
'availableBikes': 9,
'stAddress1': 'E 20 St & FDR Drive',
'stAddress2': '',
'city': '',
'postalCode': '',
'location': '',
'altitude': '',
'testStation': False,
'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''
}
Example,
import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
with open('json_file_name.json') as file_object:
data = json.load(file_object)
except ValueError:
print("Bad JSON file format, Change JSON File")
JSON数据交换格式(RFC –请求注释)不允许使用Infinite或Nan Value,但是Python- JSON库中没有执行Infinite和Nan Value相关操作的限制。 如果JSON获得INFINITE和Nan数据类型,则将其转换为文字。
Example,
import json
# pass float Infinite value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))
Output:
Infinity
<class 'str'>
NaN
inf
<class 'float'>
RFC指定密钥名称在JSON对象中应该唯一,但这不是强制性的。 Python JSON库不会引发JSON中重复对象的异常。 它忽略所有重复的键值对,并仅考虑其中的最后一个键值对。Example,
import json
repeat_pair = '{"a": 1, "a": 2, "a": 3}'
json.loads(repeat_pair)
Output:
{'a': 3}
json.tool提供了命令行界面来验证JSON漂亮打印语法。 让我们看一个CLI的例子
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Output:
{
"name": " Kings Authur "
}