Json descargando un dictado lanza TypeError: las claves deben ser una cadena

Estoy tratando de convertir el siguiente dict into JSON using json.dumps :

  { 'post_engaged': 36, 'post_impressions': 491, 'post_story': 23, 'comment_count': 6, 'created_time': '03:02 AM, Sep 30, 2012', 'message': 'Specialities of Shaktis and Pandavas. \n While having power, why there isn\\u2019t',  : '471662059541196', 'status_type': 'status', 'likes_count': 22 } { 'post_engaged': 24, 'text': '30 Sept 2012 Avyakt Murlli ( Dual Voice )', 'post_story': 8, 'comment_count': 3, 'link': 'http:\\/\\/www.youtube.com\\/watch?v=VGmFj8g7JFA&feature=youtube_gdata_player', 'post_impressions': 307, 'created_time': '03:04 AM, Sep 30, 2012', 'message': 'Not available',  : '529439300404155', 'status_type': 'video', 'likes_count': 7 } { 'post_engaged': 37, 'post_impressions': 447, 'post_story': 22, 'comment_count': 4, 'created_time': '03:11 AM, Sep 30, 2012', 'message': '30-09-12 \\u092a\\u094d\\u0930\\u093e\\u0924:\\u092e\\u0941\\u0930\\u0932\\u0940 \\u0913\\u0',  : '471643246209744', 'status_type': 'status', 'likes_count': 20 } { 'post_engaged': 36, 'post_impressions': 423, 'post_story': 22, 'comment_count': 0, 'created_time': '03:04 AM, Sep 29, 2012', 'message': 'Essence: Sweet children, whenever you have time, earn the true income. Staying i',  : '471274672913268', 'status_type': 'status', 'likes_count': 20 } { 'post_engaged': 16, 'text': 'Essence Of Murli 29-09-2012', 'post_story': 5, 'comment_count': 2, 'link': 'http:\\/\\/www.youtube.com\\/watch?v=i6OgmbRsJpg&feature=youtube_gdata_player', 'post_impressions': 291, 'created_time': '03:04 AM, Sep 29, 2012', 'message': 'Not available',  : '213046588825668', 'status_type': 'video', 'likes_count': 5 } 

Pero me lleva a

 TypeError : keys must be a string 

Supongo que el error podría estar apareciendo porque el dict contiene algunos elementos como:

  : '213046588825668' 

¿Puede alguien guiarme, por favor, con cómo debo eliminar estos elementos del dictado?

Podrías intentar limpiarlo así:

 for key in mydict.keys(): if type(key) is not str: try: mydict[str(key)] = mydict[key] except: try: mydict[repr(key)] = mydict[key] except: pass del mydict[key] 

Esto intentará convertir cualquier clave que no sea una cadena en una cadena. Cualquier clave que no pueda convertirse en una cadena o representarse como una cadena se eliminará.

Modificando la respuesta aceptada anterior, escribí una función para manejar diccionarios de profundidad arbitraria:

 def stringify_keys(d): """Convert a dict's keys to strings if they are not.""" for key in d.keys(): # check inner dict if isinstance(d[key], dict): value = stringify_keys(d[key]) else: value = d[key] # convert nonstring to string if needed if not isinstance(key, str): try: d[str(key)] = value except Exception: try: d[repr(key)] = value except Exception: raise # delete old key del d[key] return d 

La respuesta de Nolan conaway da este resultado por ejemplo.

{“b’opening_hours ‘”: {“b’1_from_hour'”: 720, “b’1_to_hour ‘”: 1440, “b’1_break_from_hour'”: 1440, “b’1_break_to_hour ‘”: 1420, “b’2_from_hour’ “: 720,” b’2_to_hour ‘”: 1440,” b’2_break_from_hour’ “: 1440,” b’2_break_to_hour ‘”: 1440,” b’3_from_hour’ “: 720,” b’3_to_hour ‘”: 1440,” b’3_break_from_hour ‘”: 1440,” b’3_break_to_hour’ “: 1440,” b’4_from_hour ‘”: 720,” b’4_to_hour’ “: 1440,” b’4_break_from_hour ‘”: 1440,” b’4_break_to_hour ” : 1440, “b’5_from_hour ‘”: 720, “b’5_to_hour'”: 1440, “b’5_break_from_hour ‘”: 1440, “b’5_break_to_hour'”: 1440, “b’6_from_hour ‘”: 720, “b ‘6_to_horas’ “: 1440,” b’6_break_from_hour ‘”: 1440,” b’6_break_to_hour’ “: 1440,” b’7_from_hour ‘”: 720,” b’7_to_hour’ “: 1440,” b’7_break_from_hour ‘” 1440, “b’7_break_to_hour ‘”: 1440}}

Si bien esta versión modificada

  def stringify_keys(self,d): """Convert a dict's keys to strings if they are not.""" for key in d.keys(): # check inner dict if isinstance(d[key], dict): value = Helpers().stringify_keys(d[key]) else: value = d[key] # convert nonstring to string if needed if not isinstance(key, str): try: d[key.decode("utf-8")] = value except Exception: try: d[repr(key)] = value except Exception: raise # delete old key del d[key] return d 

Dará esta versión más limpia ..

{“opening_hours”: {“1_from_hour”: 720, “1_to_hour”: 1440, “1_break_from_hour”: 1440, “1_break_to_hour”: 1440, “Evacceso”. “: 1440,” 3_from_hour “: 720,” 3_to_hour “: 1440,” 3_break_from_hour “: 1440,” 3_break_to_hour “: 1440,” 4_break_from_hour “: 720; 1440, “5_from_hour”: 720, “5_to_hour”: 1440, “5_break_from_hour”: 1440, “5_break_to_hour”: 1440, “6_from_hour”, “” “” “” “” “” “” “” “” “” “7_from_hour”: 720, “7_to_hour”: 1440, “7_break_from_hour”: 1440, “7_break_to_hour”: 1440}}

Tal vez esto ayude al siguiente chico:

 strjson = json.dumps(str(dic).replace("'",'"'))