[ovs-dev] [python idl 04/16] ovs.json: Actually implement the "pretty" option for serialization.

Ben Pfaff blp at nicira.com
Mon Sep 19 18:18:10 UTC 2011


---
 python/ovs/json.py |  110 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 72 insertions(+), 38 deletions(-)

diff --git a/python/ovs/json.py b/python/ovs/json.py
index 85c66fa..d62c79e 100644
--- a/python/ovs/json.py
+++ b/python/ovs/json.py
@@ -27,46 +27,80 @@ for esc in range(32):
     if esc not in escapes:
         escapes[esc] = u"\\u%04x" % esc
 
-def __dump_string(stream, s):
-    stream.write(u'"%s"' % ''.join(escapes.get(ord(c), c) for c in s))
+SPACES_PER_LEVEL = 2
+
+class _Serializer(object):
+    def __init__(self, stream, pretty, sort_keys):
+        self.stream = stream
+        self.pretty = pretty
+        self.sort_keys = sort_keys
+        self.depth = 0
+
+    def __serialize_string(self, s):
+        self.stream.write(u'"%s"' % ''.join(escapes.get(ord(c), c) for c in s))
+
+    def __indent_line(self):
+        if self.pretty:
+            self.stream.write('\n')
+            self.stream.write(' ' * (SPACES_PER_LEVEL * self.depth))
+
+    def serialize(self, obj):
+        if obj is None:
+            self.stream.write(u"null")
+        elif obj is False:
+            self.stream.write(u"false")
+        elif obj is True:
+            self.stream.write(u"true")
+        elif type(obj) in (int, long):
+            self.stream.write(u"%d" % obj)
+        elif type(obj) == float:
+            self.stream.write("%.15g" % obj)
+        elif type(obj) == unicode:
+            self.__serialize_string(obj)
+        elif type(obj) == str:
+            self.__serialize_string(unicode(obj))
+        elif type(obj) == dict:
+            self.stream.write(u"{")
+
+            self.depth += 1
+            self.__indent_line()
+
+            if self.sort_keys:
+                items = sorted(obj.items())
+            else:
+                items = obj.iteritems()
+            for i, (key, value) in enumerate(items):
+                if i > 0:
+                    self.stream.write(u",")
+                    self.__indent_line()
+                self.__serialize_string(unicode(key))
+                self.stream.write(u":")
+                if self.pretty:
+                    self.stream.write(u' ')
+                self.serialize(value)
+
+            self.stream.write(u"}")
+            self.depth -= 1
+        elif type(obj) in (list, tuple):
+            self.stream.write(u"[")
+            self.depth += 1
+
+            if obj:
+                self.__indent_line()
+
+                for i, value in enumerate(obj):
+                    if i > 0:
+                        self.stream.write(u",")
+                        self.__indent_line()
+                    self.serialize(value)
+
+            self.depth -= 1
+            self.stream.write(u"]")
+        else:
+            raise Exception("can't serialize %s as JSON" % obj)
 
 def to_stream(obj, stream, pretty=False, sort_keys=True):
-    if obj is None:
-        stream.write(u"null")
-    elif obj is False:
-        stream.write(u"false")
-    elif obj is True:
-        stream.write(u"true")
-    elif type(obj) in (int, long):
-        stream.write(u"%d" % obj)
-    elif type(obj) == float:
-        stream.write("%.15g" % obj)
-    elif type(obj) == unicode:
-        __dump_string(stream, obj)
-    elif type(obj) == str:
-        __dump_string(stream, unicode(obj))
-    elif type(obj) == dict:
-        stream.write(u"{")
-        if sort_keys:
-            items = sorted(obj.items())
-        else:
-            items = obj.iteritems()
-        for i, (key, value) in enumerate(items):
-            if i > 0:
-                stream.write(u",")
-            __dump_string(stream, unicode(key))
-            stream.write(u":")
-            to_stream(value, stream, pretty, sort_keys)
-        stream.write(u"}")
-    elif type(obj) in (list, tuple):
-        stream.write(u"[")
-        for i, value in enumerate(obj):
-            if i > 0:
-                stream.write(u",")
-            to_stream(value, stream, pretty, sort_keys)
-        stream.write(u"]")
-    else:
-        raise Exception("can't serialize %s as JSON" % obj)
+    _Serializer(stream, pretty, sort_keys).serialize(obj)
 
 def to_file(obj, name, pretty=False, sort_keys=True):
     stream = open(name, "w")
-- 
1.7.4.4




More information about the dev mailing list