Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
twitter.request and json.loads problem
-
Guys,
still a beginner at Python, so please be patient.
I'm using the twitter.request function for a Twitter API request.
The result is a tuple consisting of a return code and the actual JSON result.
I want to get hold of that JSON result like this:if status == 200: result = json.loads(data)
However, I get this error:
Traceback (most recent call last):
File "/private/var/mobile/Containers/Shared/AppGroup/9D2704E0-434A-4879-8FB0-30594FA3A28D/Pythonista3/Documents/addToCollectionIK.py", line 17, in <module>
result = json.loads(data)
File "/var/containers/Bundle/Application/B09EF8B7-CE0F-4572-9748-EC15615DEA7A/Pythonista3.app/Frameworks/PythonistaKit3.framework/pylib/json/init.py", line 312, in loads
s.class.name))
TypeError: the JSON object must be str, not 'bytes'Why is that and what can I do about it? From what I understand the twitter.request function doesn't seem to return the JSON object as a string but as 'bytes' (what's that?). So I need to make a string out of that bytes, right? But how?
(btw, the json.load(data) function doesn't work, either ...)Thanks a lot,
Stefan. -
In short,
bytes
is the Python 3 version ofstr
, andstr
in Python 3 is equivalent tounicode
in Python 2.To fix your problem,
data.decode('utf-8')
should work (actuallydata.decode()
should be enough, since utf-8 is the default encoding). -
Btw, the reason
twitter.request
gives you a byte string, and not unicode, is that some requests may actually result in binary data (e.g. profile images etc.), and this way, the type of the return value can be the same in all cases.In Python 2, you don't really see this as a problem because byte strings are silently converted to unicode in a lot of cases, but in Python 3, you have to be explicit (which is often for the better because the Python 2 approach can hide errors from you that only pop up when your data suddenly contains umlauts). If you want to learn more, here's a good presentation on the subject: http://nedbatchelder.com/text/unipain.html