Python JSON:编码(转储),解码(加载)json数据和文件(示例)

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

什么是JSON?

  JSON是一种数据交换的标准格式,它受到JavaScript的启发。通常,JSON采用字符串或文本格式。json代表javascript对象表示法。

  json:json的语法是作为键和值对编写的

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

  JSON与Python字典非常相似。python支持JSON,它有一个内置的库作为JSON

SON库的Python

  是元帅和泡菜是在外部maintain modules of version of JSON的Python库。相关业务的性能和解码JSON编码的Python类You need to json图书馆和第一进出口文件在你的.py for that,

import json

  Following methods are available in the JSON module

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

Python到JSON(编码)

  默认情况下,JSON Library of Python执行以下Python对象转换为JSON对象

PythonJSON
dictObject
listArray
unicodeString
number – int, longnumber – int
floatnumber – real
TrueTrue
FalseFalse
NoneNull

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

输出:

{“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)

输出:

  无需显示…在您的系统中创建了json_file.json,您可以检查该文件。

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

JSON到Python(解码)

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

JSONPython
Objectdict
Arraylist
Stringunicode
number – intnumber – int, long
number – realfloat
TrueTrue
FalseFalse
NullNone

  让我们看看在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'))

输出:

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

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

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

  注意:解码JSON文件是文件输入/输出(I / O)相关的操作。JSON文件必须存在于您指定的程序中指定位置的系统上。

例:

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的字典对象。

输出:

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

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

Python中的紧凑编码

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

例:

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)

输出:

'["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代码(漂亮打印)

  目的是为人类理解编写格式良好的代码。借助漂亮的打印功能,任何人都可以轻松理解代码。
例:

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)

输出:

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

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

为了更好地理解这一点,将缩进更改为40并观察输出 –

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

订购JSON代码:

  dumps中的sort_keys属性函数的参数将按升序对JSON中的键进行排序。sort_keys参数是一个布尔属性。当它是真正的排序时,否则不允许

例:

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)

输出:

{
    "age": 45,
    "cars": [ {
        "model": "Audi A1", 
        "mpg": 15.1
    },
    {
        "model": "Zeep Compass", 
        "mpg": 18.1
    }
    ],
    "children": [ "Alice",
          "Bob"
    ],
    "married": true,
    "name": "Ken",
    "pets": [ 
        "Dog"
    ]
}

您可能会看到钥匙的年龄,汽车,儿童等按升序排列。

Python的复杂对象编码

Complex对象有两个不同的部分

  1. 真实的部分
  2. 想象中的一部分

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

  在执行复杂对象的编码之前,需要检查变量是否复杂。您需要创建一个函数,该函数使用实例方法检查存储在变量中的值。

  让我们为check对象创建特定的函数是复杂的还是有资格进行编码。

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)

输出:

'[4.0, 5.0]'

Python中的复杂JSON对象解码

  要在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)

输出:

Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}

JSON序列化类JSONEncoder概述

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

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

  借助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"]}'

JSON反序列化类JSONDecoder概述

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

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

  借助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)

输出:

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

从URL解码JSON数据:Real Life Example

我们将从指定的URL(https://feeds.citibikenyc.com/stations/stations.json)获取CityBike NYC(自行车共享系统)的数据并转换为字典格式。

例:

注意: – 确保已在Python中安装了请求库,如果没有,则打开终端或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]) 

输出:

<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': ''
}

与Python中的JSON库相关的异常:

  • 类json.JSONDecoderError处理与解码操作相关的异常。它是ValueError的子类。
  • 异常 – json.JSONDecoderError(msg,doc)
  • 异常参数是,
    • msg – 未格式化的错误消息
    • doc – 解析JSON文档
    • pos – 失败时的doc开始索引
    • lineno – line no shows对应pos
    • 冒号 – 列对应于pos

例:

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

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

Python中的无限和NaN数字

  JSON数据交换格式(RFC – Request For Comments)不允许无限值或Nan值,但Python-JSON库中没有限制执行无限和Nan值相关操作。如果JSON获得INFINITE和Nan数据类型,则将其转换为文字。

例:

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

输出:

Infinity
<class 'str'>
NaN
inf
<class 'float'> 

JSON字符串中的重复键

  RFC指定密钥名称在JSON对象中应该是唯一的,但它不是必需的。Python JSON库不会引发JSON中重复对象的异常。它忽略所有重复的键值对,并仅考虑它们中的最后一个键值对。

例:

import json
repeat_pair = '{"a":  1, "a":  2, "a":  3}'
json.loads(repeat_pair)

输出:

{'a': 3}

在Python中使用JSON的CLI(命令行界面)

  json.tool提供命令行界面来验证JSON漂亮的打印语法。我们来看一个CLI的例子

《Python JSON:编码(转储),解码(加载)json数据和文件(示例)》

$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool

输出:

{
    "name": " Kings Authur "
}

Python中JSON的优点

  • 容易在容器和值之间移回(JSON到Python和Python到JSON)
  • 人类可读(漂亮打印)JSON对象
  • 广泛用于数据处理。
  • 单个文件中没有相同的数据结构。

Python中JSON的实现限制

  • 在JSON范围的解串器和预测数字
  • JSON字符串的最大长度和JSON数组以及对象的嵌套级别。

Cheat Code

json.dumps(person_data)创建JSON对象
json.dump(person_data, file_write)使用Python的File I / O创建JSON文件
compact_obj = json.dumps(data, separators=(‘,’,’:’))通过使用分隔符从JSON对象中删除空格字符来压缩JSON对象
formatted_obj = json.dumps(dic, indent=4, separators=(‘,’, ‘: ‘))使用Indent格式化JSON代码
sorted_string = json.dumps(x, indent=4, sort_keys=True)按字母顺序对JSON对象键进行排序
complex_obj = json.dumps(4 + 5j, default=complex_encode)JSON中的Python复杂对象编码
JSONEncoder().encode(colour_dict)使用JSONEncoder类进行序列化
json.loads(data_string)使用json.loads()函数解码Python字典中的JSON字符串
json.loads(‘{“complex“: true, “real”: 4, “img”: 5}’, object_hook = is_complex)将复杂的JSON对象解码为Python
JSONDecoder().decode(colour_string)使用反序列化将JSON解码到Python

本次分享到这里,欢迎评论留言!

    原文作者:疯狂的python程序猿
    原文地址: https://www.jianshu.com/p/6338cf4652d8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞