v. 0.2.4:
[django-ssify.git] / ssify / serializers.py
1 # -*- coding: utf-8 -*-
2 # This file is part of django-ssify, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See README.md for more information.
4 #
5 from __future__ import unicode_literals
6 import json
7 from .variables import SsiVariable, SsiExpect
8
9
10 def _json_default(o):
11     if isinstance(o, SsiVariable):
12         return {'__var__': o.definition}
13     if isinstance(o, SsiExpect):
14         return {'__expect__': o.name}
15     raise TypeError(o, 'not JSON serializable')
16
17
18 def _json_obj_hook(obj):
19     keys = list(obj.keys())
20     if keys == ['__var__']:
21         return SsiVariable(*obj['__var__'])
22     if keys == ['__expect__']:
23         return SsiExpect(obj['__expect__'])
24     return obj
25
26
27 def json_encode(obj, **kwargs):
28     return json.JSONEncoder(
29         default=_json_default,
30         separators=(',', ':'),
31         **kwargs).encode(obj)
32
33
34 def json_decode(data, **kwargs):
35     return json.loads(data, object_hook=_json_obj_hook, **kwargs)