Why am I receiving this JSON Decode Error?

2.1k views Asked by At

Here's what I'm doing.

I'm sending a get request to a reddit oembed endpoint. I want to parse the returned json and grab the raw html to embed a reddit post onto my django page. The error I receive when I try to do this is

json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)

Here's an example of that code in action. (It's inside a function)

 endpoint = requests.get("https://www.reddit.com/oembed?url=https://www.reddit.com/r/nba/comments/n6l2zu/the_crew_lock_in_their_predictions_and_ernie_has/")

 return endpoint.json()['html']

Here is the html it should return. I'm thinking maybe I have to reformat it? Could someone help me out here? Thanks!

 '\n    <blockquote class="reddit-card" >\n      <a href="https://www.reddit.com/r/nba/comments/n6l2zu/the_crew_lock_in_their_predictions_and_ernie_has/?ref_source=embed&amp;ref=share">The crew lock in their predictions and Ernie has the Jazz going to the Finals</a> from\n      <a href="https://www.reddit.com/r/nba/">nba</a>\n    </blockquote>\n    <script async src="https://embed.redditmedia.com/widgets/platform.js" charset="UTF-8"></script>\n'

EDIT:

Here is the result of printing endpoint.json()

    {
   "provider_url":"https://www.reddit.com/",
   "version":"1.0",
   "title":"The crew lock in their predictions and Ernie has the Jazz going to the Finals",
   "provider_name":"reddit",
   "type":"rich",
   "html":"\n    <blockquote class=\"reddit-card\" >\n      <a href=\"https://www.reddit.com/r/nba/comments/n6l2zu/the_crew_lock_in_their_predictions_and_ernie_has/?ref_source=embed&amp;ref=share\">The crew lock in their predictions and Ernie has the Jazz going to the Finals</a> from\n      <a href=\"https://www.reddit.com/r/nba/\">nba</a>\n    </blockquote>\n    <script async src=\"https://embed.redditmedia.com/widgets/platform.js\" charset=\"UTF-8\"></script>\n",
   "author_name":"tanookiben"
}
2

There are 2 answers

0
nick_rinaldi On BEST ANSWER

I wasn't sending a proper header. Kept getting a 429 error back, and because there was no json returned, I was receiving the json decoder error.

5
Shekhrozx On
import requests
import json

def get_response():
    endpoint = requests.get("https://www.reddit.com/oembed?url=https://www.reddit.com/r/nba/comments/n6l2zu/the_crew_lock_in_their_predictions_and_ernie_has/")
    if endpoint.status_code == 200:
        return json.loads(endpoint.text)
        
    return {}
    
print(get_response())

It seems like reddit responses error message as below when you make requests. So it is better to check response status code first.

<!doctype html>
<html>
  <head>
    <title>Too Many Requests</title>
    <style>
      body {
          font: small verdana, arial, helvetica, sans-serif;
          width: 600px;
          margin: 0 auto;
      }

      h1 {
          height: 40px;
          background: transparent url(//www.redditstatic.com/reddit.com.header.png) no-repeat scroll top right;
      }
    </style>
  </head>
  <body>
    <h1>whoa there, pardner!</h1>
    


<p>we're sorry, but you appear to be a bot and we've seen too many requests
from you lately. we enforce a hard speed limit on requests that appear to come
from bots to prevent abuse.</p>

<p>if you are not a bot but are spoofing one via your browser's user agent
string: please change your user agent string to avoid seeing this message
again.</p>

<p>please wait 6 second(s) and try again.</p>

    <p>as a reminder to developers, we recommend that clients make no
    more than <a href="http://github.com/reddit/reddit/wiki/API">one
    request every two seconds</a> to avoid seeing this message.</p>
  </body>
</html>