format python output to json

18,840

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
}
Share:
18,840
salamey
Author by

salamey

Updated on June 04, 2022

Comments

  • salamey
    salamey almost 2 years

    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.

  • salamey
    salamey over 11 years
    Thanks! And what about the "Week" string that I would like to add too? You see what I need is to put "Week" before every key (represented by the numeric values 1224 and 1225) of my dict.
  • Martijn Pieters
    Martijn Pieters over 11 years
    @user1734229: You can add those yourself by updating the dictionaries in celldict easily enough, right?
  • salamey
    salamey over 11 years
    Yes this is great! But before I accept your answer, I see you've put 1238 in week while I want to get each week (suppose I have many weeks), how can I access dict's keys and assign them to Week= ?
  • Martijn Pieters
    Martijn Pieters over 11 years
    @user1734229: What is the weeknumber based on? How do you determine it? I hardcoded the value because you didn't provide any information about how you determine that number. It's easy enough to set different numbers for each entry, if there is a rule to follow.
  • salamey
    salamey over 11 years
    Well this structure actually comes from an Excel file, I iterate through it using the xlrd library, my first column contains all the weeks and my second column contains the other data. What I do is I calculate for each week value, the number of times "IN1" "OUT3FA_5" occurs (it's just summing basically). And that's what gives me the first structure. I do this : celldict[first_column_cell][second_column_cell] += 1
  • Martijn Pieters
    Martijn Pieters over 11 years
    @user1734229: then include the weeknumber in your celldict structure in the first place. We cannot guess where that data comes from by ourselves. :-) At a glance, I guess celldict[first_column_cell]['Week'] = weeknumber would be what you are looking for.
  • Martijn Pieters
    Martijn Pieters over 11 years
    @user1734229: Wait a sec, did you perhaps mean that the first_column_cell values are the week numbers? Thus the 1224 and 1225 numbers in your input example here? Then make that clear in your question. Your output uses totally different numbers, so there is no correlation for us to guess at there.
  • salamey
    salamey over 11 years
    I am really sorry I didn't notice my mistake, I corrected my output. Thank you so much for helping me all the way.