2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-27 15:18:06 +00:00

ovs.json: Actually implement the "pretty" option for serialization.

This commit is contained in:
Ben Pfaff
2011-09-20 11:07:46 -07:00
parent 9b46cccc33
commit cba641035b

View File

@@ -27,47 +27,83 @@ for esc in range(32):
if esc not in escapes: if esc not in escapes:
escapes[esc] = u"\\u%04x" % esc escapes[esc] = u"\\u%04x" % esc
def __dump_string(stream, s): SPACES_PER_LEVEL = 2
stream.write(u'"%s"' % ''.join(escapes.get(ord(c), c) for c in s))
def to_stream(obj, stream, pretty=False, sort_keys=True):
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: if obj is None:
stream.write(u"null") self.stream.write(u"null")
elif obj is False: elif obj is False:
stream.write(u"false") self.stream.write(u"false")
elif obj is True: elif obj is True:
stream.write(u"true") self.stream.write(u"true")
elif type(obj) in (int, long): elif type(obj) in (int, long):
stream.write(u"%d" % obj) self.stream.write(u"%d" % obj)
elif type(obj) == float: elif type(obj) == float:
stream.write("%.15g" % obj) self.stream.write("%.15g" % obj)
elif type(obj) == unicode: elif type(obj) == unicode:
__dump_string(stream, obj) self.__serialize_string(obj)
elif type(obj) == str: elif type(obj) == str:
__dump_string(stream, unicode(obj)) self.__serialize_string(unicode(obj))
elif type(obj) == dict: elif type(obj) == dict:
stream.write(u"{") self.stream.write(u"{")
if sort_keys:
self.depth += 1
self.__indent_line()
if self.sort_keys:
items = sorted(obj.items()) items = sorted(obj.items())
else: else:
items = obj.iteritems() items = obj.iteritems()
for i, (key, value) in enumerate(items): for i, (key, value) in enumerate(items):
if i > 0: if i > 0:
stream.write(u",") self.stream.write(u",")
__dump_string(stream, unicode(key)) self.__indent_line()
stream.write(u":") self.__serialize_string(unicode(key))
to_stream(value, stream, pretty, sort_keys) self.stream.write(u":")
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): elif type(obj) in (list, tuple):
stream.write(u"[") self.stream.write(u"[")
self.depth += 1
if obj:
self.__indent_line()
for i, value in enumerate(obj): for i, value in enumerate(obj):
if i > 0: if i > 0:
stream.write(u",") self.stream.write(u",")
to_stream(value, stream, pretty, sort_keys) self.__indent_line()
stream.write(u"]") self.serialize(value)
self.depth -= 1
self.stream.write(u"]")
else: else:
raise Exception("can't serialize %s as JSON" % obj) raise Exception("can't serialize %s as JSON" % obj)
def to_stream(obj, stream, pretty=False, sort_keys=True):
_Serializer(stream, pretty, sort_keys).serialize(obj)
def to_file(obj, name, pretty=False, sort_keys=True): def to_file(obj, name, pretty=False, sort_keys=True):
stream = open(name, "w") stream = open(name, "w")
try: try: