AlpU
AlpU

Reputation: 373

How to read JSON objects from Tweet.py results

I am trying to read the JSON file created by Tweet.py. However, whatever I tried I am receiving an ValueError consistently.

ValueError: Expecting property name: line 1 column 3 (char 2)

JSON results are in the format of:

{ 'Twitter Data' : [ {
"contributors": null, 
"coordinates": null, 
"created_at": "Tue Oct 24 15:55:21 +0000 2017", 
"entities": {
    "hashtags": ["#football"]
   }            
} , {
"contributors": johnny, 
"coordinates": null, 
"created_at": "Tue Oct 24 15:55:21 +0000 2017", 
"entities": {
    "hashtags": ["#football" , "#FCB"]
   }             
} , ... ] }

There are at least 50 of these JSON objects in the file, which are separated by commas.

My Python script to read this json file is:

twitter_data=[]
with open('@account.json' , 'r') as json_data:
    for line in json_data:
        twitter_data.append(json.loads(line))

print twitter_data

Tweet.py writes these Json objects by using:

json.dump(status._json,file,sort_keys = True,indent = 4) 

I would appreciate any help and guidance on how to read this file!

Thank you.

Upvotes: 0

Views: 416

Answers (2)

Jebby
Jebby

Reputation: 1955

First off, as both @Rob and @silent have noted, 'Twitter Data' should be "Twitter Data". Json needs double quotes, not single quotes to delimit a string.

Secondly, when reading with json.load() it expects a file Object, so when calling json.load(), just pass in json_data and it will read the whole json file into memory:

with open('@account.json' , 'r') as json_data:
    contents = json.load(json_data)

EDIT:

for handling multiple objects at once:

def get_objs(f):
    content = f.read()

    # Get each object in the contents of the file object.
    # This is kinda clunky and inelegant, but it should work
    objs = ['{}{}'.format(i, '}') for i in content.split('},')]

    # Last json_obj probably got an unnecessary "}" at the end, so trim the
    # last character from it
    objs[-1] = objs[-1][0:-1]

    json_objs = [json.loads(i) for i in objs]
    return json_objs

and then just go:

with open('@account.json', 'r') as json_data:
    json_objs = get_objs(json_data)

Hopefully this will work for you. It did for me when I tested it on a simalarly formatted json file.

Upvotes: 0

silent
silent

Reputation: 2904

The { 'Twitter Data' bit should be { "Twitter Data" as well as "Johnny"

That is to say keys and values (strings) must be enclosed in double quotes.

with open("@account.json","r") as json_data:
    data = json_data.readlines()
    twitter_data.append(json.loads(data))

Also, Haven't used this myself but this might be of help as well: https://jsonlint.com

Upvotes: 1

Related Questions