Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ########################################################################################################################
- # File: json.py
- # Author: Dan Huckson, https://github.com/unodan
- # Date: 2018-07-27
- ########################################################################################################################
- from os import path
- from json import dump, load
- from logging import info, error
- class Json:
- def __init__(self, file=None, **kwargs):
- if isinstance(file, dict):
- self.defaults = file
- else:
- if file and path.isfile(file):
- self.defaults = self.load(file)
- else:
- self.defaults = kwargs.get('data', {})
- if self.defaults is None:
- self.defaults = {}
- self.data = dict(self.defaults)
- def set(self, value=None, uri=None):
- def do(value, uri):
- if uri:
- uri = uri.replace('\\', '/')
- def parse(segment, location):
- parts = location.split('/', 1)
- target = parts[0]
- if len(parts) > 1:
- if target not in segment:
- segment[target] = {}
- parse(segment[target], parts[1])
- else:
- segment[target] = value
- if uri and '/' in uri:
- parse(self.data, uri)
- elif uri is None or uri == '.':
- self.data = value
- else:
- self.data = {**self.data, **{uri: value}}
- if isinstance(value, dict):
- def dig(va, uri=None):
- for k, v in va.items():
- if isinstance(v, dict):
- dig(v, k)
- else:
- do(v, uri + '/' + k)
- dig(value, uri)
- else:
- do(value, uri)
- def get(self, uri=None, default=None):
- if uri:
- uri = uri.replace('\\', '/')
- def parse(segment, location):
- parts = location.split('/', 1)
- target = parts[0]
- if len(parts) > 1:
- if target not in segment:
- return default
- else:
- return parse(segment[target], parts[1])
- elif target in segment:
- return segment[target]
- return default
- if uri and '/' in uri:
- return parse(self.data, uri)
- elif uri == '.' or uri is None:
- return self.data
- else:
- data = None
- if self.data:
- data = self.data.get(uri, default)
- if not data:
- data = default
- return data
- def load(self, file):
- try:
- with open(file, 'r') as f:
- self.data = load(f)
- info('json_read:Filename="' + file + '":Success')
- return self.data
- except OSError as e:
- error('json_read:Filename="' + file + '":' + e.strerror + ":Failed")
- return False
- def save(self, file):
- try:
- with open(file, 'w') as f:
- dump(self.data, f, indent=4)
- info('json_write:Filename="' + file + '":Success')
- return False
- except OSError as e:
- error('json_write:Filename="' + file + '"' + e.strerror)
- return True
- def remove(self, uri):
- if uri:
- uri = uri.replace('\\', '/')
- def parse(segment, location):
- parts = location.split('/', 1)
- target = parts[0]
- if len(parts) > 1:
- return parse(segment[target], parts[1])
- elif target in segment:
- del segment[target]
- if uri and '/' in uri:
- return parse(self.data, uri)
- def update(self, update_data, uri=''):
- def updater(data, _uri):
- for key, value in data.items():
- if isinstance(value, dict):
- updater(value, _uri + key + '/')
- else:
- self.set(value, _uri + key)
- updater(update_data, uri)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement