Python Json loads() returning string instead of dictionary?

Python Json loads() returning string instead of dictionary?

Ok first you should print your object so that you can read it:

>>> from pprint import pprint
>>> output = [{in_reply_to_status_id_str: None, in_reply_to_screen_name: None, retweeted:     False, in_reply_to_status_id: None, contributors: None, favorite_count: 0, in_reply_to_user_id: None, coordinates: None, source: <a href= rel=nofollow>Twitter Web Client</a>, geo: None, retweet_count: 0, text: Tweeting a url n, created_at: Mon Sep 01 19:36:25 +0000 2014, entities: {symbols: [], user_mentions: [], urls: [{expanded_url:, display_url:, url:, indices: [16, 38]}], hashtags: []}, id_str: 506526005943865344, in_reply_to_user_id_str: None, truncated: False, favorited: False, lang: en, possibly_sensitive: False, id: 506526005943865344, user: {profile_text_color: 333333, time_zone: None, entities: {description: {urls: []}}, url: None, profile_background_image_url:, profile_background_image_url_https:, protected: False, default_profile_image: True, utc_offset: None, default_profile: True, screen_name: KickzWatch, follow_request_sent: False, following: False, profile_background_color: C0DEED, notifications: False, description: , profile_sidebar_border_color: C0DEED, geo_enabled: False, verified: False, friends_count: 40, created_at: Mon Sep 01 16:29:18 +0000 2014, is_translator: False, profile_sidebar_fill_color: DDEEF6, statuses_count: 4, location: , id_str: 2784389341, followers_count: 4, favourites_count: 0, contributors_enabled: False, is_translation_enabled: False, lang: en, profile_image_url:, profile_image_url_https:, id: 2784389341, profile_use_background_image: True, listed_count: 0, profile_background_tile: False, name: Maktub Destiny, profile_link_color: 0084B4}, place: None}]
>>> pprint(output)
[{contributors: None,
  coordinates: None,
  created_at: Mon Sep 01 19:36:25 +0000 2014,
  entities: {hashtags: [],
               symbols: [],
               urls: [{display_url:,
                         indices: [16, 38],
               user_mentions: []},
  favorite_count: 0,
  favorited: False,
  geo: None,
  id: 506526005943865344,
  id_str: 506526005943865344,
  in_reply_to_screen_name: None,
  in_reply_to_status_id: None,
  in_reply_to_status_id_str: None,
  in_reply_to_user_id: None,
  in_reply_to_user_id_str: None,
  lang: en,
  place: None,
  possibly_sensitive: False,
  retweet_count: 0,
  retweeted: False,
  source: <a href= rel=nofollow>Twitter Web Client</a>,
  text: Tweeting a url n,
  truncated: False,
  user: {contributors_enabled: False,
           created_at: Mon Sep 01 16:29:18 +0000 2014,
           default_profile: True,
           default_profile_image: True,
           description: ,
           entities: {description: {urls: []}},
           favourites_count: 0,
           follow_request_sent: False,
           followers_count: 4,
           following: False,
           friends_count: 40,
           geo_enabled: False,
           id: 2784389341,
           id_str: 2784389341,
           is_translation_enabled: False,
           is_translator: False,
           lang: en,
           listed_count: 0,
           location: ,
           name: Maktub Destiny,
           notifications: False,
           profile_background_color: C0DEED,
           profile_background_tile: False,
           profile_link_color: 0084B4,
           profile_sidebar_border_color: C0DEED,
           profile_sidebar_fill_color: DDEEF6,
           profile_text_color: 333333,
           profile_use_background_image: True,
           protected: False,
           screen_name: KickzWatch,
           statuses_count: 4,
           time_zone: None,
           url: None,
           utc_offset: None,
           verified: False}}]

From looking at this you can see that output is a list which contains a single dict. To access this you need:

>>> first_elem = output[0]

You will also see that the hashtags key in the first_elem is contained in a second level dict under the key entities:

>>> entities = first_elem[entities]
>>> pprint(entities)
{hashtags: [],
 symbols: [],
 urls: [{display_url:,
           indices: [16, 38],
 user_mentions: []}

Now you are able to access hashtags:

>>> entities[hashtags]

Which just happens to be the empty list.

To convert to JSON, note the comment:

>>> import json
>>> # Make sure output is the list object not a string representing the object
>>> json_string = json.dumps(output)
>>> jason = json.loads(output)
>>> jason[0][entities][hashtags]

I think your problem is that you made output a string before you json.dumps it, meaning that json.loads will return a string, not a json object.

And @Dans answer is correct, this is not valid JSON. It is however a valid python dict, and Im assuming that you got it from Twitter using python then printed it.

First off, your JSON example is not valid JSON; the Twitter API would not output this, because it would break every conforming JSON consumer.

  • jsonlint shows the first, obvious syntax error: single-quoted rather than double quoted strings.
  • Secondly, you have None where JSON requires null, False instead of false, and True, instead of true.

Your alleged JSON example appears to have been pre-decoded into Python :). When I use a snippet of real JSON, it works exactly as expected:

import json

json_string = r

jason = json.loads(json_string)


Python Json loads() returning string instead of dictionary?

I did json.loads(json.loads(string)) and was able to get the dictionary. You can check it out. The first time it doesnt just return the same string, but processes it(e.g. removes characters.

Leave a Reply

Your email address will not be published. Required fields are marked *