Python JSON 开发

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 对象

  1. 函数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"}

  1. 函数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 对象

  1. 函数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}]

  1. 函数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

*. 参考


w3cschool
JSON官网
JSON中文官网

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Truffle7电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值