将Python输出格式化为JSON

3

我已经写了一个Python脚本,将一个数据结构(我称其为"celldict"的字典)以Json格式输出。以下是其中的一小部分:

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

但是我想要的是像这样的东西:
{
    "success": true,
    "data": [
        {
            "Week":"1224",
            "OUT3FA_5": 65,
            "IN1": 85,
            "Total_IN1": 100
        },
        {
            "Week":"1225",
            "OUT3FA_5": 30,
            "IN1": 40,
            "Total_IN1": 120
        }
    ]
}

有没有一种方法可以使用Python格式化JSON输出,以获得我想要的结果? 我执行以下操作:
print json.dumps(celldict)

希望能够得到我的输出结果。 非常感谢您的任何帮助。

2个回答

9

只需将celldict放入另一个字典中:

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

首先,您需要在celldict字典中添加Week键:

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

或者动态创建每个字典的副本:
json.dumps({'success': True, 'data': [dict(d, Week='1238') for d in celldict.values()]})

后一种方法会有一些缩进,并产生以下结果:
>>> 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
}

从字里行间看,你输入的示例中的 12241225 键似乎是指你所提到的周数。如果是这样,它们很容易被整合进去:

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

会生成:

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

谢谢!那么我想添加的“Week”字符串呢?你看,我需要在我的字典中的每个键(由数字值1224和1225表示)之前放置“Week”。 - salamey
@user1734229:你可以很容易地通过更新celldict中的字典来添加它们,对吧? - Martijn Pieters
是的,这很棒!但在我接受你的答案之前,我看到你在“week”中放了1238,而我想获得每周的数据(假设我有很多周),我该如何访问字典的键并将它们分配给“Week=”? - salamey
@user1734229:那么请在您的celldict结构中首先包含周数。我们无法自行猜测该数据来自何处。 :-) 乍一看,我猜celldict[first_column_cell]['Week'] = weeknumber可能是您要寻找的内容。 - Martijn Pieters
@user1734229:等一下,你是不是指first_column_cell的值是周数?因此,在你的输入示例中出现了12241225这些数字?那么请在你的问题中明确说明。你的输出使用了完全不同的数字,所以我们无法猜测它们之间的关联。 - Martijn Pieters
显示剩余3条评论

0

json模块遵循数据的结构,因此为了获得所需的输出,您需要重新排列数据。您可以像这样构建一个新字典:

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)

(免责声明:我没有测试过这段代码,但至少它应该给你基本的思路)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接