source: mauRepo/MolesManager/trunk/src/MolesManager/djencoder.py @ 8335

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/MolesManager/trunk/src/MolesManager/djencoder.py@8335
Revision 8335, 2.1 KB checked in by mnagni, 7 years ago (diff)

Fixed how the JSON encoder manages some escape characters

RevLine 
[8088]1'''
2Created on 9 Feb 2012
3
4@author: mnagni
5'''
6from json.encoder import JSONEncoder
7from MolesManager.forms.date import methodsWithDecorator
[8143]8import re
[8221]9import logging
[8088]10
11class DJEncoder(JSONEncoder):
[8143]12
[8221]13    log = logging.getLogger('DJEncoder')
[8088]14   
15    def __init__(self):
16        self.__markers = {}
17        super(DJEncoder, self).__init__()
[8143]18        self.__pattern = re.compile('\D\D__*')
19        self.__pattern2 = re.compile('\A\w+__id\Z')
20       
21
[8088]22   
23    def default(self, obj):
24        # Convert objects to a dictionary of their representation
25        d = { '__module__':obj.__module__,
26              }
27        if obj.__class__.__name__ == 'EnumSymbol':
28            d['__class__'] = obj._cls.__name__
29        else:
30            d['__class__'] = obj.__class__.__name__
31           
32        if d['__module__'].startswith('sqlalchemy'):
33            return d
[8182]34
35        if d['__class__'] == 'Decimal':
36            d.update({'value': str(obj)})
37        else:   
38            for key in obj.__dict__.keys():
39                if not (key.startswith("_") or self.__pattern.match(key) or self.__pattern2.match(key)):
40                    d.update({key: getattr(obj, key)})
[8088]41        getters = list(methodsWithDecorator(type(obj), "property"))
42        for name in getters:
[8221]43            try:
44                d.update({name: getattr(obj, name)})
45            except Exception as e:
46                DJEncoder.log.error(e)
[8088]47       
48        for key, value in d.items():
49            if value is not None and id(value) in self.__markers and not isinstance(value, str) and not isinstance(value, int):
[8248]50                continue
51                #return {}
[8088]52            else:
[8335]53                if isinstance(value, str) or isinstance(value, unicode):                   
54                    self.__markers[id(value)] = self.escapeForJSON(value)
55                else:
56                    self.__markers[id(value)] = value
[8200]57        return d
58   
59    def escapeForJSON(self, toEscape):
[8335]60        res = toEscape.replace('"', '"')
[8200]61        res = toEscape.replace("'", "'")
[8335]62        res = res.replace('\\', '\\')
[8200]63        return res
64       
Note: See TracBrowser for help on using the repository browser.