I added caching capabilities for one of my projects by using aiocache with JSON serializer. While doing that I came over strange issue where I was putting {1: "a"}
in cache, but received {"1": "a"}
on retrieval - the 1
integer key came back as "1"
string. First I thought it's an bug in aiocache, but maintainer kindly pointed out that JSON, being Javascript Object Notation does not allow mapping keys to be non-strings.
However there is a point here that's worth paying attention to - it looks like JSON libraries, at least in Python and Chrome/Firefox, will happily accept {1: "a"}
for encoding
but will convert keys to strings. This may lead to quite subtle bugs as in my earlier example - cache hits will return data different to original.
>>> import json
>>> json.dumps({1:"a"})
'{"1": "a"}'
>>> json.loads('{1:"a"}')
Traceback (most recent call last):
File "", line 1, in
File "/home/.../lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/home/.../lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/home/.../lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
No comments:
Post a Comment