[add ovs-dev back; it's a legitimate question that others might want to see answered]
The major reason we don't use simplejson is because it doesn't have a "push" parser: you have to know in advance that you have complete JSON syntax. We parse JSON as it arrives undelimited on a TCP or SSL connection so we don't know that. We could use the serializer from simplejson but it's comparatively trivial so there's no good reason not to roll our own. (To use simplejson at all we'd have to install it on the XenServers, which have Python 2.4 that does not have the "json" module built in.) On Tue, Sep 20, 2011 at 07:57:41AM -0700, Peter Balland wrote: > Is using simplejson an option here? The serialize method is already > implemented with simplejson.dumps(<obj>, indent=2) > > - Peter > > On Mon, Sep 19, 2011 at 11:18 AM, Ben Pfaff <[email protected]> wrote: > > --- > > ?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 > > > > _______________________________________________ > > dev mailing list > > [email protected] > > http://openvswitch.org/mailman/listinfo/dev > > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
