salamey
salamey

Reputation: 3821

format python output to json

I have written a Python script that outputs a long data structure (dictionary i called "celldict") in Json format. Here's a small part of it :

{
    "1224": {
        "OUT3FA_5": 12,
        "IN1": 37,
        "Total_IN1": 37
    },
    "1225": {
        "OUT3FA_5": 24,
        "IN1": 59,
        "Total_IN1": 22
    }
}

But what I would like to do is have something like this :

{
    "success": true,
    "data": [
        {
            "Week":"1224",
            "OUT3FA_5": 65,
            "IN1": 85,
            "Total_IN1": 100
        },
        {
            "Week":"1225",
            "OUT3FA_5": 30,
            "IN1": 40,
            "Total_IN1": 120
        }
    ]
}

Is there a way to format the json output with Python to get I what I want? I do:

print json.dumps(celldict)

to get my output. Any help would be much much appreciated.

Upvotes: 3

Views: 20203

Answers (2)

Martijn Pieters
Martijn Pieters

Reputation: 1125068

Just put celldict inside another dict:

json.dumps({'success': True, 'data': celldict.values()})

You'll have to add the Week key to the celldict dictionaries first:

for d in celldict.itervalues():
    celldict['Week'] = '1238'

or use create a copy of each dict on-the-fly:

json.dumps({'success': True, 'data': [dict(d, Week='1238') for d in celldict.values()]})

The latter method, with some indentation, produces:

>>> print json.dumps({'success': True, 'data': [dict(d, Week='1238') for d in celldict.values()]}, indent=4)
{
    "data": [
        {
            "OUT3FA_5": 24, 
            "Week": "1238", 
            "Total_IN1": 22, 
            "IN1": 59
        }, 
        {
            "OUT3FA_5": 12, 
            "Week": "1238", 
            "Total_IN1": 37, 
            "IN1": 37
        }
    ], 
    "success": true
}

Reading between the lines, it seems as if the 1224 and 1225 keys in your input example are actually the week numbers you are referring to. If so, they are easily incorporated:

json.dumps({'success': True, 'data': [dict(d, Week=k) for k, d in celldict.iteritems()]})

would produce:

{
    "data": [
        {
            "OUT3FA_5": 24, 
            "Week": "1225", 
            "Total_IN1": 22, 
            "IN1": 59
        }, 
        {
            "OUT3FA_5": 12, 
            "Week": "1224", 
            "Total_IN1": 37, 
            "IN1": 37
        }
    ], 
    "success": true
}

Upvotes: 9

elbows
elbows

Reputation: 219

The json module follows the structure of your data, so to get your desired output you'll have to rearrange the data. You could construct a new dictionary like this:

data = []
for week, values in celldict.iteritems():
  v2 = copy.copy(values)
  v2['week'] = week
  data.push(v2)
newdict = { 'success' : true,
            'data' : data }
json.dumps(newdict)

(Disclaimer: I didn't test this code, but it should give you the basic idea at least)

Upvotes: 0

Related Questions