139 lines
3.0 KiB
Plaintext
139 lines
3.0 KiB
Plaintext
# load and save a json file
|
|
|
|
import json
|
|
# ##########################
|
|
# uncomment on dev machine, commented on esp
|
|
# import os
|
|
# path=os.path
|
|
import path # uncommented on esp, commented on dev
|
|
|
|
import string
|
|
#############################
|
|
|
|
class File
|
|
var _filename
|
|
var _ext
|
|
|
|
# must use nil for filename if only setting extension
|
|
def init(filename,ext)
|
|
self._ext = ext ? '.'+str(ext) : '.json'
|
|
self._filename = self.addext(filename)
|
|
end
|
|
|
|
def addext(filename)
|
|
if !filename filename=self._filename end
|
|
# print ('extension', self._ext, filename)
|
|
var name = string.find(filename,'.') < 0 ? filename+self._ext : filename
|
|
return name
|
|
end
|
|
|
|
def delete(filename)
|
|
filename = filename ? self.addext(filename) : self._filename
|
|
if path.remove(filename)
|
|
print('deleted file', filename)
|
|
else
|
|
print('unable to delte file', filename)
|
|
end
|
|
end
|
|
|
|
def name(filename)
|
|
if filename self._filename = self.addext(filename) end
|
|
return self._filename
|
|
end
|
|
|
|
# returns parsed json
|
|
def load(filename)
|
|
filename = filename ? self.addext(filename) : self._filename
|
|
var f # file object
|
|
if path.exists(filename)
|
|
var obj
|
|
try
|
|
f = open(filename, "r")
|
|
obj = json.load(f.read())
|
|
f.close()
|
|
except .. as e, m
|
|
if f != nil f.close() end
|
|
raise e, m
|
|
end
|
|
if debug[1]
|
|
print ('=============')
|
|
print ('loaded file ',filename, '. Returning parsed object')
|
|
print (obj)
|
|
print ('=============')
|
|
end
|
|
return obj
|
|
else
|
|
print('Warning: file does not exist, nothing loaded', filename)
|
|
end
|
|
|
|
|
|
return nil
|
|
end
|
|
|
|
# obj is requried
|
|
def save(obj,filename)
|
|
if ! obj
|
|
print('ERROR: must pass a object to save as json')
|
|
return nil
|
|
end
|
|
filename = filename ? self.addext(filename) : self._filename
|
|
if ! filename
|
|
print('ERROR: no filename set to save object as json')
|
|
return nil
|
|
end
|
|
var f # file object
|
|
try
|
|
f = open(filename, "w")
|
|
self._json_fdump_any(f,obj)
|
|
f.close()
|
|
except .. as e, m
|
|
if f != nil f.close() end
|
|
f.close()
|
|
raise e, m
|
|
end
|
|
if debug[3] print('success writing to file',filename) end
|
|
end
|
|
|
|
# internal utility methods
|
|
|
|
def _json_fdump_map(f, v)
|
|
f.write('{')
|
|
var sep = nil
|
|
for k:v.keys()
|
|
if sep != nil f.write(sep) end
|
|
f.write(json.dump(str(k)))
|
|
f.write(':')
|
|
self._json_fdump_any(f, v[k])
|
|
sep = ","
|
|
end
|
|
f.write('}')
|
|
end
|
|
|
|
def _json_fdump_list(f, v)
|
|
f.write('[')
|
|
var i = 0
|
|
while i < size(v)
|
|
if i > 0 f.write(',') end
|
|
self._json_fdump_any(f, v[i])
|
|
i += 1
|
|
end
|
|
f.write(']')
|
|
end
|
|
|
|
def _json_fdump_any(f, v)
|
|
import json
|
|
if isinstance(v, map)
|
|
self._json_fdump_map(f, v)
|
|
elif isinstance(v, list)v
|
|
self._json_fdump_list(f, v)
|
|
else
|
|
f.write(json.dump(v))
|
|
end
|
|
end
|
|
|
|
end # FILE class
|
|
|
|
var file = module('file')
|
|
# file.create = File
|
|
file = File
|
|
return file |