Fawad
Fawad

Reputation: 71

Converting a list to json in python

Here is the code, I have a list, which I want to convert to JSON with dynamic keys.

>>> print (list) #list
['a', 'b', 'c', 'd']

>>> outfile = open('c:\\users\\fawads\desktop\csd\\Test44.json','w')#writing data to file
>>> for entry in list:
...    data={'key'+str(i):entry}
...    i+=1
...    json.dump(data,outfile)
...
>>> outfile.close()

The result is as following:

{"key0": "a"}{"key1": "b"}{"key2": "c"}{"key3": "d"}

Which is not valid json.

Upvotes: 0

Views: 227

Answers (4)

Tadhg McDonald-Jensen
Tadhg McDonald-Jensen

Reputation: 21474

As a minimal change which I originally posted in a comment:

outfile = open('c:\\users\\fawads\desktop\csd\\Test44.json','w')#writing data to file
all_data = [] #keep a list of all the entries
i = 0
for entry in list:
    data={'key'+str(i):entry}
    i+=1
    all_data.append(data) #add the data to the list

json.dump(all_data,outfile) #write the list to the file

outfile.close()

calling json.dump on the same file multiple times is very rarely useful as it creates multiple segments of json data that needs to be seperated in order to be parsed, it makes much more sense to only call it once when you are done constructing the data.

I'd also like to suggest you use enumerate to handle the i variable as well as using a with statement to deal wit the file IO:

all_data = [] #keep a list of all the entries
for i,entry in enumerate(list):
    data={'key'+str(i):entry}
    all_data.append(data)

with open('c:\\users\\fawads\desktop\csd\\Test44.json','w') as outfile:
    json.dump(all_data,outfile)
#file is automatically closed at the end of the with block (even if there is an e

The loop could be shorted even further with list comprehension:

all_data = [{'key'+str(i):entry}
            for i,entry in enumerate(list)]

Which (if you really want) could be put directly into the json.dump:

with open('c:\\users\\fawads\desktop\csd\\Test44.json','w') as outfile:
    json.dump([{'key'+str(i):entry}
                for i,entry in enumerate(list)],
              outfile)

although then you start to lose readability so I don't recommend going that far.

Upvotes: 1

Moses Koledoye
Moses Koledoye

Reputation: 78554

 data = []
 for entry in lst:
    data.append({'key'+str(lst.index(entry)):entry})

 json.dump(data, outfile)

Upvotes: 1

timgeb
timgeb

Reputation: 78790

Enumerate your list (which you should not call list, by the way, you will shadow the built in list):

>>> import json
>>> lst = ['a', 'b', 'c', 'd']
>>> jso = {'key{}'.format(k):v for k, v in enumerate(lst)}
>>> json.dumps(jso)
'{"key3": "d", "key2": "c", "key1": "b", "key0": "a"}'

Upvotes: 1

ajays20078
ajays20078

Reputation: 368

Here is what you need to do:

mydict = {}
i = 0
for entry in list:
  dict_key = "key" + str(i)
  mydict[dict_key] = entry
  i = i + 1
json.dump(mydict, outfile)

Currently you are creating a new dict entry in every iteration of the loop , hence the result is not a valid json.

Upvotes: 0

Related Questions