感谢点赞和关注 ,每天进步一点点!加油!
目录
一、Json介绍
二、JSON 函数
2.1 json.dumps
2.2 json.loads
2.3 实战案例:钉钉消息发送
一、Json介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写,同时也方便了机器进行解析和生成。它是基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C,C++, C#, Java, JavaScript, Perl, Python等),这些特性使JSON成为理想的数据交换语言。
JSON基于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。
这些都是常见的数据结构。目前,绝大部分编程语言都以某种形式支持它们。这使得在各种编程语言之间交换同样格式的数据成为可能。
JSON具有以下这些形式:
对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
{
"HDFSProject":[
{
"projectName":"traffic_site",
"hdfsSrcPath":"hdfs:///tmp/flume",
"alarmTable":"ipvacloud.data_files_customers"
},
{
"projectName":"traffic_site_history",
"hdfsSrcPath":"hdfs:///tmp/flume",
"alarmTable":"ipvacloud.data_files_customers"
}
]
}
数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
[
{
"projectName":"traffic_site",
"hdfsSrcPath":"hdfs:///tmp/flume",
"alarmTable":"ipvacloud.data_files_customers"
},
{
"projectName":"traffic_site_history",
"hdfsSrcPath":"hdfs:///tmp/flume",
"alarmTable":"ipvacloud.data_files_customers"
}
]
值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array),这些结构可以嵌套。
字符串(string) 是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。JSON的字符串(string)与C或者Java的字符串非常相似。
数值(number) 也与C或者Java的数值非常相似。只是JSON的数值没有使用八进制与十六进制格式。
二、JSON 函数
使用 JSON 函数需要导入 json 库:import json。
函数 | 描述 |
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
2.1 json.dumps
将字典形式的数据转化为字符串, 源码注解 : 将' obj ' '序列化为JSON格式的' str '
实例
import json
data = [{'hive': 1, 'hadoop': 2, 'hbase': 3, 'flink': 4, 'ambari': 5}]
print("data数据类型: ", type(data))
# 将一个Python数据类型列表进行json格式的编码
data2 = json.dumps(data)
print("data2数据类型: ", type(data2))
print(data2)
执行结果:
实例
import json
dict01 = {'a': 'Runoob', 'c': 9, 'b': 7}
print("dict01数据类型: ", type(dict01))
print(dict01)
# 按照 key 排序,指定了缩进和分割字符
data2 = json.dumps(dict01, sort_keys=True, indent=4, separators=(',', ': '))
print("data2数据类型: ", type(data2))
print(data2)
执行结果:
python 原始类型向 json 类型的转化对照表:
Python | JSON |
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
2.2 json.loads
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。 源码注解 :反序列化 ' s ' (一个' ' str ' ' ', ' bytes ' ' '或' bytearray ' '实例 包含JSON文档)转换为Python对象
- loads操作的是字符串
- load操作的是文件流
实例:
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
text = json.loads(jsonData)
print(type(text))
print(text)
执行结果:
json 类型转换到 python 的类型对照表:
JSON | Python |
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
读取JSON文件
[
{
"projectName": "camera_dt1",
"hdfsSrcPath": "hdfs:///user/hive/warehouse/ipva_camera.db/camera_dt1",
"retentionTime": "5",
"fileSuffix": ".copying"
},
{
"projectName": "camera_dt4",
"hdfsSrcPath": "hdfs:///user/hive/warehouse/ipva_camera.db/camera_dt4",
"retentionTime": "5",
"fileSuffix": ".copying"
}
]
解析实例:
import json
data = open("D:\\bigData\\project\\pythonPro\\kangll-project\\yaml\\hdfsETL.json", "r")
print("data 数据类型: ", type(data))
# load操作的是文件流
data01 = json.load(data)
print("data01 数据类型: ", type(data01))
print(data01[0])
print("data01[0] 数据类型: ", type(data01[0]))
# 根据key 获取Value或者使用get方法
print(data01[0].get("projectName"))
print(data01[0]["projectName"])
print(data01[1].get("hdfsSrcPath"))
print(data01[1]["hdfsSrcPath"])
执行结果:
2.3 实战案例:钉钉消息发送
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 当前路径
path=sys.path[0]
def msg(text, api_url):
"""
钉钉消息发送
:param text:
:param api_url:
:return:
"""
# content 对应的 text为消息内容
json_text= {
"msgtype": "text",
"text": {
"content": text
},"at": {
"atMobiles": ["1786001xxxx"]
}
}
# json.dumps 将字典形式的数据转化为字符串
print requests.post(api_url,json.dumps(json_text),headers=headers).content
if __name__ == '__main__':
# 读取要告警的text文件
f = open(path + "/tmp/text", "r")
line = f.readline()
text= '告警类型:HostName-配置重复\n'
count = 1
# 遍历
while line:
if (count >= 2):
text = text + line
line = f.readline()
count += 1
f.close()
# 钉钉的URL
api_url="https://oapi.dingtalk.com/robot/send?access_token=749b2f448e357b7ffc1bff7b01d3c26a750dfaec75651680fdc8703152837f65"
# 消息发送
msg(text,api_url)
执行脚本:
告警成功
Python系列模块之标准库OS详解_开着拖拉机回家的博客-CSDN博客
Python JSON | 菜鸟教程
python中json用法详解_python json_IT之一小佬的博客-CSDN博客
利用python解析json文件_51CTO博客_python解析json文件