文章目录
1. 综述
JSON: JavaScript Object Notation(JavaScript 对象表示法),是轻量级的存储和交换文本信息的语法,类似 XML . 特点是纯文本(纯字符串)、层级结构、使用数组。
2. JSON 语法
JSON 语法是 JavaScript 语法的子集。
- 数据保存在 名称/值对(健值对)中
- 数据由逗号分隔
- 花括号
{}
保存对象 - 中括号
[]
保存数组,数组可以包含多个对象 - 使用双引号
""
作为键值的分界符,而python 中的字典的键值的分界符为单引号''
- json 的Key 值可以重复,而python 的dict 的Key 值是唯一的
数据在 名称/值对(健值对)中:JSON 数据的书写格式如下
key : value
例如:
"name" : "JSON 语法"
JSON 名称/值对中的值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在花括号中)
- null
2.1 JSON 对象
JSON 对象在花括号 {}
中书写:
{key1 : value1, key2 : value2, ... keyN : valueN }
例如:
{ "name":"JSON 对象" , "age":80 }
2.2 JSON 数组
JSON 数组在中括号 []
中书写。JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组(嵌套), 布尔值或 null)。
[ "Google", "Runoob", "Taobao" ]
JSON 对象中的数组:
{
"name":"网站",
"num":3,
"sites":[ "Google", "Runoob", "Taobao" ]
}
- 在访问数组元素时,可使用索引、for循环的方法实现
- 修改数组元素可使用索引实现:
myObj.sites[1] = "Github";
- 删除数组元素使用
delet
关键字实现:
delete myObj.sites[1];
3. Python JSON
3.1 自带库json
首先在Python 中应用JSON 的库为json
,Python 自带,不需另外下载:
import json
处理字符串:
- 函数
json.dumps
:将 Python 对象编码成 JSON 字符串 - 函数
json.loads
: 将已编码的 JSON 字符串解码为 Python 对象
处理文件:
- 函数
json.dump
:将 Python 对象编码成 JSON 文件 - 函数
json.load
: 将已编码的 JSON 文件解码为 Python 对象
- 函数
json.dumps
:
# json.dumps 的函数原型如下:
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版本或引发类型错误。默认值只会引发类型错误。
- 例程:
import json
if __name__ == '__main__':
x = {'name': 'zhangsan', 'age': 19, 'city': 'guangzhou'}# 注意逗号后面有空格
# 用dumps将python 字典编码成json字符串
y = json.dumps(x)
print(y)
i = json.dumps(x, separators=(',', ':')) # 逗号后面的空格被去掉
print(i)
# 输出结果
{"name": "zhangsan", "age": 19, "city": "guangzhou"}
{"name":"zhangsan","age":19,"city":"guangzhou"}
- 函数
json.loads
:
# 函数原型:
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
- 例程:
import json
if __name__ == '__main__':
x = {'name': 'zhangsan', 'age': 19, 'city': 'guangzhou'}# 注意逗号后面有空格
# 用dumps将python 字典编码成json字符串
y = json.dumps(x)
print(y)
# 用loads将json 数据解码成python 数据
text = json.loads(y)
print(text)
# 输出结果:
{"name": "zhangsan", "age": 19, "city": "guangzhou"}
{'name': 'zhangsan', 'age': 19, 'city': 'guangzhou'}
3.2 Python 原始类型与JSON 类型的对比
3.3 第三方库Demjson
Github 地址:https://github.com/dmeranda/demjson
官方地址:http://deron.meranda.us/python/demjson/
- 函数
encode
:将 Python 对象编码成 JSON 字符串 - 函数
decode
:将已编码的 JSON 字符串解码为 Python 对象
- 函数
encode
:
# 函数原型:
demjson.encode(self, obj, nest_level=0)
- 例程:
import demjson
if __name__ == '__main__':
data = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}]
json = demjson.encode(data)
print(json)
# 输出结果:
[{"a":1,"b":2,"c":3,"d":4,"e":5}]
- 函数
decode
:
# 函数原型:
demjson.decode(self, txt)
- 例程
import demjson
if __name__ == '__main__':
json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
text = demjson.decode(json)
print(text)
# 运行结果:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
3.* 【例程】读取json 文件数据并通过串口发送
- 前提:以下代码测试运行环境为MacOS,名字为jsonFile.json 的json 文件与名字为main.py 的python 文件放在名字为jsonScript3 的文件夹内,该文件夹放在桌面内
json 文件内容如下:
{
"usbSerialName":"UUT",
"dcr_slope":1.0000,
"dcr_offset":0.0000,
"128kHz":
[
{
"ls_slope":1.0000,
"ls_offset":0.0000
},
{
"rs_slope":1.0000,
"rs_offset":0.0000
},
{
"cs_slope":1.0000,
"cs_offset":0.0000
}
],
"360kHz":
[
{
"ls_slope":1.0000,
"ls_offset":0.0000
},
{
"rs_slope":1.0000,
"rs_offset":0.0000
},
{
"cs_slope":1.0000,
"cs_offset":0.0000
}
],
"1000kHz":
[
{
"ls_slope":1.0000,
"ls_offset":0.0000
},
{
"rs_slope":1.0000,
"rs_offset":0.0000
}
]
}
Python 文件内容如下:
import os
import json
import time
import serial
def getUsbSerialNameFromJson():
data_dict = json.load(open('jsonFile.json', 'r'))
usbSerialName = data_dict['usbSerialName']
return usbSerialName
def getDcrCalibrationParameter():
data_dict = json.load(open('jsonFile.json', 'r'))
dcrSlopeCalibrationParamener = data_dict['dcr_slope']
dcrOffsetCalibrationParamener = data_dict['dcr_offset']
parameterDcrList = [dcrSlopeCalibrationParamener, dcrOffsetCalibrationParamener,]
return parameterDcrList
def get128kHzCalibrationParameter():
data_dict = json.load(open('jsonFile.json', 'r'))
ls128kHzSlopeCalibrationParameter = data_dict['128kHz'][0]['ls_slope']
ls128kHzOffsetCalibrationParameter = data_dict['128kHz'][0]['ls_offset']
rs128kHzSlopeCalibrationParameter = data_dict['128kHz'][1]['rs_slope']
rs128kHzOffsetCalibrationParameter = data_dict['128kHz'][1]['rs_offset']
cs128kHzSlopeCalibrationParameter = data_dict['128kHz'][2]['cs_slope']
cs128kHzOffsetCalibrationParameter = data_dict['128kHz'][2]['cs_offset']
parameter128kHzList = [ls128kHzSlopeCalibrationParameter,ls128kHzOffsetCalibrationParameter,
rs128kHzSlopeCalibrationParameter,rs128kHzOffsetCalibrationParameter,
cs128kHzSlopeCalibrationParameter,cs128kHzOffsetCalibrationParameter]
return parameter128kHzList
def get360kHzCalibrationParameter():
data_dict = json.load(open('jsonFile.json', 'r'))
ls360kHzSlopeCalibrationParameter = data_dict['360kHz'][0]['ls_slope']
ls360kHzOffsetCalibrationParameter = data_dict['360kHz'][0]['ls_offset']
rs360kHzSlopeCalibrationParameter = data_dict['360kHz'][1]['rs_slope']
rs360kHzOffsetCalibrationParameter = data_dict['360kHz'][1]['rs_offset']
cs360kHzSlopeCalibrationParameter = data_dict['360kHz'][2]['cs_slope']
cs360kHzOffsetCalibrationParameter = data_dict['360kHz'][2]['cs_slope']
parameter360kHzList = [ls360kHzSlopeCalibrationParameter,ls360kHzOffsetCalibrationParameter,
rs360kHzSlopeCalibrationParameter,rs360kHzOffsetCalibrationParameter,
cs360kHzSlopeCalibrationParameter,cs360kHzOffsetCalibrationParameter]
return parameter360kHzList
def get1000kHzCalibrationParameter():
data_dict = json.load(open('jsonFile.json', 'r'))
ls1000kHzSlopeCalibrationParameter = data_dict['1000kHz'][0]['ls_slope']
ls1000kHzOffsetCalibrationParameter = data_dict['1000kHz'][0]['ls_offset']
rs1000kHzSlopeCalibrationParameter = data_dict['1000kHz'][1]['rs_slope']
rs1000kHzOffsetCalibrationParameter = data_dict['1000kHz'][1]['rs_offset']
parameter1000kHzList = [ls1000kHzSlopeCalibrationParameter,ls1000kHzOffsetCalibrationParameter,
rs1000kHzSlopeCalibrationParameter,rs1000kHzOffsetCalibrationParameter]
return parameter1000kHzList
def GetDesktopPath():
return os.path.join(os.path.expanduser("~"), 'Desktop')
if __name__ == '__main__':
desktopPath = GetDesktopPath()
os.chdir(desktopPath + "/jsonScript3")
usbSerialName = getUsbSerialNameFromJson()
dcrParameterList = getDcrCalibrationParameter()
paratermeter128kHzList = get128kHzCalibrationParameter()
paratermeter360kHzList = get360kHzCalibrationParameter()
paratermeter1000kHzList = get1000kHzCalibrationParameter()
commandTerminator = '*_*'
dcrSlopeCommand = "set dcr slope " + str(dcrParameterList[0]) + "\r"
dcrOffsetCommand = "set dcr offset " + str(dcrParameterList[1]) + "\r"
ls128kHzSlopeCommand = "set 128khz ls slope " + str(paratermeter128kHzList[0]) + "\r"
ls128kHzOffsetCommand = "set 128khz ls offset " + str(paratermeter128kHzList[1]) + "\r"
rs128kHzSlopeCommand = "set 128khz rs slope " + str(paratermeter128kHzList[2]) + "\r"
rs128kHzOffsetCommand = "set 128khz rs offset " + str(paratermeter128kHzList[3]) + "\r"
cs128kHzSlopeCommand = "set 128khz cs slope " + str(paratermeter128kHzList[4]) + "\r"
cs128kHzOffsetCommand = "set 128khz cs offset " + str(paratermeter128kHzList[5]) + "\r"
ls360kHzSlopeCommand = "set 360khz ls slope " + str(paratermeter360kHzList[0]) + "\r"
ls360kHzOffsetCommand = "set 360khz ls offset " + str(paratermeter360kHzList[1]) + "\r"
rs360kHzSlopeCommand = "set 360khz rs slope " + str(paratermeter360kHzList[2]) + "\r"
rs360kHzOffsetCommand = "set 360khz rs offset " + str(paratermeter360kHzList[3]) + "\r"
cs360kHzSlopeCommand = "set 360khz cs slope " + str(paratermeter360kHzList[4]) + "\r"
cs360kHzOffsetCommand = "set 360khz cs offset " + str(paratermeter360kHzList[5]) + "\r"
ls1000kHzSlopeCommand = "set 1000khz ls slope " + str(paratermeter1000kHzList[0]) + "\r"
ls1000kHzOffsetCommand = "set 1000khz ls offset " + str(paratermeter1000kHzList[1]) + "\r"
rs1000kHzSlopeCommand = "set 1000khz rs slope " + str(paratermeter1000kHzList[2]) + "\r"
rs1000kHzOffsetCommand = "set 1000khz rs offset " + str(paratermeter1000kHzList[3]) + "\r"
calibrationCommandList = [dcrSlopeCommand,
dcrOffsetCommand,
ls128kHzSlopeCommand,
ls128kHzOffsetCommand,
rs128kHzSlopeCommand,
rs128kHzOffsetCommand,
cs128kHzSlopeCommand,
cs128kHzOffsetCommand,
ls360kHzSlopeCommand,
ls360kHzOffsetCommand,
rs360kHzSlopeCommand,
rs360kHzOffsetCommand,
cs360kHzSlopeCommand,
cs360kHzOffsetCommand,
ls1000kHzSlopeCommand,
ls1000kHzOffsetCommand,
rs1000kHzSlopeCommand,
rs1000kHzOffsetCommand
]
serialPort = serial.Serial(port="/dev/tty.usbserial-" + usbSerialName, baudrate= 115200)
for commandIndex in calibrationCommandList:
serialPort.write(commandIndex.encode('utf-8'))
time.sleep(1)
print("pass")
# serialReturnData = ser.read_until(expected=commandTerminator.encode('utf-8')) # 接收串口信息
# print(serialReturnData.decode())
打开终端,输入python
(注意后面带一个空格符),将main.py 文件拖入到终端串口,回车即可
另6串口指令发送代码:https://gitcode.net/weixin_43559366/cyclone6upcalibrationscript.git