最近做的工作中用到了python读取与修改json文件,在处理json文件时将对象看做字典 将数组看做列表,json就是对象中嵌套列表再嵌套对象的一个可递归的数据结构,处理起来比较麻烦,最初头疼,头疼了一会就想辙了,最终当然是想出辙来了,于是有了这篇文章。
总共的步骤有3步:

  • 1 .读取json文件 ,将文件内容变为字典
  • 2.在字典中找到特定的值并且修改该位置
  • 3 将修改后的字典写入之前的json文件
  • 最重要而且最复杂的要数第2步
    python操作json文件的方法:
    在这里插入图片描述
    如图所示:可以通过json.dumps()将python数据类型变成json字符串(使用在通过TCP发出去的时候,socket能发字符串但是并不能发列表啊)可以通过json.loads()将json字符串变成python的列表字典,以便于处理里面的内容。
    如果操作的是字符串,则可以参考本链接,参考一下其中的选项

https://blog.csdn.net/qq_46293423/article/details/105785007
其中用到的知识点是:嵌套类型的数据 也可以通过索引进行修改:
譬如:

objectDict["COM"][dicNum-1]["Comport"] = comport

其他代码:

import json

class RS485(object):
    def __init__(self,parameterDict):
        self.comname = parameterDict['ComName']
        self.comport = parameterDict['Comport']
        self.baudrate = parameterDict['Baudrate']
        self.parity = parameterDict['Parity']
        self.stopbits = parameterDict['Stopbits']

    def motifyJson(self,file):
        self.baudrate = 19200
        self.parity = "ODD"
        self.stopbits = 1.5
        with open(file, 'r', encoding='utf-8') as f:
            objectDict = json.load(f)
        print(objectDict["COM"])
        for key in objectDict:
            if key == "COM":
                portList = objectDict[key]
                dicNum = 0
                for portDict in portList:
                    dicNum += 1
                    for portDictKey in portDict:
                        if portDict[portDictKey] == self.comname:
                            #portParameterDict = portDict
                            objectDict["COM"][dicNum-1]["Comport"] = self.comport
                            objectDict["COM"][dicNum-1]["Baudrate"] = self.baudrate
                            objectDict["COM"][dicNum-1]["Parity"] = self.parity
                            objectDict["COM"][dicNum-1]["Stopbits"] = self.stopbits
        print(objectDict["COM"])
        with open('GWConfig2.txt', 'w', encoding='utf-8') as f:
            json.dump(objectDict, f, ensure_ascii=False, indent=4)

# 可以考虑传入一个字典,通过字典里的数值进行初始化
def getParameterDict(file,type,port):
    with open(file,'r',encoding='utf-8') as f:
        objectDict = json.load(f)
    for key in objectDict:
        if key == type:
            portList = objectDict[key]
            for portDict in portList:
                for portDictKey in portDict:
                    if portDict[portDictKey] == port:
                        portParameterDict = portDict
    return portParameterDict

# print('eth1.ip is:',eth1.ip)
# print('eth1.port is',eth1.port)
RS485Parameter = getParameterDict('GWConfig.txt','COM','COM2')
com1 = RS485(RS485Parameter)
com1.motifyJson('GWConfig.txt')

所用的json文件

{
	"ETH":[
		{
			"EthName" : "eth0",
			"ip" : "192.168.137.81",
			"port" : 8888
		},
		{
			"EthName" : "eth1",
			"ip" : "192.168.135.81",
			"port" : 9999
		}
		],
	"COM":[
		{
			"ComName" : "COM1",
			"ComDevice" : "/dev/ttymxc4",
			"Comport" : "com4",
			"Baudrate" : 9600,
			"Parity" : "None",
			"Stopbits" : 1
			
		},
		{
		
			"ComName" : "COM2",
			"ComDevice" : "/dev/ttymxc3",
			"Comport" : "com5",
			"Baudrate" : 9600,
			"Parity" : "None",
			"Stopbits" : 1
			
		},
		{
			"ComName" : "COM3",
			"ComDevice" : "/dev/ttymxc2",
			"Comport" : null,
			"Baudrate" : 9600,
			"Parity" : "None",
			"Stopbits" : 1
			
		}
		
		]

}
  • 总结:操作json重点:
  • 1.花括号内为对象 – 字典 方括号内为数组 – 列表
  • 2.读取和保存json文件的方法:
with open('GWConfig.txt', 'r', encoding='utf-8') as f:
    ret_dic = json.load(f)
with open('GWConfig2.txt', 'w', encoding='utf-8') as f:
    json.dump(ret_dic, f, ensure_ascii=False, indent=4)
  • 3.在读取json文件之后 需要将json当做嵌套的字典列表处理,操作起来比较方便 只要认清数据的结构类型即可方便的操作
  • 4.嵌套多少都不要慌,只要定位到索引就可以轻松修改原值,定位索引的方式 字典找key 列表找index
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 3 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐