Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

roundtrip error of defaultdict with object and with nested #282

Closed
sangjin-park opened this issue Dec 9, 2019 · 0 comments · Fixed by #283
Closed

roundtrip error of defaultdict with object and with nested #282

sangjin-park opened this issue Dec 9, 2019 · 0 comments · Fixed by #283

Comments

@sangjin-park
Copy link
Contributor

from collections import defaultdict

import traceback

import jsonpickle

class Thing:
  pass

thing = Thing()
defdict = defaultdict(lambda: 0)
obj = [defdict, thing, thing]
try:
  encoded = jsonpickle.encode(obj, keys=True)
  decoded = jsonpickle.decode(encoded, keys=True)
except:
  traceback.print_exc()

print()

default_factory = lambda: 0
defdict = defaultdict(default_factory, {'a': defaultdict(default_factory)})
try:
  encoded = jsonpickle.encode(defdict, keys=True)
  decoded = jsonpickle.decode(encoded, keys=True)
except:
  traceback.print_exc()

produces

Traceback (most recent call last):
  File "/Users/kaien/git/jsonpickle/tests/defaultdict_check.py", line 15, in <module>
    decoded = jsonpickle.decode(encoded, keys=True)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 41, in decode
    return context.restore(data, reset=reset, classes=classes)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 152, in restore
    self._swap_proxies()
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 170, in _swap_proxies
    method(obj, attr, proxy)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 105, in _obj_setvalue
    obj[idx] = proxy.get()
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 97, in get
    return self._objs[self._index]
IndexError: list index out of range


Traceback (most recent call last):
  File "/Users/kaien/git/jsonpickle/tests/defaultdict_check.py", line 25, in <module>
    decoded = jsonpickle.decode(encoded, keys=True)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 41, in decode
    return context.restore(data, reset=reset, classes=classes)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 150, in restore
    value = self._restore(obj)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 207, in _restore
    return restore(obj)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 323, in _restore_object
    return self._restore_object_instance(obj, cls)
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 388, in _restore_object_instance
    instance.default_factory = instance.default_factory.get()
  File "/Users/kaien/git/jsonpickle/jsonpickle/unpickler.py", line 97, in get
    return self._objs[self._index]
IndexError: list index out of range
@davvid davvid closed this as completed in e0205cb Dec 12, 2019
davvid added a commit that referenced this issue Dec 12, 2019
* sangjin-park/master:
  Fix #282 roundtrip error of defaultdict with object and with nested

Signed-off-by: David Aguilar <davvid@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant