[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

Reply via email to