Estrarre dato da file json

di il
6 risposte

Estrarre dato da file json

Salve a tutti, spiego il problema.Con grande difficoltà sono riuscito a generare un file json costituito da tutti i tweet del mio profilo. Ma sono interessato solo ad un attributo, ovvero text. Potete darmi qualche suggerimento per l'estrazione del dato ?.

La struttura del file json è questa:
{
    "contributors": null,
    "coordinates": null,
    "created_at": "Mon Nov 07 18:36:39 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": []
    },
    "favorite_count": 0,
    "favorited": false,
    "geo": null,
    "id": 795696484905844736,
    "id_str": "795696484905844736",
    "in_reply_to_screen_name": null,
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": null,
    "in_reply_to_user_id_str": null,
    "is_quote_status": false,
    "lang": "en",
    "place": null,
    "retweet_count": 0,
    "retweeted": false,
    "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
    "text": "how I manage the access to a web site using the XACML policy with two types of roles (administrator, user)?",
    "truncated": false,
    "user": {
        "contributors_enabled": false,
        "created_at": "Tue Jan 10 17:07:09 +0000 2012",
        "default_profile": true,
        "default_profile_image": false,
        "description": "",
        "entities": {
            "description": {
                "urls": []
            }
        },
        "favourites_count": 0,
        "follow_request_sent": false,
        "followers_count": 2,
        "following": false,
        "friends_count": 3,
        "geo_enabled": false,
        "has_extended_profile": false,
        "id": 460337578,
        "id_str": "460337578",
        "is_translation_enabled": false,
        "is_translator": false,
        "lang": "it",
        "listed_count": 0,
        "location": "",
        "name": "Luigi Russo",
        "notifications": false,
        "profile_background_color": "C0DEED",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_tile": false,
        "profile_image_url": "http://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_link_color": "1DA1F2",
        "profile_sidebar_border_color": "C0DEED",
        "profile_sidebar_fill_color": "DDEEF6",
        "profile_text_color": "333333",
        "profile_use_background_image": true,
        "protected": false,
        "screen_name": "centurione007",
        "statuses_count": 13,
        "time_zone": null,
        "translator_type": "none",
        "url": null,
        "utc_offset": null,
        "verified": false
    }
}{
    "contributors": null,
    "coordinates": null,
    "created_at": "Sat Nov 05 09:31:24 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 89465191,
                "id_str": "89465191",
                "indices": [
                    0,
                    15
                ],
                "name": "David Brossard",
                "screen_name": "davidjbrossard"
            }
        ]
    },
    "favorite_count": 0,
    "favorited": false,
    "geo": null,
    "id": 794834488534638592,
    "id_str": "794834488534638592",
    "in_reply_to_screen_name": "davidjbrossard",
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": 89465191,
    "in_reply_to_user_id_str": "89465191",
    "is_quote_status": false,
    "lang": "en",
    "place": null,
    "retweet_count": 0,
    "retweeted": false,
    "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>",
    "text": "@davidjbrossard Hello I need a great help. you can help me and follow me step?",
    "truncated": false,
    "user": {
        "contributors_enabled": false,
        "created_at": "Tue Jan 10 17:07:09 +0000 2012",
        "default_profile": true,
        "default_profile_image": false,
        "description": "",
        "entities": {
            "description": {
                "urls": []
            }
        },
        "favourites_count": 0,
        "follow_request_sent": false,
        "followers_count": 2,
        "following": false,
        "friends_count": 3,
        "geo_enabled": false,
        "has_extended_profile": false,
        "id": 460337578,
        "id_str": "460337578",
        "is_translation_enabled": false,
        "is_translator": false,
        "lang": "it",
        "listed_count": 0,
        "location": "",
        "name": "Luigi Russo",
        "notifications": false,
        "profile_background_color": "C0DEED",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_tile": false,
        "profile_image_url": "http://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_link_color": "1DA1F2",
        "profile_sidebar_border_color": "C0DEED",
        "profile_sidebar_fill_color": "DDEEF6",
        "profile_text_color": "333333",
        "profile_use_background_image": true,
        "protected": false,
        "screen_name": "centurione007",
        "statuses_count": 13,
        "time_zone": null,
        "translator_type": "none",
        "url": null,
        "utc_offset": null,
        "verified": false
    }
}{
    "contributors": null,
    "coordinates": null,
    "created_at": "Thu Nov 03 08:23:56 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 89465191,
                "id_str": "89465191",
                "indices": [
                    0,
                    15
                ],
                "name": "David Brossard",
                "screen_name": "davidjbrossard"
            }
        ]
    },
    "favorite_count": 0,
    "favorited": false,
    "geo": null,
    "id": 794092737540849664,
    "id_str": "794092737540849664",
    "in_reply_to_screen_name": "davidjbrossard",
    "in_reply_to_status_id": 794029708312621056,
    "in_reply_to_status_id_str": "794029708312621056",
    "in_reply_to_user_id": 89465191,
    "in_reply_to_user_id_str": "89465191",
    "is_quote_status": false,
    "lang": "en",
    "place": null,
    "retweet_count": 0,
    "retweeted": false,
    "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
    "text": "@davidjbrossard I should write the XACML policy for managing access to a resource a web site.I am using WSO2. can you give me any help",
    "truncated": false,
    "user": {
        "contributors_enabled": false,
        "created_at": "Tue Jan 10 17:07:09 +0000 2012",
        "default_profile": true,
        "default_profile_image": false,
        "description": "",
        "entities": {
            "description": {
                "urls": []
            }
        },
        "favourites_count": 0,
        "follow_request_sent": false,
        "followers_count": 2,
        "following": false,
        "friends_count": 3,
        "geo_enabled": false,
        "has_extended_profile": false,
        "id": 460337578,
        "id_str": "460337578",
        "is_translation_enabled": false,
        "is_translator": false,
        "lang": "it",
        "listed_count": 0,
        "location": "",
        "name": "Luigi Russo",
        "notifications": false,
        "profile_background_color": "C0DEED",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_tile": false,
        "profile_image_url": "http://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_link_color": "1DA1F2",
        "profile_sidebar_border_color": "C0DEED",
        "profile_sidebar_fill_color": "DDEEF6",
        "profile_text_color": "333333",
        "profile_use_background_image": true,
        "protected": false,
        "screen_name": "centurione007",
        "statuses_count": 13,
        "time_zone": null,
        "translator_type": "none",
        "url": null,
        "utc_offset": null,
        "verified": false
    }
}{
    "contributors": null,
    "coordinates": null,
    "created_at": "Wed Nov 02 16:41:59 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 89465191,
                "id_str": "89465191",
                "indices": [
                    0,
                    15
                ],
                "name": "David Brossard",
                "screen_name": "davidjbrossard"
            }
        ]
    },
    "favorite_count": 0,
    "favorited": false,
    "geo": null,
    "id": 793855687419891713,
    "id_str": "793855687419891713",
    "in_reply_to_screen_name": "davidjbrossard",
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": 89465191,
    "in_reply_to_user_id_str": "89465191",
    "is_quote_status": false,
    "lang": "en",
    "place": null,
    "retweet_count": 0,
    "retweeted": false,
    "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>",
    "text": "@davidjbrossard hi david",
    "truncated": false,
    "user": {
        "contributors_enabled": false,
        "created_at": "Tue Jan 10 17:07:09 +0000 2012",
        "default_profile": true,
        "default_profile_image": false,
        "description": "",
        "entities": {
            "description": {
                "urls": []
            }
        },
        "favourites_count": 0,
        "follow_request_sent": false,
        "followers_count": 2,
        "following": false,
        "friends_count": 3,
        "geo_enabled": false,
        "has_extended_profile": false,
        "id": 460337578,
        "id_str": "460337578",
        "is_translation_enabled": false,
        "is_translator": false,
        "lang": "it",
        "listed_count": 0,
        "location": "",
        "name": "Luigi Russo",
        "notifications": false,
        "profile_background_color": "C0DEED",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_tile": false,
        "profile_image_url": "http://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_link_color": "1DA1F2",
        "profile_sidebar_border_color": "C0DEED",
        "profile_sidebar_fill_color": "DDEEF6",
        "profile_text_color": "333333",
        "profile_use_background_image": true,
        "protected": false,
        "screen_name": "centurione007",
        "statuses_count": 13,
        "time_zone": null,
        "translator_type": "none",
        "url": null,
        "utc_offset": null,
        "verified": false
    }
}{
    "contributors": null,
    "coordinates": null,
    "created_at": "Wed Nov 02 16:30:43 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 89465191,
                "id_str": "89465191",
                "indices": [
                    0,
                    15
                ],
                "name": "David Brossard",
                "screen_name": "davidjbrossard"
            }
        ]
    },
    "favorite_count": 0,
    "favorited": false,
    "geo": null,
    "id": 793852853303541760,
    "id_str": "793852853303541760",
    "in_reply_to_screen_name": "davidjbrossard",
    "in_reply_to_status_id": null,
    "in_reply_to_status_id_str": null,
    "in_reply_to_user_id": 89465191,
    "in_reply_to_user_id_str": "89465191",
    "is_quote_status": false,
    "lang": "en",
    "place": null,
    "retweet_count": 0,
    "retweeted": false,
    "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
    "text": "@davidjbrossard Hi, i'm italian student,can you help me with the XACML policy?",
    "truncated": false,
    "user": {
        "contributors_enabled": false,
        "created_at": "Tue Jan 10 17:07:09 +0000 2012",
        "default_profile": true,
        "default_profile_image": false,
        "description": "",
        "entities": {
            "description": {
                "urls": []
            }
        },
        "favourites_count": 0,
        "follow_request_sent": false,
        "followers_count": 2,
        "following": false,
        "friends_count": 3,
        "geo_enabled": false,
        "has_extended_profile": false,
        "id": 460337578,
        "id_str": "460337578",
        "is_translation_enabled": false,
        "is_translator": false,
        "lang": "it",
        "listed_count": 0,
        "location": "",
        "name": "Luigi Russo",
        "notifications": false,
        "profile_background_color": "C0DEED",
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
        "profile_background_tile": false,
        "profile_image_url": "http://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/422113996704329729/KcYCZJC7_normal.jpeg",
        "profile_link_color": "1DA1F2",
        "profile_sidebar_border_color": "C0DEED",
        "profile_sidebar_fill_color": "DDEEF6",
        "profile_text_color": "333333",
        "profile_use_background_image": true,
        "protected": false,
        "screen_name": "centurione007",
        "statuses_count": 13,
        "time_zone": null,
        "translator_type": "none",
        "url": null,
        "utc_offset": null,
        "verified": false
    }
}{
    "contributors": null,
    "coordinates": null,
    "created_at": "Sun Jan 31 17:14:46 +0000 2016",
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 2719018261,
                "id_str": "2719018261",
ve ne riporto solo una parte.

6 Risposte

  • Re: Estrarre dato da file json

    Ciao, premesso che il JSON che hai postato non è valido, e supponendo sia un array (ovvero "[{...}, {...}, {...}]") allora puoi effettaure il parsing in questo modo:
    
    import json
    
    raw = r"""
    ...
    """
    
    
    def main():
        parsed = json.loads(raw)
        text = [p.get("text") for p in parsed]
        print(text)
    
    
    if __name__ == '__main__':
        main()
    
    
  • Re: Estrarre dato da file json

    Ciao e grazie della risposta ma potresti essere più chiaro ? come mai non è un json? in raw cosa dovrei mettere ,il mio pseudo json?
  • Re: Estrarre dato da file json

    In "raw" ho messo per semplicità la stringa JSON che tu hai fornito, ma suppongo che nel tuo caso essa venga presa dal client di Twitter o dal file in cui tu l'hai salvato.

    Per quanto riguarda il json stesso, esso non è valido in quanto contiene una lista di oggetti, senza che essa sia racchiusa in un array. Probabilmente si tratta solo di un errore di "copia/incolla", in quanto è improbabile che Twitter restituisca un json errato.
  • Re: Estrarre dato da file json

    Sono stato attento nel fare copia e incolla.
    In questo modo vado a generare il file:
    
    file = open('tweet.json', 'w') 
        
        print ("Writing tweet objects to JSON please wait...")
        for status in alltweets:
            json.dump(status._json,file,sort_keys = True,indent = 4)
        
        #chiudi file
        print( "Done")
    
    
        file.close()
        
  • Re: Estrarre dato da file json

    Nel tuo programma per scrivere i Tweet sul file, effettui un loop sulla variabile "alltweets". Ora, senza sapere come quella varibile è stata costruita, l'unica cosa che posso ipotizzare è che contenga una lista (nel senso di lista "python") di tweet, in cui ogni elemento rappresenta un singolo tweet. Nel momento in cui tu vai a serializzare questo oggetto in JSON, quello che ottieni è un qualcosa del tipo:
    
    {
       ....
    }
    
    Successivamente, scrivi sul file direttamente il JSON che hai ottenuto al punto precedente, uno di seguito all'altro e senza separatori. Ovviamente quello che ottieni è errato, in quanto per ottenere un file JSON valido dovresti creare un JSON array, che ha la seguente struttura:
    
    [{
       ....
     },
     {
        ....
     },
     {
       ...
     }]
    
    Ovvero, ciò che serve è:
    • Una parentesi quadra aperta, ad indicare l'inizio di un JSON array;
    • Una lista di oggetti JSON separati da virgole;
    • Una parentesi quadra chiusa, ad inidicare la fine del JSON array.
    Di conseguenza, ti consiglio di modificare il tuo script in modo da creare un oggetto JSON valido. Un modo veloce per farlo è quello di trasformare "alltweets" in una lista di JSON "grezzi", attraverso qualcosa di simile a (nota che non l'ho testato, quindi potrebbe avere errori a runtime, ma l'idea comunque è quella):
    
    alltweets = map(lambda x: x["_json"], alltweets)
    with open("tweets.json", "w") as f:
        json.dump(alltweets, f, ...)
    print("Done") 
    
  • Re: Estrarre dato da file json

    Ok grazie della spiegazione...Spero di aver capito, adesso provo.
Devi accedere o registrarti per scrivere nel forum
6 risposte