Skip to content

unpickled = jsonpickle.decode(pickled)) raises an unexpected IndexError: list index out of range #55

@c0indev3l

Description

@c0indev3l

I get an IndexError: list index out of range when I write this kind of script
when decoding a JSON pickled object using
unpickled = jsonpickle.decode(pickled)
I don't know if problem is on my side or on your side...

import datetime
import time
from collections import OrderedDict
import jsonpickle

class TimestampedVariable(object):
    def __init__(self, value=None):
        self._value = value
        self._dt_read = datetime.datetime.utcnow()
        self._dt_write = self._dt_read

    def get(self, default_value=None):
        if self._dt_read == None and self._dt_write == None:
            value = default_value
            self._value = value
            self._dt_write = datetime.datetime.utcnow()
        else:
            value = self._value
        self._dt_read = datetime.datetime.utcnow()        
        return(value)

    def set(self, new_value):
        self._dt_write = datetime.datetime.utcnow()
        self._value = new_value

    def __repr__(self):
        dt_now = datetime.datetime.utcnow()
        td_read = dt_now - self._dt_read
        td_write = dt_now - self._dt_write
        s = '<TimestampedVariable>\n'
        s += '  value: ' + str(self._value) + '\n'
        s += '  dt_read : ' + str(self._dt_read) + ' (%s ago)' % td_read + '\n'
        s += '  dt_write: ' + str(self._dt_write) + ' (%s ago)' % td_write + '\n'
        return(s)


    def erasable(self, td=datetime.timedelta(seconds=1)):
        dt_now = datetime.datetime.utcnow()
        td_read = dt_now - self._dt_read
        td_write = dt_now - self._dt_write
        return( ( td_read > td ) and ( td_write > td ) )


class PersistantVariables(object):
    def __init__(self):
        self._data = dict() #OrderedDict()

    def __getitem__(self, key):
        if key not in self._data:
            self._data[key] = TimestampedVariable(None)

        return self._data[key]

    def __setitem__(self, key, value):
        if key not in self._data:
            self._data[key] = TimestampedVariable(value)

        return self._data[key]

    def __repr__(self):
        return(str(self._data))


pvars = PersistantVariables()
print(pvars['var1'])

#print(pvars['var2']['var2b'])

time.sleep(2)

print(pvars._data)

time.sleep(2)

print(pvars['var2.var2b'])

print(pvars._data)

#pvars['z'] = 2
#pvars['z2']['z3'] = 3

#print(pvars.sorts)


pickled = jsonpickle.encode(pvars)
print(pickled)
unpickled = jsonpickle.decode(pickled)

This code returns this error

IndexError                                Traceback (most recent call last)
<ipython-input-1-b30e13247ae1> in <module>()
     85 pickled = jsonpickle.encode(pvars)
     86 print(pickled)
---> 87 unpickled = jsonpickle.decode(pickled)

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/jsonpickle/__init__.py in decode(string)
    323     """
    324     j = Unpickler()
--> 325     return j.restore(json.decode(string))

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/jsonpickle/unpickler.py in restore(self, obj)
    118                 self._namestack.append(k)
    119                 # step into the namespace
--> 120                 value = self.restore(v)
    121                 if (util.is_noncomplex(instance) or
    122                         util.is_dictionary_subclass(instance)):

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/jsonpickle/unpickler.py in restore(self, obj)
    151             for k, v in sorted(obj.iteritems(), key=operator.itemgetter(0)):
    152                 self._namestack.append(k)
--> 153                 data[k] = self.restore(v)
    154                 self._namestack.pop()
    155             return self._pop(data)

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/jsonpickle/unpickler.py in restore(self, obj)
    118                 self._namestack.append(k)
    119                 # step into the namespace
--> 120                 value = self.restore(v)
    121                 if (util.is_noncomplex(instance) or
    122                         util.is_dictionary_subclass(instance)):

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/jsonpickle/unpickler.py in restore(self, obj)
     64 
     65         if has_tag(obj, tags.ID):
---> 66             return self._pop(self._objs[obj[tags.ID]])
     67 
     68         if has_tag(obj, tags.REF):

IndexError: list index out of range

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions