omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    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

    Pythonista
    2
    3
    2893
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • metawops
      metawops last edited by

      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.

      1 Reply Last reply Reply Quote 0
      • omz
        omz last edited by

        In short, bytes is the Python 3 version of str, and str in Python 3 is equivalent to unicode in Python 2.

        To fix your problem, data.decode('utf-8') should work (actually data.decode() should be enough, since utf-8 is the default encoding).

        1 Reply Last reply Reply Quote 1
        • omz
          omz last edited by omz

          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

          1 Reply Last reply Reply Quote 2
          • First post
            Last post
          Powered by NodeBB Forums | Contributors