Select Git revision
jsonparse.py
-
Susanna Weber authoredSusanna Weber authored
jsonparse.py 6.07 KiB
import json
import os
import sys
import writefile as wf
from collections import namedtuple
def measurementJsonDecod(measurementdict):
return namedtuple('Measurement', measurementdict.keys())(*measurementdict.values())
def parameterJsonDecod(parameterdict):
return namedtuple('Parameter', parameterdict.keys())(*parameterdict.values())
def functionJsonDecod(functiondict):
return namedtuple('Function', functiondict.keys())(*functiondict.values())
class Measurement:
def __init__(self, name, description, datatype, value, dimension, unit=None, range=None):
self.name = name
self.description = description
self.datatype = datatype
self.range = range
self.dimension = dimension
self.unit = unit
array = []
if self.datatype == "float":
self.value = float(value)
else:
self.value = value
# calculate a start value
# if self.dimension != 0:
# for i in range(self.dimension):
# arrayval = self.datatype((self.range[0] + self.range[1]) / 2)
# if self.datatype == "float" or self.datatype == "double":
# arrayval = float(arrayval)
# array.append(arrayval)
# self.value = [0.0, 0.0, 0.0]
# else:
# self.value = self.datatype(((self.range[0] + self.range[1]) / 2))
class Parameter:
def __init__(self, name, description, datatype, dimension, value, rangevar=None, unit=None, default=None, constant=False):
self.name = name
self.description = description
self.datatype = datatype
# if range == [None, None]:
# self.range = None
# else:
self.range = rangevar
self.dimension = dimension
self.unit = unit
self.default = default
self.constant = constant
self.value = value
# array = []
# calculate a start value
# if self.default == False:
# if self.dimension != 0:
# for i in range(self.dimension):
# array.append(self.datatype((self.range[0] + self.range[1]) / 2))
# self.value = array
# else:
# self.value = self.datatype(((self.range[0] + self.range[1]) / 2))
# else:
# self.value = self.datatype(default)
class Function:
def __init__(self, name, description, inargsdatatypes = None, outargsdatatypes = None):
self.name = name
self.description = description
self.inargsdatatypes = inargsdatatypes
self.outargsdatatypes = outargsdatatypes
def dimensionchange(string):
dimarr = string["dimension"]
if dimarr:
value = dimarr[0]
else:
value = 0
newdimension = {"dimension": value}
string.update(newdimension)
def getdatatypes(argarray):
returnarr = []
if len(argarray) > 0:
for i in argarray:
returnarr.append(i["datatype"])
return returnarr
else:
return None
def changerange(string):
#print(type(string["range"][0]))
if string["range"] != "[None, None]":
rangeval = string["range"]
rangetuple = (rangeval[0], rangeval[1])
#print(rangetuple)
string.update({"range": rangetuple})
print(string["range"])
else:
del string["range"]
print(string)
def getobjnames(argarray):
returnarr = []
if len(argarray) > 0:
for i in argarray:
name = (i["name"].lower()).replace(" ", "")
returnarr.append(name)
return returnarr
else:
return None
def createcomponent(jsonobj, iscomponent):
measurements = jsonobj["measurements"]
measurementobj = []
if len(measurements) > 0:
for i in measurements:
obj = i
# del obj["value"]
del obj["uuid"]
dimensionchange(obj)
# if i["range"]:
changerange(obj)
obj = json.dumps(obj)
measurementobji = json.loads(obj, object_hook=measurementJsonDecod)
measurementobj.append(measurementobji)
print(measurementobj)
parameters = jsonobj["parameters"]
parameterobj = []
if len(parameters) > 0:
for i in parameters:
obj = i
# del obj["value"]
del obj["uuid"]
dimensionchange(obj)
if i["range"]:
changerange(obj)
obj = json.dumps(obj)
parameterobji = json.loads(obj, object_hook=parameterJsonDecod)
parameterobj.append(parameterobji)
functions = jsonobj["functions"]
functionobj = []
if len(functions) > 0:
for i in functions:
obj = i
# del obj["value"]
obj["inargsnames"] = getobjnames(obj["arguments"])
obj["outargsnames"] = getobjnames(obj["returns"])
obj["inargsdatatypes"] = getdatatypes(obj["arguments"])
obj["outargsdatatypes"] = getdatatypes(obj["returns"])
del obj["uuid"]
del obj["arguments"]
del obj["returns"]
obj = json.dumps(obj)
functionobji = json.loads(obj, object_hook=functionJsonDecod)
functionobj.append(functionobji)
print(functionobj)
print(parameterobj)
# exec(open("writefile.py").read())
wf.writeinserver(jsonobj["name"], jsonobj["description"], measurementobj, parameterobj, functionobj, iscomponent)
def main():
try:
JSON_MODEL = sys.argv[1][:-5]
if not os.path.exists(os.path.join('..', 'SOIL OPC-UA', f'{JSON_MODEL}.json')):
raise Exception()
except Exception as e:
print('You must provide a file from the folder to be used as root file of the parsing, e.g., "python jsonparser.py model.json".')
exit()
with open(f'{JSON_MODEL}.json') as file:
#robot = json.dumps(file.read())
robotload = json.loads(file.read())
wf.writebeginning()
createcomponent(robotload, False)
for i in robotload["components"]:
createcomponent(i, True)
wf.writend()
if __name__ == '__main__':
main()