In jsbridge we have a socket that stays open constantly and the JavaScript end streams JSON objects for all the events we care about in the browser back over to Python. In jsbridge this happens asynchronously and we use asyncore since it’s available in stdlib and is pretty lightweight, but the bulk of the parsing code is universal.
import simplejson decoder = simplejson.JSONDecoder() class StreamReader(object): sbuffer = '' def process_read(self, data): """Parse out json objects and fire callbacks.""" self.sbuffer += data self.parsing = True while self.parsing: # Remove erroneus data in front of callback object index = self.sbuffer.find('{') if index is not -1 and index is not 0: self.sbuffer = self.sbuffer[index:] # Try to get a json object from the data stream try: obj, index = decoder.raw_decode(self.sbuffer) except Exception, e: self.parsing = False # If we got an object fire the callback infra if self.parsing: self.fire_callbacks(obj) self.sbuffer = self.sbuffer[index:]
The process_read function gets called every time a block of data gets read from the stream so it needs to be able to handle multiple JSON objects in a single read, objects that span multiple reads, and junk (usually spaces and return carriers) showing up between JSON objects.
If you wanna see this code in the wild you can check out the jsbridge source.








