相关文章推荐
潇洒的薯片  ·  mpdf ...·  1 年前    · 
买醉的墨镜  ·  Anaconda ...·  2 年前    · 
爱看球的牙膏  ·  java put ...·  2 年前    · 
def __getattr__ (self, key): """ 属性访问 节点名称需要符合json要求 """ if key in self. __dir__ () or key == ' _buffer ' : return super(). __getattr__ (key) return self.get(key) def get(self, key: str, num= 0): :param key: 需要获取的key, 如果存在同名的key取第一个值 :param num: 0 取首个数据值, -1 取全部数据值 (当num个数大于列表内容相当于=0)) :return: if not key.startswith( ' $.. ' ): condition = ' $.. ' + key else : condition = key ret = [] for match in parse(condition).find(self. __dict__ [ ' _buffer ' ]): ret.append(match.value) if not ret: logs.error( " key: {} 不存在, 请检查参数或文件内~ " .format(key)) else : return ret if num == -1 else ret[num] if 0 < num < len(ret) else ret[0] if __name__ == " __main__ " : """ run """ j = json.load(open( ' ../data/demo/demo.json ' )) logs.debug( " json 原文件内容: {} " .format(j)) logs.debug( " = " *80 + " \n " ) """ 获取复杂json的key-value """ logs.debug( " 下标获取:{} " .format(json_labor_tools(j)[ ' addr9 ' ])) logs.debug( " 属性访问:{} " .format(json_labor_tools(j).addr8)) logs.debug( " 方法获取:{} " .format(json_labor_tools(j).get( ' addr7 ' ))) logs.debug( " 方法获取多个:{} " .format(json_labor_tools(j).get( ' listAddr ' , -1 ))) """ 保存文件 """ # json.dump(j, open('../data/demo/demo.json', 'w+'), ensure_ascii=False, indent=4, sort_keys=True) logs.debug( " = " *80 + " \n " ) logs.debug( " json 新文件内容: {} " .format(j))

执行结果:

② 修改数据

# -*- coding: UTF-8 -*-
import json
from jsonpath_ng import parse
from aa_demo.base.logger import *
class json_labor_tools:
    操作Json对象
    注意事项:
        1.不同层级同名key的value均会被修改, 如果修改单独的key 需要指定层级
        2。属性访问的时候,对json节点名称有比较高的要求
    def __init__(self, buffer: dict = None):
        :param buffer: 固有的属性, 访问不存在的属性时自动访问此属性
        self._buffer = buffer
    def __setitem__(self, key, value):
        """ etitem复写 实现下标的访问"""
        return self.set(key, value)
    def __setattr__(self, key: str, value):
        """ 属性访问 节点名称需要符合json要求 """
        if key in self.__dir__() or key == '_buffer':
            super().__setattr__(key, value)
            return
        else:
            self.set(key, value)
    def set(self, key: str, value):
        :param key: 需要修改的key, 如果存在同名的key 修改全部
        :param value: 修改后的内容
        :return:
        if not key.startswith('$..'):
            condition = '$..' + key
        else:
            condition = key
        parse(condition).update(self.__dict__['_buffer'], value)
        return self
if __name__ == "__main__":
    """run"""
    j = json.load(open('../data/demo/demo.json'))
    logs.debug("json 原文件内容: {}".format(j))
    logs.debug("="*80 + "\n")
    """修改复杂json的key-value"""
    json_labor_tools(j)["adminAddr"] = "修改后的地址"
    json_labor_tools(j)["listAddr"] = "set-listAddr"
    json_labor_tools(j).listName = "修改后的名字"
    json_labor_tools(j).set("listAge", "110")
    json_labor_tools(j).set("listAge4", "不存在")
    """保存文件"""
    # json.dump(j, open('../data/demo/demo.json', 'w+'), ensure_ascii=False, indent=4, sort_keys=True)
    logs.debug("="*80 + "\n")
    logs.debug("json 新文件内容: {}".format(j))

③ 删除数据

# -*- coding: UTF-8 -*-
import json
from jsonpath_ng import parse
from aa_demo.base.logger import *
class json_labor_tools:
    操作Json对象
    注意事项:
        1.不同层级同名key的value均会被修改, 如果修改单独的key 需要指定层级
        2。属性访问的时候,对json节点名称有比较高的要求
    def __init__(self, buffer: dict = None):
        :param buffer: 固有的属性, 访问不存在的属性时自动访问此属性
        self._buffer = buffer
    def __delattr__(self, key):
        """ 属性访问 节点名称需要符合json要求 """
        if key in self.__dir__() or key == '_buffer':
            return




    
 super().__getattr__(key)
        return self.pops(key)
    def pops(self, key: str):
        :param key: 需要删除的key, 如果存在同名的key 删除全部
        :return:
        if not key.startswith('$..'):
            condition = '$..' + key
        else:
            condition = key
        ret = []
        for match in parse(condition).find(self.__dict__['_buffer']):
            ret.append(match.context.value)
        if not ret:
            logs.error("key: {} 不存在, 请检查参数或文件内~".format(key))
        else:
            for i in range(len(ret)):
                # ret[i].pop(key)
                del ret[i][key]
        return self
if __name__ == "__main__":
    """run"""
    j = json.load(open('../data/demo/demo.json'))
    logs.debug("json 原文件内容: {}".format(j))
    logs.debug("="*80 + "\n")
    """修改复杂json的key-value"""
    del json_labor_tools(j).adminAddr
    del json_labor_tools(j).addr1
    json_labor_tools(j).pops("adminTel").pops("addr2").pops("listAddr")
    """保存文件"""
    # json.dump(j, open('../data/demo/demo.json', 'w+'), ensure_ascii=False, indent=4, sort_keys=True)
    logs.debug("="*80 + "\n")
    logs.debug("json 新文件内容: {}".format(j))
def __getattr__ (self, key): """ 属性访问 节点名称需要符合json要求 """ if key in self. __dir__ () or key == ' _buffer ' : return super(). __getattr__ (key) return self.get(key) def __setattr__ (self, key: str, value): """ 属性访问 节点名称需要符合json要求 """ if key in self. __dir__ () or key == ' _buffer ' : super(). __setattr__ (key, value) return else : self.set(key, value) def __delattr__ (self, key): """ 属性访问 节点名称需要符合json要求 """ if key in self. __dir__ () or key == ' _buffer ' : return super(). __getattr__ (key) return self.pops(key) def get(self, key: str, num= 0): :param key: 需要获取的key, 如果存在同名的key取第一个值 :param num: 0 取首个数据值, -1 取全部数据值 (当num个数大于列表内容相当于=0)) :return: if not key.startswith( ' $.. ' ): condition = ' $.. ' + key else : condition = key ret = [] for match in parse(condition).find(self. __dict__ [ ' _buffer ' ]): ret.append(match.value) if not ret: logs.error( " key: {} 不存在, 请检查参数或文件内~ " .format(key)) else : return ret if num == -1 else ret[num] if 0 < num < len(ret) else ret[0] def set(self, key: str, value): :param key: 需要修改的key, 如果存在同名的key 修改全部 :param value: 修改后的内容 :return: if not key.startswith( ' $.. ' ): condition = ' $.. ' + key else : condition = key parse(condition).update(self. __dict__ [ ' _buffer ' ], value) return self def pops(self, key: str): :param key: 需要删除的key, 如果存在同名的key 删除全部 :return: if not key.startswith( ' $.. ' ): condition = ' $.. ' + key else : condition = key ret = [] for match in parse(condition).find(self. __dict__ [ ' _buffer ' ]): ret.append(match.context.value) if not ret: logs.error( " key: {} 不存在, 请检查参数或文件内~ " .format(key)) else : for i in range(len(ret)): # ret[i].pop(key) del ret[i][key] return self def add(self, items: dict = None): :param items: 需要添加键值对 :return: if isinstance(items, dict) and not None: self. __dict__ [ ' _buffer ' ].update(items) else : logs.error( " 未添加成功,请检查item参数是否符合要求 " ) return self if __name__ == " __main__ " : """ run """ j = json.load(open( ' ../data/demo/demo.json ' )) logs.debug( " json 原文件内容: {} " .format(j)) logs.debug( " = " *80 + " \n " ) # 获取value # logs.debug("获取到的 listAddr: {}".format(json_labor_tools(j).get("listAddr"))) # logs.debug("获取到的全部 listAddr: {}".format(json_labor_tools(j).get("listAddr", -1))) # logs.debug("listAddr: {}".format(json_labor_tools(json_labor_tools(j).get('listbak')).get("listAddr"))) # # 修改value # json_labor_tools(j).set("adminAddr", "qipan"). # json_labor_tools(j).set("adminAddr", "tianjin").set("adminPhone", "15700010002") # json_labor_tools(j).set("adminAge", "32").set("list", [1, 2, 3, 4, 4, 6]) # # 添加key-value # json_labor_tools(j).add({"listadd": "add"}) # json_labor_tools(j).add({"listadd": ["add", "add2"]}).add({"name": "add"}) # json_labor_tools(json_labor_tools(j).get('listbak')).set("listAge", 32) # # 删除key-value # json_labor_tools(j).pops('listAddr') json_labor_tools(j).set( " adminAge " , " 30 " ).add({ " addAdminName " : " addVlue " }).pops( " addr1 " ) # # getitem和setitem复写, 下标访问 # logs.debug("获取 adminAge = {}".format(json_labor_tools(j)['adminAge'])) # logs.debug("获取 listTel = {}".format(json_labor_tools(j)['listTel'])) # 属性访问及修改内容 不指定层级会修改全部同名key的value # logs.debug("获取到的 adminAddr: {}".format(json_labor_tools(j).adminAddra)) logs.debug( " 获取到的 listName: {} " .format(json_labor_tools(j).listName)) json_labor_tools(j).adminPhone = " 13612340000 " # json_labor_tools(json_labor_tools(j).listbak[0]).listPhone = '13212348877' # del json_labor_tools(j).adminAddr del json_labor_tools(j).listAddr """ 保存文件 """ # json.dump(j, open('../data/demo/demo.json', 'w+'), ensure_ascii=False, indent=4, sort_keys=True) logs.debug( " = " *80 + " \n " ) logs.debug( " json 新文件内容: {} " .format(j)) -------------------------------------------------------------------------------------

如果万事开头难 那请结局一定圆满 @ Phoenixy

-------------------------------------------------------------------------------------