123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #!/usr/bin/env python
- """
- The JSON import/export module.
- This is rudimentary for now, assuming everything is well-formed.
- """
- import sys
- import odml
- import json
- class OdmlSerializer(object):
- """
- converts the odml class hierarchy to dictionaries and lists
- """
- def __init__(self, odml_document):
- self.doc = odml_document
- @staticmethod
- def save_element(e):
- """
- returns an xml node for the odML object e
- """
- fmt = e._format
- cur = {'_type': fmt.__class__.__name__}
- # generate elements
- for k in fmt._args:
- if not hasattr(e, fmt.map(k)):
- continue
- val = getattr(e, fmt.map(k))
- if val is None:
- continue
- if isinstance(val, list):
- for v in val:
- ele = OdmlSerializer.save_element(v)
- cur.setdefault(k, []).append(ele)
- else:
- if sys.version_info < (3, 0):
- cur[k] = unicode(val)
- else:
- cur[k] = str(val)
- return cur
- JSON_VERSION = "1"
- class JSONWriter(OdmlSerializer):
- def __unicode__(self):
- doc = self.save_element(self.doc)
- doc['_version'] = JSON_VERSION
- temp = "here i am"
- return json.dumps(doc)
- def __str__(self):
- doc = self.save_element(self.doc)
- doc['_version'] = JSON_VERSION
- return json.dumps(doc)
- def write_file(self, filename):
- if sys.version_info < (3, 0):
- data = unicode(self)
- else:
- data = str(self)
- f = open(filename, "w")
- f.write(data)
- f.close()
- class OdmlReader(object):
- """
- opposite of OdmlSerializer: converts dictionaries representing
- odml objects back to their classes
- """
- def to_odml(self, obj):
- fmt = getattr(odml.format, obj['_type'])
- kargs = {}
- objects = []
- for k in fmt._args:
- v = obj.get(k, None)
- if isinstance(v, list):
- for i, nobj in enumerate(v):
- objects.append(self.to_odml(nobj))
- elif v is not None:
- kargs[fmt.map(k)] = v
- return getattr(self, "create_%s" % fmt._name)(fmt, kargs, obj, objects)
- def create_odML(self, fmt, kargs, obj, children):
- obj = fmt.create(**kargs)
- for i in children:
- obj.append(i)
- return obj
- create_section = create_odML
- create_value = create_odML
- def create_property(self, fmt, kargs, obj, children):
- kargs['value'] = children
- return self.create_odML(fmt, kargs, obj, [])
- class JSONReader(OdmlReader):
- def fromString(self, data):
- obj = json.loads(data)
- return self.to_odml(obj)
- def fromFile(self, infile):
- return self.fromString(infile.read())
- if __name__ == "__main__":
- import sys
- y = JSONReader().fromFile(sys.stdin)
- import dumper
- dumper.dumpDoc(y)
|