格式化dicts和嵌套dicts

时间:2016-11-20 04:13:43

标签: python dictionary boto3

亚马逊的DynamoDB在将项目插入数据库时​​需要特殊格式的JSON。

我有一个函数,它接受一个字典并将值转换为一个格式化插入的嵌套dict;该值被转换为嵌套的dict,其中嵌套的键是值的数据类型。

例如,{'id':1, 'firstName':'joe'}之类的输入会转换为{'id': {'N':1}, 'firstName': {'S':'joe'}}

此功能目前已成功:

type_map = {
        str:'S', unicode:'S', dict:'M',
        float:'N', int:'N', bool:'BOOL'
        }

def format_row(self, row):
    """ Accepts a dict, formats for DynamoDB insertion. """

    formatted = {}
    for k,v in row.iteritems():
        type_dict = {}
        type_dict[ self.type_map[type(v)] ] = v
        formatted[k] = type_dict

    return formatted

我需要修改此函数来处理可能是dicts的值。

所以,例如:

 {
 'id':1, 
 'a':{'x':'hey', 'y':1}, 
 'b':{'x':1}
 }

应该转变为:

 {
 'id': {'N':1}, 
 'a':{'M': {'x': {'S':'hey'}, 'y':{'N':1}}}, 
 'b': {'M': {'x': {'N':1}}}
 }

我认为正确的方法是从函数内调用函数吗?

注意:我正在使用Python 2.7

1 个答案:

答案 0 :(得分:1)

最终为我工作的是以下功能:

def format_row(self, row):
    """ Accepts a dict, formats for DynamoDB insertion. """

    formatted = {}
    for k,v in row.iteritems():
        if type(v) == dict:
            v = self.format_row(v)
            type_dict = {}
            type_dict['M'] = v
            formatted[k] = type_dict
        else: 
            type_dict = {}
            type_dict[ self.type_map[type(v)] ] = v
            formatted[k] = type_dict
    return formatted

如果有人有更好的方法,请告诉我们!